Wie viel Speedup bringt ein Hyper-Thread? (in der Theorie)

38

Ich frage mich, was die theoretische Beschleunigung von Hyper-Threaded-CPUs ist. Bei einer angenommenen Parallelisierung von 100% und einer Kommunikation von 0 würden zwei CPUs eine Beschleunigung von 2 ergeben. Was ist mit einer Hyper-Thread-CPU?

Mikhail
quelle

Antworten:

59

Wie andere gesagt haben, hängt dies ganz von der Aufgabe ab.

Schauen wir uns zur Veranschaulichung einen tatsächlichen Benchmark an:

Bildbeschreibung hier eingeben

Dies stammt aus meiner Masterarbeit (derzeit nicht online verfügbar).

Dies zeigt die relative Geschwindigkeit 1 von String-Matching-Algorithmen (jede Farbe ist ein anderer Algorithmus). Die Algorithmen wurden auf zwei Intel Xeon X5550 Quad-Core-Prozessoren mit Hyperthreading ausgeführt. Mit anderen Worten: Es gab insgesamt 8 Kerne, von denen jeder zwei Hardware-Threads (= „Hyperthreads“) ausführen kann. Daher testet der Benchmark die Beschleunigung mit bis zu 16 Threads (dies ist die maximale Anzahl gleichzeitiger Threads, die diese Konfiguration ausführen kann).

Zwei der vier Algorithmen (blau und grau) skalieren mehr oder weniger linear über den gesamten Bereich. Das heißt, es profitiert vom Hyperthreading.

Zwei andere Algorithmen (in Rot und Grün; unglückliche Wahl für farbenblinde Menschen) skalieren linear für bis zu 8 Threads. Danach stagnieren sie. Dies zeigt deutlich, dass diese Algorithmen nicht vom Hyperthreading profitieren.

Der Grund? In diesem speziellen Fall ist es Speicherlast; Die ersten beiden Algorithmen benötigen mehr Speicher für die Berechnung und werden durch die Leistung des Hauptspeicherbusses eingeschränkt. Dies bedeutet, dass ein Hardwarethread auf Speicher wartet und der andere die Ausführung fortsetzen kann. Ein erstklassiger Anwendungsfall für Hardware-Threads.

Die anderen Algorithmen benötigen weniger Speicher und müssen nicht auf den Bus warten. Sie sind fast vollständig rechengebunden und verwenden nur Ganzzahlarithmetik (tatsächlich Bitoperationen). Daher gibt es kein Potenzial für eine parallele Ausführung und keinen Nutzen aus parallelen Anweisungs-Pipelines.


1 Dh ein Beschleunigungsfaktor von 4 bedeutet, dass der Algorithmus viermal so schnell ausgeführt wird, als würde er mit nur einem Thread ausgeführt. Per Definition hat jeder Algorithmus, der auf einem Thread ausgeführt wird, einen relativen Beschleunigungsfaktor von 1.

Konrad Rudolph
quelle
Beste Antwort :-)
Sklivvz
1
Was sind die tatsächlichen Geschwindigkeiten der Algorithmen, aufgetragen gegen die Anzahl der Kerne? Dh was ist der Geschwindigkeitsgewinn für den schnellsten Algorithmus in diesen Tests? Ich frage mich nur :).
crazy2be
@ crazy2be Für die blaue Linie ( Horspools Algorithmus ) geht die Laufzeit mit 16 Threads von 4,16 Sekunden auf 0,35 Sekunden zurück. Die Beschleunigung beträgt also 11,74. Das ist jedoch mit Hyper-Threading. In Abhängigkeit von der Anzahl der Kerne beträgt die Geschwindigkeit dieses Algorithmus 7,17 für 8 Kerne.
Konrad Rudolph
5
Das einzige Problem mit dieser Antwort ist, dass ich sie nur einmal positiv bewerten kann. Es ist eine erstaunlich objektive Antwort auf eine subjektive Frage;)
Geselle Geek
20

Das Problem ist, es hängt von der Aufgabe ab.

