Multicore und Synchronisation

In einem Array von Zählern je Thread wie „long cnt[8];“ tritt False Sharing auf. Welche Gegenmaßnahme ist am besten geeignet?

  1. ADen Zählertyp von long auf int ändern und das Array verkleinern
  2. BZwischen den Zählern Füllbytes einfügen oder sie ausrichten, sodass sie in verschiedenen Cache-Zeilen liegen
  3. CDie Zahl der Threads erhöhen, um die Wartezeiten zu verteilen
Antwort und Erläuterung anzeigen

Antwort: B. Zwischen den Zählern Füllbytes einfügen oder sie ausrichten, sodass sie in verschiedenen Cache-Zeilen liegen

Bei 8 Byte großem long passen die 8 Zähler in eine Zeile von 64 Byte, und alle Threads streiten um dieselbe Zeile. Fügt man Füllbytes ein, sodass jeder Zähler auf einer 64-Byte-Grenze liegt, oder richtet man die Struktur an der Größe der Cache-Zeile aus, kann jeder Thread eine eigene Zeile nutzen. Wirksam ist auch, dass jeder Thread in einer lokalen Variablen zählt und erst am Ende einmal auf den gemeinsamen Speicherplatz addiert.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Welche Aussage zu einem Data Race (Datenwettlauf) ist richtig?
  2. Wird der obige Code gleichzeitig in zwei Threads ausgeführt, kann der Endwert von counter kleiner als 200000 sein. Welcher Grund ist richtig?
  3. Welche Aussage zu atomaren Befehlen (unteilbaren Befehlen) ist richtig?
  4. Wie arbeitet der atomare Befehl CAS (Compare-and-Swap)?
  5. Der obige Code verdoppelt die gemeinsame Variable counter mit CAS(&p, erwarteter Wert, neuer Wert). Wann schlägt CAS fehl und die Schleife wird wiederholt?

Vergleiche zu diesem Thema