Wie andere gesagt haben, hängt dies ganz von der Aufgabe ab.
Schauen wir uns zur Veranschaulichung einen tatsächlichen Benchmark an:
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.
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.
quelle
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.
quelle
Es hängt sehr von der CPU und der Arbeitslast ab, wie andere gesagt haben.
Intel sagt :
(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.
quelle