Hyper-Threading: Optimierungen und Fallen

Optimal mit Pause

Gerade bei sehr kurzen Aufgaben zahlt sich eine aufwendige Synchronisation nicht aus. Zumindest wenn eine zweite CPU zur Verfügung steht, ist es besser, diese mit "voller Kraft" warten zu lassen. Allerdings steht bei Hyper-Treading ja nicht wirklich eine zweite CPU bereit. Intern müssen sich die zwei virtuellen CPUs Ressourcen teilen, so dass die wartende CPU die aktive deutlich ausbremst.

Deshalb hat Intel mit Hyper-Threading auch den neuen Befehl "Pause" eingeführt. Die Instruktion mit dem Op-Code F3 90 hält dabei die Ausführungseinheit des Prozessors für ein paar Takte an. Während dieser Zeit kann die zweite CPU in einem Hyper-Threading-Prozessor alle Ressourcen allein für sich nutzen. Nach ein paar Takten nimmt dann die pausierende Pipeline ihre Tätigkeit wieder auf. Da sich dabei der CPU-Status in keiner Weise ändert, geschieht dies, ohne dass etwa ein Betriebssystem etwas davon bemerkt.

Der Warteschleifenbefehl "Pause" existiert erst seit dem Pentium 4. Allerdings kann er auch bei Software für andere CPUs bedenkenlos eingesetzt werden. Diese interpretieren ihn als NOP (no operation).

Durch die kurzfristige Entlastung der Pipeline vom sinnlosen Warten legt unser Pentium 4 3,06 GHz mit Hyper-Threading noch einmal kräftig zu. Statt 8,6 Millionen Loops mit leerer Warteschleife schafft er nun 51 Millionen. Ohne Hyper-Threading bleibt das Ergebnis auf dem Wert des ersten Versuchs: elf Loops pro Sekunde.