Gewinn durch HT/SMT

MThom

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
118
Ich habe in C++ ein Programm geschrieben, das vor allem Gleitkommaberechnungen mit doppelter Genauigkeit macht. Es ist recht klein und arbeitet auch nur auf einer kleinen Datenmenge. Wenn ich es mit Visual Studio unter Win 7 übersetze und auf einem Haswell i7 mit 4 Kernen laufen lasse, dann beobachte ich, dass es kaum langsamer wird, wenn ich 8 statt 4 Threads starte. Der Gewinn durch HT beträgt über 90%.

Das ändert sich auch nicht, wenn ich es unter Linux mit GCC übersetze (dann ist es nur generell etwas schneller).

Frage: warum ist das so, und wie verhält sich in dieser Hinsicht die Zen und die Zen 2 Architektur?
 
MThom schrieb:
dann beobachte ich, dass es kaum langsamer wird, wenn ich 8 statt 4 Threads starte. Der Gewinn durch HT beträgt über 90%.

Wie genau meinst du das jetzt? Meinst du mit "langsamer" weniger zeit braucht, also eher schneller ist? Also nur noch 90% der Zeit statt 100?

HT bringt bei Intel im besten Fall wohl so 25%. Oft natürlich eher weniger.
Bei AMD war das SMT mit den Zen wohl effektiver, teils bis 35%.

Werden denn alle threads ausgelastet?
 
  • Gefällt mir
Reaktionen: Baal Netbeck
Das hilft nur was, wenn die Software auch mehr Threads ausnutzt, als die CPU Kerne hat.....läuft dein Code nur auf ein paar Kernen, dann hast du mit 8 Threads kaum Vorteile....teils minimal langsamer.

In Spielen wo es viele RAM Zugriffe gibt, ist HT/SMT besonders gut...in vielen Programmen hingegen nicht.
 
Wenn es schneller gehen soll: Programm auf Parallelisierbarkeit analysieren und dann parallelisieren. Ob zwei( oder sonst endlich viele) Threads passen oder ob Du mit den verfügbaren Hardwarethreads skalieren kannst, das kannst nur Du selber entscheiden auf Basis Deiner Anwendung.
 
Primär bringt SMT was, wenn du verschiedene Threads hast, die verschiedene CPU-Ressourcen benötigen.
Wenn du z.b. 50% Gleitkomma und 50% Arithmetik hast (kommt immer auf die CPU an), dann kannst du mit SMT die Leistung verdoppeln, weil FPU und ALU der CPU gleichzeitig genutzt werden können und nicht die Hälfte der Zeit warten.
Wenn dein Programm nur Gleitkomma macht, dann wirst du kaum Gewinn haben.
Das ganze natürlich zusätzlich zur generellen Frage der Parallelisierbarkeit.
 
  • Gefällt mir
Reaktionen: BachUhr
Ich meine das so: wenn ich 8 Threads starte (statt 4), dann läuft jeder davon noch fast genauso schnell. Die gesamte Leistung wird also fast verdoppelt, wenn auf einem Kern zwei Threads laufen. Auf dem i7, wie gesagt, und mit einem Programm, das fast nur Gleitkommaberechnungen macht.

Was ich vor allem wissen möchte, ist, ob sich die Ryzen ebenso verhalten. Ich überlege nämlich, mir einen neuen Rechner zuzulegen, vielleicht mit einem Ryzen.

Termy schrieb:
Wenn dein Programm nur Gleitkomma macht, dann wirst du kaum Gewinn haben.
Genau das beobachte ich aber, wie gesagt.
 
Das ist interessant - von der Logik her würde mir da spontan nur massig ALU-Overhead einfallen. Ich bin aber definitiv kein Experte in der Richtung :D
 
  • Gefällt mir
Reaktionen: Baal Netbeck
Heißt ja nicht, dass es keine Speicherzugriffe gibt. Wenn es sowas wie saxpy ist wird HT nichts bringen, wenn es Zahlen in zufälligen Stellen in einem 3D Gitter addieren ist, am besten noch mit vielen Branches, schon (Ray-Tracing wäre auch sowas -- das springt viel im Speicher rum und machst sonst nur FP ALU.)

(HT/SMT macht ja nicht anderes, als bei einer Lücke in der Pipeline auf einen anderen Thread zu wechseln. Lücken in der Pipeline kriegst Du i.d.R. durch RAM/Speicher-Zugriff oder Sprünge rein. Wenn es also viel hilft, muss die CPU per Definition wenig ausgelastet sein.)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Simon und Baal Netbeck
Man müsste mehr über das Programm wissen um die Beobachtung nachzuvollziehen. Laufen die Threads frei, oder ist der Zugriff auf die Daten synchronisiert? Liegen die Daten im RAM oder findet IO statt, etc.?
 
Nur mal so als beispiel bei Cinebench.
Hab erst Multithread gemacht mit 2 Threads und per Taskmanager auf Cores 14/15 gepinnt
Dann Single Thread mit Taskmanager auf Core 14 gepinnt.

Also mit SMT bei AMD zumindest 38% in Cinebench
1575220724715.png
 
  • Gefällt mir
Reaktionen: andi_sco
Mehr über das Programm: es ist ein Konsolenprogramm in C++ und recht klein, es macht fast nur Gleitkommaberechnungen doppelter Genauigkeit (64 bit). Es arbeitet nur auf einer kleinen Datenmenge. Es sollte locker alles in den Cache passen, Programm und Daten.

