Hyper-Threading-Benchmarks

Probleme durch die Cacheline

Zwei weitere Fallstricke beim Programmieren für HT-Prozessoren sind im Cache-Management der Intel-CPU begründet. Die kleinste Speichereinheit, die die CPU beim Cache verwaltet, ist eine Cacheline. Beim Pentium 4 beträgt deren Größe 64 Byte für den L1- und 128 Byte für den L2-Cache.

Benutzen zwei Threads verschiedene globale Variablen oder Variablen des übergeordneten Threads, können diese mitunter in einer Cacheline liegen. Solange mehrere logische CPUs nur lesend auf die verschiedenen Variablen innerhalb einer Cacheline zugreifen, entsteht kein Problem. Hier ist die Paarung sogar von Vorteil, da die Daten beim ersten Zugriff des zweiten Threads bereits im schnellen Cache liegen.

Sobald aber ein Thread eine der Variablen ändert, beansprucht er die komplette Cacheline zeitweise exklusiv. Dadurch blockiert er den Zugriff auf alle anderen Variablen in dieser Line für eine relativ lange Zeit und bringt die zweite logische CPU damit zum Stoppen.

Programmtechnisch sollte man daher Variablen, die sich häufig ändern, als lokale Variablen deklarieren oder mit einer lokalen Kopie arbeiten. Ist dies nicht möglich, kann man die Variable künstlich etwa durch ein Array auf eine Größe von 128 Byte aufblähen und mit _decspec (align 128)) auf den Anfang einer Cacheline legen. Dadurch belegt sie die Line exklusiv und kann nicht mit anderen Variablen kollidieren.