Wie viel Beschleunigung gibt ein Hyper-Thread? (in der Theorie)

11179
Mikhail

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

34

4 Antworten auf die Frage

56
Konrad Rudolph

Wie andere bereits gesagt haben, hängt dies vollständig von der Aufgabe ab.

Um dies zu veranschaulichen, betrachten wir einen tatsächlichen Benchmark:

enter image description here

Dies wurde meiner Masterarbeit entnommen (derzeit nicht online verfügbar).

Dies zeigt die relative Beschleunigung 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 (dh der maximalen Anzahl gleichzeitiger Threads, die diese Konfiguration ausführen kann).

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

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

Der Grund? In diesem speziellen Fall ist es der Arbeitsspeicher. Die ersten beiden Algorithmen benötigen mehr Speicher für die Berechnung und sind durch die Leistung des Hauptspeicherbusses eingeschränkt. Das heißt, während ein Hardware-Thread auf Speicher wartet, kann der andere die Ausführung fortsetzen. ein primärer 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 rechnergebunden und verwenden nur ganzzahlige Arithmetik (tatsächlich Bitoperationen). Daher gibt es kein Potenzial für die parallele Ausführung und keinen Vorteil von parallelen Instruktionspipelines.


1 Ie ein Beschleunigungsfaktor von 4 bedeutet, dass der Algorithmus läuft viermal so schnell, als ob es mit nur einem Thread ausgeführt wurde. Definitionsgemäß hat jeder Algorithmus, der in einem Thread ausgeführt wird, einen relativen Beschleunigungsfaktor von 1.

