2012-04-13 4 views
6

Wenn verschiedene Variablen innerhalb der gleichen Cache-Zeile sind, können Sie False Sharing erleben, was bedeutet, dass, selbst wenn zwei verschiedene Threads (auf verschiedenen Kernen ausgeführt wird) werden zwei unterschiedliche Variablen zugreifen, wenn diese beiden Variablen in der residieren gleiche Cachelinie, Sie werden Leistungshit haben, da jedes Mal Cachekohärenz ausgelöst wird.False Sharing und Atomic Variablen

sagen nun diese Variablen atomare Variablen (durch Atom I Variablen bedeuten, die einen Speicher Zaun, wie die atomic<t> von C++ vorstellen) Materie gibt, wird False Sharing, oder es spielt keine Rolle, ob Atom Variablen im gleichen Cache sind Linie oder nicht, wie sie angeblich Cachekohärenz sowieso einführen werden. Mit anderen Worten: Werden atomare Variablen in dieselbe Cachezeile eingefügt, wird die Anwendung langsamer, als wenn sie nicht in derselben Cachezeile gespeichert werden.

Antwort

5

Eine Klarstellung: für negative Folgen zumindest greift einige auf „fälschlicherweise geteilt“ Variablen schreibt sein sollte. Wenn Schreibvorgänge selten sind, ist der Leistungseinfluss von falschem Teilen eher vernachlässigbar; Je mehr schreibt (und so Cache-Zeile ungültig machen Nachrichten) die schlechtere Leistung.

Auch bei Atomics spielt die Cache-Zeilenfreigabe (entweder falsch oder wahr) immer noch eine Rolle. Suchen Sie nach einigen Beweisen hier: http://www.1024cores.net/home/lock-free-algorithms/first-things-first. Daher lautet die Antwort: Ja, die Platzierung von atomaren Variablen, die von verschiedenen Threads verwendet werden, auf dieselbe Cachezeile kann die Anwendung langsamer machen, als wenn sie auf zwei verschiedene Zeilen platziert werden. Ich denke jedoch, dass es meistens unbemerkt bleibt, es sei denn, die App verbringt einen erheblichen Teil ihrer Zeit damit, diese atomaren Variablen zu aktualisieren.

0

wird Putting Atom Variablen in der gleichen Cache-Zeile langsame Anwendung als sie nicht in der gleichen Cache-Zeile setzen?

falsche gemeinsame Nutzung von „atomaren“ Variablen konnte führen zu Leistungsproblemen (ob es wird führen, um solche Probleme auf eine Menge Dinge abhängt).

Nehmen wir an, Sie haben zwei Kerne, A und B, und jede arbeitet auf einer eigenen Variablen. Nennen wir diese Variablen a bzw. b.

Aa hat in seinem Cache und Bb hat in seinem Cache.

Überlegen Sie, was, wenn A Schritten a passiert.

  • wenn a und b eine Cache-Zeile teilen,B ‚s Kopie b erhalten für ungültig erklärt, und seine nächsten Zugriff auf b einen Cache-Miss entstehen.
  • wenn a und b keine Cache-Zeile teilen, gibt es keine Auswirkungen auf B bis zu seiner Cache-Kopie b betroffen ist.

Dies geschieht unabhängig davon, ob a und b "atomare" sind.

0

Wenn Sie atomare Variablen mit den stärksten Konsistenzanforderungen nutzen, eine vollständige Speicher Barriere, wird der Effekt der falschen Teilung wahrscheinlich nicht auffallen.Für einen solchen Zugriff ist die Leistung einer atomaren Operation grundsätzlich durch die Speicherzugriffslatenz begrenzt. Also sind die Dinge sowieso langsam, ich glaube nicht, dass sie in Gegenwart von falschem Teilen viel langsamer werden würden.

Wenn Sie andere weniger aufdringliche Speicherreihenfolgen haben, kann die von den Atomics selbst getroffene Leistung geringer sein, und daher kann die Auswirkung von falschem Teilen erheblich sein.

Insgesamt würde ich zuerst die Leistung der atomaren Operation selbst betrachten, bevor ich mich über die falsche Freigabe für solche Operationen Sorgen mache.