Hyper-Threading: Optimierungen und Fallen

Auch Optimieren hilft nicht

Greift man beim Compiler zu Intel, sieht der erzeugte Code schon etwas freundlicher aus. Hier wird iLoops tatsächlich mit einem einzigen Befehl inkrementiert, so dass dieser Zugriff - vordergründig gedacht - sicher sein sollte. Wie man aber auch sieht, gilt dies schon für Integer in einem Array nicht mehr. Das Update einer Array-Variablen zerlegt der Compiler in fünf Befehle. Die CPU berechnet die Adresse, lädt die Variable in ein Register, erhöht dieses und schreibt die Variable dann zurück. Diese Kombination ist auf jeden Fall unsicher. Da in unserem Beispiel aber jeder Thread nur auf seine eigene Array-Variable zugreift, kann an dieser Stelle nichts schief laufen.

Doch der oben abgebildete Code verzählt sich dennoch auf Hyper-Threading-Systemen. Denn innerhalb der CPU durchläuft der Inc-Befehl die einzelnen Pipelinestufen und wird in einzelne Schritte zerlegt: Wert holen, inkrementieren und abspeichern. Greift ein anderer Thread der virtuellen zweiten CPU auf eine Variable zu, solange diese sich noch in der Pipeline der ersten CPU befindet und noch nicht zurückgeschrieben ist, tritt ein Rechenfehler auf.