Hyper-Threading: Optimierungen und Fallen

Nichts ist sicher

Was sich zunächst einfach anhört, führt in der Praxis mitunter zum kompletten "Absturz" des Programms. Wenn Thread 1 auf Daten von Thread 2 wartet, Thread 2 aber seinerseits auf Daten von Thread 1, dann kommt es zum gefürchteten Deadlock. Besonders hinterhältig ist, dass man ohne entsprechende Vorkehrungen keine Annahme über den zeitlichen Ablauf der Threads treffen darf.

Auch wenn etwa Thread 1 viel weniger Daten zu bearbeiten hat als Thread 2 ist nicht sicher, dass er vor Thread 2 fertig wird. Denn das Betriebssystem unterbricht die Threads je nach Bedarf, um anderen Programmen auch Rechenzeit zur Verfügung zu stellen. Ein nicht sauber synchronisiertes Programm, das hundert Mal stabil gelaufen ist, kann plötzlich hängen, weil externe Ereignisse die zeitliche Abfolge verschoben haben.

Durch Intels Hyper-Threading wird die Sache nun noch komplizierter. Denn viele Programme, die multithreaded arbeiten, sind bislang nie in einer Multiprozessor-Umgebung gelaufen. Der Thread-Ansatz dient hier vor allem dazu, verschiedene Teile der Software unabhängig reaktionsfähig zu halten. Ansonsten könnte etwa eine offene Dialogbox den Datenverkehr des Programms im Hintergrund blockieren.

Eine normale CPU kann jedoch immer nur einen Code-Block zu einer Zeit bearbeiten, die Parallelität erzeugt de facto das Betriebssystem, indem es jedem Thread kurze Zeitscheiben zuteilt. Bei Hyper-Threading-CPUs gibt es aber eine echte parallele Abarbeitung von Code. Daher kann beispielsweise tatsächlich ein gleichzeitiger Zugriff auf eine Variable stattfinden. Wie auf den folgenden Seiten beschrieben ist, kann dies katastrophale Folgen haben.

Die Katastrophe zu verhindern, ist Aufgabe des Programmierers. Dazu stellt ihm das Betriebssystem etliche Bordmittel bereit, andere kann er sich selbst bauen. Im Folgenden werden diese speziell hinsichtlich Hyper-Threading untersucht und einige Gefahren aufgezeigt. Denn bei Hyper-Threading muss man sich von einigen gängigen Annahmen trennen, die falsch waren, auf Single-CPU-Systemen aber keine Auswirkung hatten.