Intels Pentium 4 Prescott im Detail

Thread-Synchronisation in Hardware

Einige Optimierungen beim Prescott machen sich nur beim intensiven Hyper-Threading bemerkbar. So hat Intel die Anzahl der ausstehenden L1-Cache-Loads von vier auf acht und die Größe einiger interner Buffer erhöht. Für einen einzelnen Thread war zwar die Dimensionierung beim Northwood passender, bei zwei parallel laufenden Hyper-Threading-Threads kam es aber mitunter zu Engpässen.

Eine echte technische Neuerung beim Prescott Instruction Set stellt die Thread-Synchronisation in Hardware über die Befehle MONITOR und MWAIT dar. Damit kann man eine Pipeline einer Hyper-Threading-CPU schlafen legen, bis die andere Pipeline einen Schreibzugriff auf eine vorher definierte Speicherstelle ausführt. So können sich zwei Threads mit sehr hoher Geschwindigkeit synchronisieren, ohne dafür CPU-Leistung zu verschwenden.

Wie in unserem Beitrag Hyper-Threading: Optimierungen und Fallen detailliert erläutert, ist es bislang problematisch, zwei Threads ohne aufwendige Betriebssystemfunktionen schnell miteinander zu synchronisieren. Bisher nutzt man für die direkte und schnelle Synchronisation - wenn beispielsweise ein Thread warten muss, bis ein anderer eine kritische Aufgabe abgeschlossen hat - folgenden Ansatz:

Beide Threads erhalten Zugriff auf eine gemeinsame Variable. Der wartende Thread läuft in einer Schleife und überprüft ständig den Wert dieser Variablen. Ist der effektive arbeitende Thread fertig, verändert er den Wert der Variablen. Da-raufhin verlässt der wartende Thread seine Verzögerungsschleife und beginnt wieder, sinnvoll zu arbeiten. Während der Wartezeit hat allerdings der erste Thread jede Menge an CPU-Leistung nur damit verheizt, mit Gigahertz-Geschwindigkeit sinnlose Warteschleifen zu drehen - und hat den sinnvoll arbeitenden Thread dadurch ausgebremst. Mit dem Northwood hat Intel zwar den neuen PAUSE-Befehl eingeführt, der den Verbrauch an CPU-Ressourcen in der Warteschleife lindert, doch ideal war dies immer noch nicht.

Prescott ermöglicht nun zusätzlich einen weiteren Weg und bietet durch den neuen Befehl MONITOR erstmals einen Hardware-Trigger für die Synchronisation. Mit MONITOR legt ein Thread eine Speicheradresse fest, die der Prozessor in Hardware überwacht - ohne Rechenleistung dafür zu verbrauchen. Anschließend legt sich der Thread mit MWAIT schlafen und gibt alle CPU-Ressourcen für andere Threads frei. Sobald jedoch ein aktiver Thread auf die vorher festgelegte Adresse schreibend zugreift, schaltet die CPU wieder in den Hyper-Threading-Modus, und der schlafende Thread erwacht zu neuem Leben - ohne in seiner Ruhepause Ressourcen verbraucht zu haben.

triger=0;
If (!trigger){
EAX=&trigger
ECX=0
EDX=0
MONITOR EAX, ECX, EDX
if (!trigger){
EAX=0
ECX=0
MWAIT EAX, ECX
}
}

Im Beispiel übergibt MONITOR die Adresse der Steuervariablen "trigger" in EAX an die CPU. Anschließend legt MWAIT die Pipeline so lange schlafen, bis ein parallel laufender Thread "trigger" verändert.

Prescott lässt bei MONITOR derzeit keine weiteren Optionen zu. Doch bereits jetzt sind mit ECX und EDX zwei Register spezifiziert, in denen Programmierer zukünftigen Prozessoren erweiterte Parameter übergeben können. Möglich ist hier etwa die Angabe eines Stromsparmodus oder die Trigger-Auslösung nur unter bestimmten Zusatzbedingungen. Auch soll in Zukunft die Größe des Monitorblocks variabel sein, so dass der Zugriff auf verschiedene Variablen den Dornröschenschlaf beenden kann.