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?
- ADen Zählertyp von long auf int ändern und das Array verkleinern
- BZwischen den Zählern Füllbytes einfügen oder sie ausrichten, sodass sie in verschiedenen Cache-Zeilen liegen
- 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.