Nehmen wir an, ich besitze eine Server-CPU mit 18 Kernen und aktivierter Hyperthreading-Funktion, was bedeutet, dass in htop 36 CPUs angezeigt werden.
Um die CPU voll auszunutzen und die Single-Thread-Leistung nicht zu beeinträchtigen, sollte ich anstreben, dass alle 36 "Kerne" zu 100% ausgeführt werden und die HT-Kerne nur weniger arbeiten und immer noch 100% melden, oder würde dies bedeuten, dass die "volle" Kerne werden bereits von der Aufgabe auf ihrem "HT-Kern" unterbrochen und erledigen so weniger Single-Thread-Arbeit?
Mir ist bewusst, dass es viele Variablen gibt, die die HT-Leistung beeinflussen. Ich möchte nur wissen, was CPU-Meter im Umgang mit HT bedeuten.
hyperthreading
Tassadar
quelle
quelle
Antworten:
Wenn der zweite virtuelle Kern einen Beitrag leisten darf, während der erste ansonsten hängen bleiben würde, ist dies besser als nicht , damit Sie (zumindest) ein wenig mehr Arbeit erledigen können.
Es stellt sich die Frage, wann zwei unterschiedliche Threads dazu führen, dass einer schlechter läuft. Die Verzweigungsvorhersage und Abhängigkeiten zwischen Befehlen ändern sich nicht. Jetzt auf Speicherzugriff warten ... die beiden Threads konkurrieren um den Speicherzugriff, sowohl in Bezug auf die Cache-Auslastung als auch in Bezug auf die Bandbreite.
Wenn auf einigen CPUs HT ausgeführt wird und auf anderen nicht, bedeutet dies auch, dass Sie dem einen oder anderen Typ bestimmte Threads zuweisen? Ich denke nicht: Ihre Programme werden ihre Threads auf zufälligen virtuellen Kernen ausführen. Wie hilft die Aufteilung der Konfiguration? Da jede CPU über einen eigenen Cache verfügt, hängt der einzige Einfluss von der Speicherbandbreite und der Belastung durch die Cache-Kohärenz ab.
Im Allgemeinen erreichen Sie einen Punkt, an dem es teurer ist, mehr zu tun, als einige CPU-Ausführungseinheiten im Leerlauf laufen zu lassen. Dies hängt nicht direkt von der Anzahl der Threads ab, sondern von was die Threads tun , und von der detaillierten Speicherarchitektur und den Leistungsnuancen der verschiedenen Komponenten.
Es gibt keine einfache Antwort. Selbst mit Blick auf ein bestimmtes Programm kann sich die Maschine von derjenigen von Personen unterscheiden, die über ihre eigenen Erfahrungen berichten.
Sie müssen es selbst ausprobieren und messen was am schnellsten ist, mit dieser spezifischen Arbeit an genau dieser Maschine. Und selbst dann kann es sich mit Software-Updates und Nutzungsänderungen im Laufe der Zeit ändern.
Schauen Sie sich Band 3 von Angers Magnum Opus an . Wenn Sie sich einen bestimmten Prozessor genau ansehen, finden Sie begrenzende Ressourcen in der umfangreichen Pipeline vieler Schritte, die zum Ausführen von Code erforderlich sind. Sie müssen einen Fall finden, in dem Überbeanspruchung dazu führt, dass sie langsamer ausgeführt wird, als dass keine weitere Arbeit aufgenommen wird. Im Allgemeinen würde dies eine Art Caching bedeuten; und wo die Ressource zwischen Threads geteilt wird.
Was bedeutet die CPU-Anzeige: Sie zeigt alle Zeiten an, die nicht für die Ausführung des inaktiven Threads aufgewendet wurden. Beide logischen Threads, die einem Core zugewiesen sind, sind nicht inaktiv, obwohl die tatsächliche Arbeit an einem von ihnen möglicherweise gering ist. Die Zeit, die mit der Pipeline verbracht wird, steckt für einige Zyklen fest, bis die Ergebnisse fertig sind, der Speicher abgerufen wird, atomare Operationen eingezäunt sind usw. und die Zeit zeigt sich immer noch als in Benutzung. Warten auf RAM wird nicht als Leerlauf angezeigt. Nur so etwas wie I / O blockiert den Thread und stoppt die Ladezeit. Ein Betriebssystem-Mutex im Allgemeinen wird dies tun, aber mit dem Aufkommen von Multicore-Systemen ist dies keine sichere Sache mehr, da ein "Spinlock" den Thread nicht dazu bringt , wieder im Regal zu landen.
Eine CPU-Anzeige von 100% bedeutet also nicht, dass alles reibungslos läuft, wenn die CPU häufig auf Speicher wartet. Eine geringere Anzahl von logischen Kernen 90% zeigen , könnte sehr wohl mehr Arbeit bekommen, wie es endet die Zahl Knirschen und ist nun auf der Festplatte zu warten.
Sorgen Sie sich also nicht um die CPU-Anzeige. Blick auf tatsächliche Fortschritte gemacht, nur .
quelle
CPU-Anzeigen sind sehr schlecht, um Ihnen zu sagen, wie viel mehr Leistung Sie aus Ihren Hyperthread-CPUs herausholen können. Dazu sollten Sie Ihre eigenen Benchmarks mit verschiedenen physischen Core-Überzeichnungsraten ausführen. Es gibt einige Workloads, die am besten funktionieren, wenn HT vollständig deaktiviert ist. Nehmen Sie diesen Fall daher auch in Ihre Tests auf. Es könnte ein 1: 2 (36 parallele Arbeiter) oder 1: 1,5 oder sogar 1: 2,5 sein! Das hängt von Ihrer Arbeitsbelastung ab.
Im Einzelnen wird HT auf dem Silizium so implementiert, dass der Prozessor weniger Zeit im Leerlauf verbringt, wenn ein Kontext umgeschaltet werden muss oder eine Verzweigungsvorhersage fehlschlägt. Dies macht es einfacher, eine 100% ige Auslastung der Ausführungseinheit zu erreichen als mit reinen Tricks des Betriebssystems. HT hat sich seit seiner Einführung weiterentwickelt und es gibt mehr Parallelität bei modernen Chips als bei denen, die wir vor 10 Jahren verwendet haben.
Es gibt zwei Ausführungsprofile, die sich darauf auswirken, wo sich Ihr optimaler Überzeichnungspunkt befindet:
quelle
Sie sollten sehen, dass alle 36 Kerne zu 100% ausgeführt werden - vorausgesetzt, die Software kann dies (was nicht trivial ist - die Planung kann bei so vielen Kernen schwierig sein, so dass Einbrüche unter 100% akzeptabel sind).
Wenn Sie ein Erz mit Hyperthreading "spalten", sind diese 200% nicht "2x100% - in erledigter Arbeit. Dies ist jedoch für jede durchgeführte Messung (die aus der CPU-Auslastung stammt und kein Konzept für erledigte Arbeit hat) unsichtbar. Wie viel Arbeit dabei geleistet wird, hängt davon ab, um was es sich handelt - irgendwo über dem 1,5-fachen ist die meiste Zeit mit der Arbeit ohne Hyper-Threading zu rechnen.
quelle
Die Art und Weise, wie Hyperthreading implementiert wird, hängt vom jeweiligen CPU-Uarch ab. Von Nehalem bis Skylake reduzierte Intel die gemeinsam genutzten Teile der Pipeline mit festem Verhältnis (dh: 50/50) erheblich und ging zu gemeinsam genutzten Strukturen über.
Im Allgemeinen führte die Aktivierung von HT zu einer etwas langsameren Single-Thread-Ausführung. Aufgrund der Funktionsweise des Linux-Schedulers tritt dies jedoch nur auf, wenn die Anzahl der ausgeführten Threads höher ist als die Anzahl der physischen Kerne. Da Sie in solchen Situationen (wenn Threads> Kerne) normalerweise den Gesamtdurchsatz von maximaler Wichtigkeit schätzen, bleibt Hyperthreading ein Nettogewinn.
Wie ist das möglich? Der Schlüssel zum Verständnis ist, dass die CPU die physischen und virtuellen Kerne nicht als gleiche Kerne darstellt, sondern diese auf eine Weise verfügbar macht, die der Linux-Scheduler vermeiden kann, wenn andere physische Kerne verfügbar sind. Mit anderen Worten, es werden zuerst alle physischen Kerne verwendet, dann wird der virtuelle verwendet.
Dies bedeutet, dass HyperThreading im Allgemeinen eine sehr wertvolle Funktion ist (andere Prozessoren, wie Power8, verwenden noch tiefere SMT-Techniken). Um den Durchsatz zu maximieren, sollten Sie es aktivieren und die CPU mit mindestens einem Thread pro virtuellem oder physischem Kern laden. Für ein praktisches Beispiel sollten Sie mindestens 36 Threads verwenden, um die volle Leistung einer 18-Kern-CPU zu erzielen.
Es gibt zwei Ausnahmen:
quelle