Beste Antwort :-) Sklivvz vor 13 Jahren 0
Wie hoch sind die tatsächlichen Geschwindigkeiten der Algorithmen gegen die Anzahl der Kerne? Dh was ist der Geschwindigkeitsgewinn für den schnellsten Algorithmus in diesen Tests? Ich frage mich nur :). crazy2be vor 13 Jahren 1
@ crazy2be Für die blaue Linie ([Algorithmus von Horspool] (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm)) beträgt die Laufzeit von 4,16 Sekunden bis 0,35 Sekunden Sekunden mit 16 Threads. Die Beschleunigung beträgt also 11,74. Das ist jedoch mit Hyper-Threading. Wenn gegen die Anzahl der Kerne aufgetragen wird, beträgt die Beschleunigung dieses Algorithmus auf 8 Kernen 7,17. Konrad Rudolph vor 13 Jahren 0
@Konrad - Das ist ein interessantes Papier, aber dieses Diagramm hilft uns nicht ohne das entsprechende Diagramm der Laufzeit gegen die Anzahl der Threads. Der Vergleich von Algorithmen nach dem Geschwindigkeitsfaktor funktioniert nur dann wirklich, wenn sie überhaupt eine vergleichbare Geschwindigkeit haben. Wenn der `Naive`-Algorithmus doppelt so lange dauert wie der` Shift-or`-Algorithmus (zum Beispiel), könnte das Hyper-Threading möglicherweise einen Teil des Verlusts wiedererlangen, der durch die Verwendung eines weniger effizienten Algorithmus entsteht. Mark Booth vor 13 Jahren 0
@ Mark Ich präsentiere * relative * Beschleunigung. Die tatsächliche Geschwindigkeit dieser Algorithmen ist für die Vergleichbarkeit wirklich irrelevant. Insbesondere sind die Eingabedaten groß genug, so dass garantiert "nein" ein Teil der Verluste durch Verwendung eines weniger effizienten Algorithmus für das Multithreading im Allgemeinen aufgefangen wird. Der naive Algorithmus kann den Verlust auch nicht magisch wieder wettmachen, dafür muss es einen Mechanismus geben. In diesem Fall wird der Speicherbedarf reduziert. Konrad Rudolph vor 13 Jahren 0
@ Mark Aber ich bekomme was du sagst. Ich sollte erwähnen, dass für den naiven Algorithmus und den Horspool-Algorithmus die Speicherlast den Bus füllt, sodass die Bandbreite vollständig ausgenutzt wird. Bei den bitparallelen Algorithmen ist dies nicht mehr der Fall. Konrad Rudolph vor 13 Jahren 0
Das einzige Problem mit dieser Antwort ist, dass ich sie nur einmal bestätigen kann. Es ist eine erstaunlich objektive Antwort auf eine subjektive Frage;) Journeyman Geek vor 13 Jahren 5
@Konrad - Ich verstehe das, aber die relative Beschleunigung ist nur ein Faktor. Wenn ein Algorithmus mit 16 Hyper-Threads 12-mal so schnell abläuft, aber auf einem Kern doppelt so lange läuft wie auf einem anderen, der sich nur auf die Anzahl der physischen Kerne (7x) skaliert, ist der letztere immer noch der bessere Sie erhalten Ihre Ergebnisse um 17% schneller. Ich weiß, dass meine Wissenschaftler die Datenanalyse lieber in einer Stunde als in 70 Minuten abgeschlossen hätten. * 8 ') Mark Booth vor 13 Jahren 0
@ Mark "dann ist letztere immer noch besser zu benutzen" - natürlich. Aber das war nicht die Frage (weder hier noch in meiner These). ;-) Konrad Rudolph vor 13 Jahren 0
@Konrad - Die Frage war "Wie viel Beschleunigung gibt ein Hyper-Thread?" und Ihre (IMHO korrekte) Antwort lautet "Dies hängt ganz von der Aufgabe ab". Das Problem ist, Sie begründen dies mit nur der Hälfte der benötigten Daten. Bei einigen Algorithmen führt das Hyperthreading möglicherweise zu einer Verlangsamung (dh mit 16 Hyper-Threads wird langsamer als mit nur 8 echten Threads). Daher deaktivieren viele Benutzer das Hyper-Threading in ihrem BIOS. da sie ein Benchmarking durchgeführt haben und Hyper-Threading als Nachteil für ihre Anwendung empfunden haben. Mark Booth vor 13 Jahren 0
@ Konrad - tolle Antwort! Könnten Sie bitte Ihren Beitrag mit einigen nützlichen Informationen aus den Kommentaren aktualisieren? Nebenbei bemerkt - ich denke die Zeiten "do" machen aus. Wenn die Geschwindigkeit unter 1 Sekunde gesenkt wird, ist der Overhead vergleichbar. Wenn Sie den gleichen Algorithmus verwenden könnten, aber mit einer höheren Last, so dass die maximale Beschleunigung in 10 Sekunden resultiert, wäre dies, IMO, eine bessere Fraktion. Mikhail vor 13 Jahren 0
@Konrad, [könnte ich Sie interessieren, wenn Sie einen Blogbeitrag zu dieser Antwort schreiben] (http://meta.superuser.com/questions/2542/super-user-questions-of-the-week-15/2545#2545) ? Ivo Flipse vor 13 Jahren 2
Spektakuläre Antwort @KonradRudolph! Und interessante Lektüre für eine Diplomarbeit. @ @ Ivos Bitte um einen Blogbeitrag dazu. KronoS vor 13 Jahren 0
@Ivo Angry Birds für Chrome ist gerade herausgekommen! Aber sicher, ich werde sehen, ob ich am Wochenende etwas Freizeit finden kann. ;-) Konrad Rudolph vor 13 Jahren 0
Der Link zur Doktorarbeit dauert 'immer', und Firefox gibt schließlich auf. Tshepang vor 10 Jahren 0
@Tshepang Ja, leider ist die Website seit Monaten tot. Der technische Ansprechpartner meines Gastgebers antwortet nicht auf Anfragen. Ich bin zu beschäftigt, um mich darum zu kümmern. Derzeit habe ich keinen Ersatzplatz für ihn. Konrad Rudolph vor 10 Jahren 0
Sehr spät zu dieser Party, aber trotzdem: Sehr nette Antwort, ich habe endlich verstanden, was mit diesem Hyperthreading zu tun hat! Vielen Dank! sebhofer vor 7 Jahren 0
18
geoffc

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