Die Idee hinter Hyperthreading ist im Grunde, dass alle modernen CPUs mehr als ein Ausführungsproblem haben. Normalerweise näher an einem Dutzend oder so. Geteilt zwischen Integer, Floating Point, SSE / MMX / Streaming (wie auch immer es heute heißt).

Zusätzlich hat jede Einheit unterschiedliche Geschwindigkeiten. Das heißt, es kann ein ganzzahliger mathematischer Einheits-3-Zyklus dauern, um etwas zu verarbeiten, aber eine 64-Bit-Gleitkommadivision kann 7 Zyklen dauern. (Dies sind mythische Zahlen, die auf nichts basieren.)

Die Ausführung bei Nichtbeachtung hilft dabei, die verschiedenen Einheiten so voll wie möglich zu halten.

Jede einzelne Task wird jedoch nicht jeden Moment jede einzelne Ausführungseinheit verwenden. Auch das Teilen von Threads kann nicht ganz helfen.

Die Theorie geht also davon aus, dass es eine zweite CPU gibt, auf der ein anderer Thread ausgeführt werden könnte, und zwar unter Verwendung der verfügbaren Ausführungseinheiten, die nicht verwendet werden, z Leerlauf bis auf ein paar Sachen.

Für mich ist dies in einer einzelnen CPU-Welt sinnvoller, da durch das Ausfiltern einer zweiten CPU Threads diese Schwelle mit wenig (wenn überhaupt) zusätzlicher Codierung leichter überschreiten können, um diese gefälschte zweite CPU zu handhaben.

Hilft es in der 3/4/6/8 Kernwelt, 6/8/12/16 CPUs zu haben? Keine Ahnung. So viel? Kommt auf die anstehenden Aufgaben an.

Um Ihre Fragen tatsächlich zu beantworten, hängt es von den Aufgaben in Ihrem Prozess ab, welche Ausführungseinheiten er verwendet und in Ihrer CPU, welche Ausführungseinheiten im Leerlauf / unterbelegt sind und für diese zweite gefälschte CPU verfügbar sind.

Einige 'Klassen' von Computerkram sollen davon profitieren (undeutlich allgemein). Aber es gibt keine feste Regel und für einige Klassen verlangsamt es die Dinge.

geoffc
quelle
2
Obwohl ich nach etwas wie "1,7-facher Geschwindigkeitssteigerung" gesucht habe, ist diese Antwort sehr schön, da sie diesem Problem keinen Schwarz-Weiß-Look verleiht.
Mikhail
@Mikhail: Der Punkt ist, dass es keinen einfachen Faktor gibt - es kommt darauf an, wie oft im Leben :-).
sleske
4
Das Wesentliche ist richtig. Ein Problem: Es gibt keinen Grund von vornherein, warum ein einzelner Kern mehr vom Hyperthreading profitieren sollte als mehrere Kerne. Für die falsche Aufgabe profitieren weder. Für die richtige Aufgabe profitieren beide um den gleichen Faktor.
Konrad Rudolph
@Konrad: Ich denke, der Punkt, an dem ich ankam, ist, dass der Unterschied zwischen einem Kern und zwei Kernen wertvoller sein könnte als der Unterschied zwischen 4 und 8 oder 2 und 4. Dh, ein zweiter Kern könnte für eine App mit schlechtem Threading hilfreich sein ein bisschen mehr.
Geoffc
"Für eine App mit schlechtem Thread" - das ist das Wichtigste. Aber realistisch gesehen ist die Threading-Unterstützung der meisten Anwendungen schlecht, sodass Sie einen Punkt haben.
Konrad Rudolph
5

Ich habe einige anekdotische Beweise, die ich der Antwort von geoffc hinzufügen kann, da ich tatsächlich eine Core i7-CPU (4-Core) mit Hyperthreading habe und ein wenig mit Videotranscodierung gespielt habe, was eine Aufgabe ist, die viel Kommunikation und Synchronisation erfordert, aber genug hat Parallelität, mit der Sie ein System effektiv voll auslasten können.

