Warum struct mit Padding-Feldern schneller arbeitet

8

Ich habe gerade diese Bibliothek gefunden, die einen Lock-Free-Ring bietet, der viel schneller funktioniert als Channels: Ссылка (und es funktioniert wirklich schneller vor allem mit GOMAXPROCS & gt; 1)

Aber interessanter Teil ist struct zur Verwaltung des Warteschlangenstatus:

%Vor%

Wenn ich "paddingX [8] uint64" Felder lösche, arbeitet es ungefähr 20% langsamer. Wie es sein kann?

Auch zu schätzen, wenn jemand erklärt, warum dieser Lock-Free-Algorithmus viel schneller als Kanäle, sogar gepuffert?

    
Leonid Bugaev 16.10.2013, 07:39
quelle

2 Antworten

11

Padding eliminiert falsches Teilen , indem jede Struktur auf eine eigene Cache-Zeile gesetzt wird. Wenn sich zwei Variablen eine Cache-Zeile teilen, ist ein Lesen einer unmodifizierten Variablen genauso teuer wie ein Lesen einer modifizierten Variablen, wenn ein Intervenieren in die andere Variable stattfindet.

Wenn eine Variable auf mehreren Kernen gelesen und nicht geändert wird, wird die Cache-Zeile von den Kernen gemeinsam genutzt. Dies macht die Lese sehr günstig. Bevor ein Kern in einen Teil dieser Cache-Zeile schreiben kann, muss er die Cache-Zeile in anderen Kernen ungültig machen. Wenn irgendein Kern später von dieser Cache-Zeile liest, findet er die Cache-Zeile für ungültig erklärt und muss sie wieder freigeben. Dies führt zu einem zusätzlichen Cache-Kohärenz-Verkehr, wenn eine Variable häufig geändert wird und die andere häufig gelesen wird.

    
David Schwartz 16.10.2013, 07:44
quelle
3

Es funktioniert schneller, da es keine Sperren erfordert. Dies ist eine Implementierung in Java (genannt Disruptor), die wirklich gut funktioniert und die Inspiration für Gringo zu sein scheint. Sie erklären die Kosten von Sperren und wie Sie den Durchsatz hier erhöhen können.

Was die Polsterung betrifft, weist das Papier auch auf einige Gründe hin. Grundsätzlich: Prozessor-Caches. Dieses Dokument erklärt es gut. Sie können einen enormen Leistungszuwachs erzielen, indem Sie den Prozessor auf seinen Level-1-Cache zugreifen lassen, anstatt so oft wie möglich durch den Speicher oder seine äußeren Caches zu gehen. Dies erfordert jedoch zusätzliche Vorkehrungen, da der Prozessor seinen Cache vollständig lädt und ihn jedes Mal, wenn er benötigt wird, erneut lädt (aus Speicher- oder Level 2-3-Caches). Im Fall der gleichzeitigen Datenstruktur, wie @David Schwartz sagte, zwingt das falsche Teilen den Prozessor, seinen Cache viel öfter neu zu laden, da einige Daten in den Rest der Speicherzeile geladen, modifiziert und das Ganze erzwungen werden können Cache erneut geladen werden.

    
val 16.10.2013 07:50
quelle