Die Idee hinter Hyperthreading ist grundsätzlich, dass alle modernen CPUs mehr als ein Ausführungsproblem haben. Normalerweise näher an einem Dutzend. Unterteilt zwischen Integer, Gleitkomma, SSE / MMX / Streaming (wie auch immer es heute heißt).

Zusätzlich hat jede Einheit unterschiedliche Geschwindigkeiten. Dh es kann ein ganzzahliger mathematischer Einheitszyklus von 3 erforderlich sein, um etwas zu verarbeiten, aber eine 64-Bit-Gleitkommadivision kann 7 Zyklen erfordern. (Dies sind mythische Zahlen, die auf nichts basieren).

Die Ausführung außerhalb der Reihenfolge hilft viel dabei, die verschiedenen Einheiten so voll wie möglich zu halten.

Bei jeder einzelnen Task wird jedoch nicht jede einzelne Ausführungseinheit verwendet. Nicht einmal das Aufteilen von Threads kann völlig helfen.

Die Theorie wird also, wenn man so tut, als gäbe es eine zweite CPU, ein anderer Thread könnte darauf laufen, wobei die verfügbaren Ausführungseinheiten verwendet werden, die nicht in Ihrer Audio-Transcodierung verwendet werden, was 98% aus SSE / MMX besteht, und die Int- und Float-Einheiten vollständig sind Leerlauf bis auf ein paar Sachen.

Für mich ist dies in einer einzelnen CPU-Welt sinnvoller. Durch das Nachspielen einer zweiten CPU können Threads diese Schwelle leichter überschreiten, wenn nur wenig zusätzliche Codierung vorhanden ist, um diese gefälschte zweite CPU zu handhaben.

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

Um Ihre Fragen tatsächlich beantworten zu können, hängt es von den Aufgaben in Ihrem Prozess ab, von den Ausführungseinheiten, die er verwendet, und von Ihrer CPU, von den Ausführungseinheiten, die nicht verwendet werden und für die zweite gefälschte CPU verfügbar sind.

Einige "Klassen" von Computermaterial sollen (vage allgemein) profitieren. Aber es gibt keine strenge und schnelle Regel, und für manche Klassen verlangsamt es die Dinge.

Obwohl ich nach etwas wie "1.7-Zeit-Beschleunigung" gesucht habe, ist diese Antwort sehr nett, da sie dieses Problem nicht schwarz-weiß aussehen lässt. Mikhail vor 13 Jahren 2
@Mikhail: Der Punkt ist, dass es keinen einfachen Faktor gibt - es kommt darauf an, wie oft im Leben :-). sleske vor 13 Jahren 0
Der Kern ist richtig. Ein Problem jedoch: Es gibt keinen Grund, warum ein einzelner Kern mehr von Hyperthreading profitieren sollte als mehrere Kerne. Für die falsche Aufgabe weder Gewinn. Für die richtige Aufgabe profitieren beide vom gleichen Faktor. Konrad Rudolph vor 13 Jahren 3
@Konrad: Ich denke, der Punkt, an dem ich gerade ankam, ist, dass der Unterschied zwischen einem Kern und zwei Kernen möglicherweise wertvoller ist als der Unterschied zwischen 4 und 8 oder 2 und 4. Dh, einen zweiten Kern zu haben, kann eine schlecht geladene App helfen ein bisschen mehr. geoffc vor 13 Jahren 0
"Für eine schlecht geladene App" - das ist das Wichtige. Realistisch gesehen ist die Threading-Unterstützung der meisten Anwendungen jedoch schlecht, so dass Sie einen Punkt haben. Konrad Rudolph vor 13 Jahren 0
5
Mokubai