Meine Erfahrung mit dem Spielen mit wie vielen CPUs der Aufgabe im Allgemeinen zugewiesen sind, unter Verwendung der 4 "zusätzlichen" Hyperthread-Kerne, was einem Äquivalent von ungefähr 1 zusätzlicher CPU-Rechenleistung entspricht. Die zusätzlichen 4 "Hyperthreaded" -Kerne fügten ungefähr die gleiche Menge an verwendbarer Verarbeitungsleistung hinzu, wie es bei 3 bis 4 "echten" Kernen der Fall ist.

Zugegeben, dies ist nicht unbedingt ein fairer Test, da alle Codierungsthreads wahrscheinlich um die gleichen Ressourcen in den CPUs konkurrieren würden, aber für mich zeigte sich zumindest eine geringfügige Steigerung der Gesamtprozessorkapazität.

Die einzige echte Möglichkeit, um zu zeigen, ob es wirklich hilft oder nicht, besteht darin, auf einem System mit aktiviertem und deaktiviertem Hyperthreading mehrere verschiedene Tests vom Typ Integer / Floating Point / SSE gleichzeitig durchzuführen und zu prüfen, wie viel Rechenleistung in einem Controlled verfügbar ist Umgebung.

Mokubai
quelle
1
Nun, ein klarer Punkt - es ist anwendungsabhängig. Ich bin sicher, dass High-Communication-Computing beschleunigt werden könnte, da Core 0 und Core 0-h über denselben Cache kommunizieren würden, ohne langsamen RAM zu verwenden.
Mikhail
1
@Mikhail, dann ist das Problem, dass beide Threads, wenn sie eine große Menge an Rechenleistung benötigen, um die gleichen Ressourcen konkurrieren und besser über den gemeinsam genutzten L3-Cache der CPUs kommunizieren (der i7 verfügt über L1- und L2-Cache) pro Kern und einem gemeinsam genutzten L3-Cache) oder sogar Systemspeicher und erledigen ihre Aufgaben separat. Es ist alles eine gewaltige Übung mit Kreisverkehren ...
Mokubai
3

Es hängt sehr von der CPU und der Arbeitslast ab, wie andere gesagt haben.

Intel sagt :

Die gemessene Leistung des Intel® Xeon® MP-Prozessors mit Hyper-Threading-Technologie zeigt einen Leistungszuwachs von bis zu 30% bei herkömmlichen Serveranwendungs-Benchmarks für diese Technologie

(Dies scheint mir ein bisschen konservativ.)

Und es gibt noch eine längere Zeitung (von der ich noch nicht alles gelesen habe) mit mehr Zahlen hier . Eine interessante Mitnehmen aus diesem Papier ist , dass Hyper - Threading dünnt machen kann langsamer für einige Aufgaben.

Die Bulldozer-Architektur von AMD könnte interessant sein . Sie beschreiben jeden Kern als effektiv 1,5 Kerne. Es ist eine Art extremes Hyperthreading oder Multicore-Substandard, je nachdem, wie sicher Sie von der wahrscheinlichen Leistung sind. Die Zahlen in diesem Stück deuten auf eine Beschleunigung des Kommentars zwischen dem 0,5-fachen und dem 1,5-fachen hin.

Schließlich ist die Leistung auch vom Betriebssystem abhängig. Das Betriebssystem sendet hoffentlich Prozesse an echte CPUs, anstatt die Hyperthreads zu verwenden, die sich lediglich als CPUs tarnen. Andernfalls kann es in einem Dual-Core-System vorkommen, dass eine CPU im Leerlauf und ein stark ausgelasteter Kern mit zwei Threads vorhanden sind. Ich scheine mich daran zu erinnern, dass dies mit Windows 2000 geschehen ist, obwohl natürlich alle modernen Betriebssysteme in der Lage sind, dies zu tun.

Stephen Darlington
quelle
1
Das Betriebssystem muss sicherstellen, dass sich die Threads nicht gegenseitig blockieren :)
Mikhail