Jeder Thread arbeitet mit seinen eigenen Daten, es gibt keine Synchronisierung. Genauer gesagt, habe ich zwei Versionen gemacht, eine mit Multithreading, d. h. in einem Prozess werden mehrere Threads gestartet, und eine mit nur einem einzelnen Thread, diese habe ich mehrmals gestartet, d. h. ich habe mehrere Konsolen aufgemacht und darin jeweils einen Prozess gestartet. Bei beiden das gleiche Verhalten. (Mit Linux und GCC habe ich nur die zweite Version getestet)
 
um mal bei meinem Amateurwissen zu bleiben: hast du vielleicht bei jeder Gleitkommaberechnung noch irgendwelche Compares oder sonstige Logikoperationen mit dabei?
 
MThom schrieb:
Was ich vor allem wissen möchte, ist, ob sich die Ryzen ebenso verhalten. Ich überlege nämlich, mir einen neuen Rechner zuzulegen, vielleicht mit einem Ryzen.
Die Technik von Intel und AMD zu HT/ SMT ist praktisch gleich.
AMD hat schlechtere Zugriffszeiten zum Ram, was aus meiner Sicht ein Grund sein könnte, warum AMDs SMT oft mehr Mehrleistung bringt als Intels HT.....sie haben mehr auszugleichen.

Die Zen2 CPUs haben doppelt so viel L3 Cache, was wohl fürs Kompilieren große Vorteile bieten kann, und in Spielen teils die schlechteren Ramzugriffe ausgleichen kann.

Also von der Hardware spricht nichts gegen Ryzen..vor allem nicht bei Zen2 CPUs.
Allerdings gibt es teilweise "Softwareprobleme".....erst letztens wurde bekannt, dass einige Programme wie Mathematika oft eine Intel Standardbibliothek nutzen, die nur bei Intel CPUs AVX und AVX2 nutzen.....eine andere CPU wie ein Ryzen(der auch AVX2 kann), wird dann aus SSE zurückgestuft und läuft sehr langsam.....ein paar codezeilen um AVX2 zu erzwingen und die Leistung hat sich um 20-400% verbessert.

Und es gab noch ein paar andere Programme, die sich genauso verhalten haben......Da ist AMD leider bei der Programmierung benachteiligt und da Intel immer noch ein vielfaches an Gewinn einfährt als AMD und sie gigantische Rücklagen haben, werden sie wohl auch in Zukunft versuchen AMD Produkte wo es geht zu behindern.
 
Termy schrieb:
um mal bei meinem Amateurwissen zu bleiben: hast du vielleicht bei jeder Gleitkommaberechnung noch irgendwelche Compares oder sonstige Logikoperationen mit dabei?
Ein paar Ganzzahlberechnungen, Vergleiche und Logikoperationen gibt es auch, die braucht man immer. Aber die eigentlichen Berechnungen sind alle mit dem Typ double, also 64 bit Gleitkommazahlen.

Genauer gesagt, berechnet das Programm den Weg von Lichtstrahlen durch ein Linsensystem. Der Hauptteil des Programms, in dem fast die ganze Zeit verbraucht wird, schleift über die Linsenoberflächen und berechnet, wie ein Strahl nacheinander an alle Flächen gebrochen wird.

Zweck ist die Optimierung des Linsensystems.
 
HT/SMT bringt eigentlich nicht mehr als 30-40%, wie ja auch der Cinebench von VelleX zeigt. Sind die Kerne denn auch zu 100% ausgelastet? Steht das Energiesparprofil auf Höchstleistung? Wenn alles korrekt läuft, dann sollte im Teillastbereich mit 4 Threads, die Last über alle Kerne wandern. Wenn das nicht der Fall ist, dann könnte z.B das 4 Thread Ergebnis durch Coreparking verfälscht sein.
 
Profiler anwerfen und anschauen was es tut. Offensichtlich verhält es sich nicht so wie beschrieben. SMT/HT ist keine Magie und hilft nicht, wenn die gleichen Ports ständig ausgelastet sind (sprich: Ständig FP Instruktionen issued werden von allen Threads auf einem Core.) Selbst ein einfacher Sampling Profiler sollte sachdienliche Hinweise liefern (perf auf Linux z.B.)
 
Ich sehe schon: das einzige, was hier helfen würde, wäre, dass jemand ein vergleichbares Programm auf seinem Ryzen-System testet, um zu erproben, ob es sich da ebenso verhält und zwei Threads je Kern nahezu die doppelte Leistung liefern.

Ich könnte vielleicht eine vereinfachte Version demnächst hier einstellen (es ist gar nicht sehr groß), dann kann es jeder ausprobieren, der Lust hat.
 
  • Gefällt mir
Reaktionen: andi_sco
Was wäre denn ein vergleichbares Programm? Cinebench und Blender skalieren ziemlich optimal und liegen im Bereich von 40%. Ich habe persönlich bei eigenen Programmen nie mehr als 30% beobachten können.
 
Wie sieht denn die Auslastung bei dir im Taskmanager denn überhaupt aus? Ist da bei 8 Threads die CPU voll ausgelastet und bei einem Thread nur 1 Kern, bzw die gesamte CPU zu 12,5%?
Kann ja sein dass da irgendwo anders ein Bottleneck ist.

Ich hab gerade mal mit WinRAR den integrierten Benchmark gemacht. Bei einem Thread kam ich nur auf 2730KB/s, bei 1+SMT auf 4850, was über 77% zuwachs sind.
Bei 2 Cores waren es 5340, also fast das doppelte von einem Core.
 
Zurück
Oben