Ich habe ein paar anekdotische Beweise, um die Antwort von geoffc dahin zu ergänzen, dass ich tatsächlich eine Core i7-CPU (4-Core) mit Hyperthreading habe und ein wenig mit Video-Transcoding gespielt habe Parallelität, die Sie ein System effektiv vollständig laden können.

Meine Erfahrung mit dem Spiel mit der Anzahl der CPUs, die der Aufgabe zugeordnet sind, in der Regel mit den 4 "extra" Hyper-Threaded-Cores, entspricht etwa einer zusätzlichen CPU-Prozessorleistung. Die zusätzlichen 4 "hyperthreaded" Kerne fügten ungefähr die gleiche nutzbare Verarbeitungsleistung hinzu wie 3 bis 4 "echte" Kerne.

Zugegeben, dies ist nicht unbedingt ein fairer Test, da wahrscheinlich alle Codierungsthreads um die gleichen Ressourcen in den CPUs konkurrieren würden, aber für mich zeigte es zumindest einen geringfügigen Anstieg der Gesamtverarbeitungsleistung.

Der einzige Weg, um wirklich zu zeigen, ob es wirklich hilft, besteht darin, auf einem System mit aktiviertem und deaktiviertem Hyperthreading gleichzeitig einige verschiedene Integer / Floating Point / SSE-Tests durchzuführen und zu sehen, wie viel Verarbeitungsleistung in einem kontrollierten System verfügbar ist Umgebung.

Ein klarer Punkt - es hängt von der Anwendung ab. Ich bin mir sicher, dass das Computing mit hoher Kommunikation beschleunigt werden könnte, da Core 0 und Core 0-h über denselben Cache kommunizieren würden, ohne langsamen Arbeitsspeicher zu verwenden. Mikhail vor 13 Jahren 1
@Mikhail, dann besteht das Problem darin, dass, wenn beide Threads eine große Menge an Verarbeitungsleistung benötigen, beide um die gleichen Ressourcen konkurrieren und die Kommunikation über den gemeinsam genutzten L3-Cache der CPUs viel besser wäre (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 [Schwünge und Kreisverkehr] (http://idioms.thefreedictionary.com/it%27s+swings+and+roundabouts) ... Mokubai vor 13 Jahren 1
3
Stephen Darlington

Dies hängt stark von der CPU und der Arbeitslast ab, wie andere bereits sagten.

Intel sagt :

Die gemessene Leistung des Intel® Xeon®-Prozessors MP mit Hyper-Threading-Technologie zeigt Leistungssteigerungen von bis zu 30% im Vergleich zu gängigen Serveranwendungsbenchmarks für diese Technologie

(Dies scheint mir ein bisschen konservativ zu sein.)

Und es gibt noch eine längere Zeitung (die ich noch nicht alle gelesen habe) mit mehr Zahlen hier . Eine interessante Mitnehmen aus diesem Papier ist, dass Hyper - Threading kann dünnt machen 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 untergeordneter Multi-Core-Prozess, abhängig davon, wie sicher Sie von der wahrscheinlichen Leistung sind. Die Zahlen in diesem Stück deuten auf eine Kommentargeschwindigkeit von 0,5x bis 1,5x hin.

Schließlich hängt die Leistung auch vom Betriebssystem ab. Das Betriebssystem sendet hoffentlich Prozesse an reale CPUs und bevorzugt die Hyperthreads, die sich lediglich als CPUs tarnen. Andernfalls haben Sie in einem Dual-Core-System möglicherweise eine CPU im Leerlauf und einen sehr ausgelasteten Core mit zwei Thrashing-Threads. Ich denke daran, dass dies mit Windows 2000 passiert ist, obwohl natürlich alle modernen Betriebssysteme geeignet sind.

Das Betriebssystem muss sicherstellen, dass sich die Threads nicht gegenseitig blockieren :) Mikhail vor 13 Jahren 1