Ich habe eine Multithread-App geschrieben, um die Geschwindigkeit von LOCK CMPXCHG (x86 ASM) zu messen.
Auf meinem Rechner (Dual Core - Core 2), mit 2 laufenden Threads und Zugriff auf dieselbe Variable, kann ich ca. 40M Ops / Sekunde ausführen.
Dann gab ich jedem Thread eine eindeutige Variable, mit der er arbeiten konnte. Offensichtlich bedeutet dies, dass es keine Sperrkonkurrenz zwischen den Threads gibt, also erwartete ich eine Geschwindigkeitsleistung. Die Geschwindigkeit änderte sich jedoch nicht. Warum?
Wenn Sie zwei Threads gleichzeitig auf Daten zugreifen, die sich auf der gleichen Cachezeile befinden, erhalten Sie false sharing , wobei jeder Kern seinen Cache aktualisieren muss, weil der gleiche Teil des Cache von der anderer Kern.
Stellen Sie sicher, dass die eindeutigen Variablen in verschiedenen Speicherblöcken zugewiesen sind (z. B. mindestens 128 Byte), um sicherzustellen, dass dies nicht das Problem ist, das Sie haben.
DDJ hat einen schönen Artikel, der die schrecklichen Auswirkungen von falschem Teilen beschreibt: Ссылка
Hier ist der Eintrag von Wikipedia: Ссылка
Tags und Links assembly x86 performance parallel-processing locking