Fun fact (eigentlich bissl offtopic, aber ich denke dennoch interessant in dem Zusammenhang):
Eigentlich ist Hyperthreading eine Mogelpackung
Oder sagen wir es so: 4 Kerne => 8 Threads ist eigentlich eine Falschaussage.
Früher (also so in den 80ern) gabs nur eine ALU (Arithmetisch-Logische-
Unit), also der eigentliche Rechenkern, und die arbeitete auf einem Registersatz - also der minimale Speicherbereich, wo die Daten und Arbeitsinstruktionen liegen, auf denen die ALU gerade im Moment arbeitet. Irgendwann kam dann die FPU (Floating Point
Unit), der damals so genannte Mathematische Coprozessor, dazu.
Multikernsysteme damals hatten dann mehrere ALU/FPU-Pakete mit jeweils einem Registersatz. Das ist das, was wir heute unter einem echten Rechenkern verstehen.
Das Problem dabei ist: Wenn Daten fehlen (noch nicht geladen sind) und aus einem der CPU-Caches (L1 - L3) oder gar dem Hauptspeicher oder noch schlimmer einer Festplatte geholt werden müssen, dann kann der Kern nicht rechnen. Weil es fehlen ja die Daten. Der Kern bleibt also stehen, bis die Daten geladen sind. Das kann je nach Ort der Daten (naher oder entfernter Cache, Hauptspeicher, lokale Platte, ggf. auch LAN oder WAN), viele viele CPU-Zyklen dauern. Und die sind verloren.
Auch bei einem Thread-Wechsel gehen viele CPU-Zyklen verloren, denn während der eine Thread von den Registern ausgelesen und zwischengespeichert wird, und der neue Thread auf die Register gelegt wird, kann der Kern nicht rechnen und steht.
Bei Intel haben sie sich überlegt, wie man diese Wartezeiten besser ausnutzen kann. Und deren Lösung bestand darin, einfach einen zweiten Registersatz neben den ersten zu packen. ALU & FPU rechnen also auf dem ersten Registersatz. In der Zwischenzeit kann schon ein zweiter Thread auf den zweiten Registersatz gelegt werden, während der Kern jedoch noch auf dem ersten Thread weiter arbeiten kann. Fehlen jetzt Daten auf dem ersten Thread, dann bleibt der Kern nicht einfach stehen, sondern er schaltet auf den zweiten Registersatz um, und während die Daten jetzt von wo auch immer her geholt werden kann der Kern auf dem anderen Thread weiter rechnen.
ABER: Der Kern kann zu einem Zeitpunkt immer nur einen Thread abarbeiten. Entweder den auf dem ersten Registersatz, oder den auf dem zweiten, aber nie beide gleichzeitig.
Nur die Umschaltzeiten sind eben auf einmal nahe bei null und daher können jedwede Wartezeiten auf Daten nahezu auf null reduziert werden, weil immer schon ein zweiter Thread parat steht und in den Wartezeiten ausgeführt werden kann.