Ich möchte die folgende Struktur in golang von diesem linkSeltsame Code zur Verhinderung falscher Sharing
// Local per-P Pool appendix.
57 type poolLocal struct {
58 private interface{} // Can be used only by the respective P.
59 shared []interface{} // Can be used by any P.
60 Mutex // Protects shared.
61 pad [128]byte // Prevents false sharing.
62 }
Die obige Struktur nur ein Thread zugegriffen werden kann, zu einer Zeit, diskutieren, wie Mutex verwendet wird. Der Coder sperrt die Struktur am Anfang eines Threads und entsperrt sie, wenn der Thread fertig ist. Der Speicher wird also nicht zwischen Threads geteilt. So nicht mehr als ein Kern wird Zugriff auf den Speicher haben. Also, nach meinem Verständnis, falsche Freigabe kann nicht passieren hier. Wenn falsches Teilen nicht passieren kann, warum puffert der Codierer die Struktur mit zusätzlichen Bytes (Pad [128] Byte)? Ist mein Verständnis falsch?
Ja, Ihr Verständnis ist expliziter sein falsch: "False Sharing" hat nichts damit zu tun, dass mehrere Threads auf denselben Speicher zugreifen (Race Condition wenn man schreibt), aber mit Prozessor Cache Zeilen: Einfach googlen nach "false sharing": – Volker
@Volker Thabk you. Ich habe verstanden. Lass mich geklärt werden. Es seien zwei Threads t1 und t2, die auf den Kernen C1 und C2 laufen. Lassen Sie t1 zuerst laufen (jetzt wartet t2, da es eine stummgeschaltete Sperre gibt). Lassen Sie t1 Daten in den L1-Cache von c1 schreiben (die Cache-Zeile, die unsere Struktur speichert). Jetzt ist t2 in C2 bereit. Der L2-Cache in C2 muss jedoch (nach MESI-Protokoll) auf die neuen Werte aktualisiert werden. Danach kann t2 mit seiner Aufgabe fortfahren. Hier findet die falsche Freigabe statt. Hab ich recht? – user3219492
Beim Auffüllen wird jedem Thread eine Cache-Zeile in L1 zugewiesen, die auf unterschiedliche Speicherpositionen in L2 oder höher verweist. Da jeder Thread an verschiedenen Speicherorten arbeitet, werden sie nicht gemeinsam genutzt und daher auch kein MESI und keine falsche Freigabe. Hab ich recht? – user3219492