CoMo
Commander
- Registriert
- Dez. 2015
- Beiträge
- 2.812
Hallo,
ich mache mir gerade Gedanken, wie SMT eigentlich genau funktioniert. Bisher verstehe ich das so:
Ein CPU-Kern kann grundsätzlich erst mal nur eine einzige Aufgabe auf einmal durchführen, also einen Thread bearbeiten. Möchte ein anderer Thread auf den Kern zugreifen, muss er warten.
Nun besteht ein CPU-Kern ja aber aus mehreren Komponenten, z.B. einer Einheit für Gleitkomma-Berechnungen und einer Einheit für Vektor-Berechnungen.
SMT sorgt nun dafür, dass die Kerne effizienter genutzt werden können. Wenn ein Kern z.B. gerade nur Gleitkomma-Berechnungen durchführt und ein anderer Thread Vektor-Berechnungen benötigt, so sorgt SMT dafür, dass die Vektor-Einheit sich um diesen Thread kümmern kann, währen die Gleitkomma-Einheit weiter am anderen Thread arbeiten kann.
Das erzeugt Latenzen und kostet etwas Leistung, da sich die Kerne ständig über den Status der Threads austauschen müssen und sich Datenleitungen teilen müssen und ist der Grund dafür, dass sich die Leistung auch in diesem Optimalen Szenario nicht verdoppelt.
Habe ich das soweit richtig verstanden?
Dann weiter: Das OS hat keine direkte Kontrolle darüber, wie der Prozessor seine Threads verarbeitet und kann darauf nur bedingt Einfluss nehmen. Für das OS und darauf laufende Anwendungen ist jeder logische Prozessor gleichwertig.
Daraus schlussfolgere ich: Wenn ein Prozessor z.B. 24 Kerne hat und SMT aktiviert ist, und ich führe einen Prozess aus, der genau 24 Threads benötigt (der Einfachheit halber nehme ich an, dass das OS selbst keinen Thread benötigt) und sonst nichts. Dann würde das OS die 24 Threads auf 48 logische Kerne verteilen, ohne die tatsächliche Anzahl an physischen Kernen berücksichtigen zu können. Das bedeutet, Threads würden durch SMT auf Kerne verteilt, welche dann an mehreren Threads arbeiten würden, während tatsächlich physische Kerne in dieser Zeit gar keine Daten verarbeiten würden.
Da das Leistung kostet, wäre die Ausführungsgeschwindigkeit in diesem Fall also geringer als ohne aktiviertes SMT. Denn sonst würde sich je 1 Kern dediziert um einen Thread kümmern können.
Ist das soweit korrekt?
Bei mehr als 24 Threads, sagen wir 48, stünden jedem Thread potentiell 2 logische Kerne zur Verfügung. Das wäre ein Effizienzgewinn. Es sei denn...
Es sei denn, alle 48 Threads nutzen nur eine Einheit der Prozessoren. Z.B. führen alle 48 Threads ausschließlich Vektor-Berechnungen durch. Dann sind die Vektor-Einheiten aller Kerne ausgelastet.
In diesem Fall könnte SMT keinen Vorteil bringen, da sich diese Berechnungen nicht weiter parallelisieren ließen. Die Ausführungsgeschwindigkeit würde sogar massiv sinken, da einzelne Threads ihre Informationen zwischen physischen Kernen synchronisieren müssten.
Ist das soweit korrekt?
Wenn ich andererseits normale Workloads betreibe, also alle Einheiten der Kerne mehr oder weniger in Verwendung sind, dann kann SMT doch nur so lange einen Vorteil bringen, wie die Anzahl meiner Threads die Anzahl der physischen Kerne übersteigt, oder?
Anders ausgedrückt: So lange ich auf einer 24-Kern CPU weniger als 24 Threads ausführe, sinkt meine Performance mit aktiviertem SMT, da die vorhandenen physischen Kerne sich nicht dediziert um die Threads kümmern und somit Leistungspotential brachliegt.
Richtig? Freue mich auf euren fachlichen Input, denn das beschäftigt mich schon sehr lange und so wirklich konnte mir das noch niemand erklären
ich mache mir gerade Gedanken, wie SMT eigentlich genau funktioniert. Bisher verstehe ich das so:
Ein CPU-Kern kann grundsätzlich erst mal nur eine einzige Aufgabe auf einmal durchführen, also einen Thread bearbeiten. Möchte ein anderer Thread auf den Kern zugreifen, muss er warten.
Nun besteht ein CPU-Kern ja aber aus mehreren Komponenten, z.B. einer Einheit für Gleitkomma-Berechnungen und einer Einheit für Vektor-Berechnungen.
SMT sorgt nun dafür, dass die Kerne effizienter genutzt werden können. Wenn ein Kern z.B. gerade nur Gleitkomma-Berechnungen durchführt und ein anderer Thread Vektor-Berechnungen benötigt, so sorgt SMT dafür, dass die Vektor-Einheit sich um diesen Thread kümmern kann, währen die Gleitkomma-Einheit weiter am anderen Thread arbeiten kann.
Das erzeugt Latenzen und kostet etwas Leistung, da sich die Kerne ständig über den Status der Threads austauschen müssen und sich Datenleitungen teilen müssen und ist der Grund dafür, dass sich die Leistung auch in diesem Optimalen Szenario nicht verdoppelt.
Habe ich das soweit richtig verstanden?
Dann weiter: Das OS hat keine direkte Kontrolle darüber, wie der Prozessor seine Threads verarbeitet und kann darauf nur bedingt Einfluss nehmen. Für das OS und darauf laufende Anwendungen ist jeder logische Prozessor gleichwertig.
Daraus schlussfolgere ich: Wenn ein Prozessor z.B. 24 Kerne hat und SMT aktiviert ist, und ich führe einen Prozess aus, der genau 24 Threads benötigt (der Einfachheit halber nehme ich an, dass das OS selbst keinen Thread benötigt) und sonst nichts. Dann würde das OS die 24 Threads auf 48 logische Kerne verteilen, ohne die tatsächliche Anzahl an physischen Kernen berücksichtigen zu können. Das bedeutet, Threads würden durch SMT auf Kerne verteilt, welche dann an mehreren Threads arbeiten würden, während tatsächlich physische Kerne in dieser Zeit gar keine Daten verarbeiten würden.
Da das Leistung kostet, wäre die Ausführungsgeschwindigkeit in diesem Fall also geringer als ohne aktiviertes SMT. Denn sonst würde sich je 1 Kern dediziert um einen Thread kümmern können.
Ist das soweit korrekt?
Bei mehr als 24 Threads, sagen wir 48, stünden jedem Thread potentiell 2 logische Kerne zur Verfügung. Das wäre ein Effizienzgewinn. Es sei denn...
Es sei denn, alle 48 Threads nutzen nur eine Einheit der Prozessoren. Z.B. führen alle 48 Threads ausschließlich Vektor-Berechnungen durch. Dann sind die Vektor-Einheiten aller Kerne ausgelastet.
In diesem Fall könnte SMT keinen Vorteil bringen, da sich diese Berechnungen nicht weiter parallelisieren ließen. Die Ausführungsgeschwindigkeit würde sogar massiv sinken, da einzelne Threads ihre Informationen zwischen physischen Kernen synchronisieren müssten.
Ist das soweit korrekt?
Wenn ich andererseits normale Workloads betreibe, also alle Einheiten der Kerne mehr oder weniger in Verwendung sind, dann kann SMT doch nur so lange einen Vorteil bringen, wie die Anzahl meiner Threads die Anzahl der physischen Kerne übersteigt, oder?
Anders ausgedrückt: So lange ich auf einer 24-Kern CPU weniger als 24 Threads ausführe, sinkt meine Performance mit aktiviertem SMT, da die vorhandenen physischen Kerne sich nicht dediziert um die Threads kümmern und somit Leistungspotential brachliegt.
Richtig? Freue mich auf euren fachlichen Input, denn das beschäftigt mich schon sehr lange und so wirklich konnte mir das noch niemand erklären