Wie funktioniert die Windows-Prozessoraffinität bei Hyperthread-CPUs?

13861
Charles Burns

Wie funktioniert die Windows-Prozessoraffinität bei Hyperthread-CPUs? Wir wollen ein Beispiel (abgebildet) eines Systems mit vier Kernen mit jeweils einem virtuellen Hyper-Threading-Kern verwenden.

  1. Welche Kerne entsprechen jeder "CPU" unten?
  2. Stehen (sagen wir) die CPU 6 und die CPU 7 unten für einen Kern; die HT und der reale Kern?
  3. Wenn die CPU 6 beispielsweise einen realen Kern und die CPU 7 einen HT-Kern darstellt, erhält ein Thread, der nur der CPU7 zugewiesen ist, nur die verbleibenden Ressourcen eines realen Kerns? (vorausgesetzt, der Kern führt andere Aufgaben aus)
  4. Wird das Hyperthreading vollständig innerhalb des Prozessors verwaltet, sodass Threads intern jongliert werden? Wenn ja, liegt das am CPU-Umfang oder am Kernbereich? Beispiel: Wenn CPU 6 und 7 einen Kern darstellen, spielt es keine Rolle, welchem ​​Prozess ein Prozess zugewiesen wird, weil die CPU einem laufenden Thread Ressourcen entsprechend zuweist?
  5. Ich stelle fest, dass langlebige Single-Threading-Prozesse, zumindest laut Task-Manager, ziemlich stark um Kerne herumprallen. Bedeutet das, dass die Zuweisung eines Prozesses zu einem einzelnen Kern die Leistung ein wenig verbessert (indem Kontextwechsel und Cache-Ungültigmachungen usw. vermieden werden)? Wenn ja, kann ich wissen, dass ich nicht "nur einen virtuellen Kern" zuweise?

Das ist alles sehr vage und verwirrend für mich. HT ist großartig, scheint jedoch die Transparenz der Ressourcenzuteilung zu reduzieren.

Prozessor-Affinitätsmenü

25
Nur damit Sie wissen, jeder CPU-Kern, den Sie sehen, ist ein "virtueller Kern". Jeder hat eine physische Verbindung zur CPU. Der Begriff "virtuell" stammt von der Art und Weise, wie Windows auf diesen CPUs Prozesse plant, aufgrund der Implementierung von Hardware-Hyperthreading. Siehe meine Antwort für weitere Details. Breakthrough vor 13 Jahren 0
Noch ein letzter Kommentar für Sie. "HT ist großartig, scheint jedoch die Transparenz der Ressourcenzuteilung zu reduzieren." Dies ist zu 100% wahr, aber es gibt wenig, was Sie dagegen tun können, noch gibt es einen Grund, warum Sie etwas dagegen unternehmen. Alle modernen Betriebssysteme wissen, was Hyperthreading ist, die meisten verfügen über hochentwickelte Prozessor-Scheduler, um dies auszugleichen. Abgesehen von wenigen speziellen Fällen (und ich meine nur wenigen) gibt es fast immer einen Leistungsvorteil. Breakthrough vor 13 Jahren 0

3 Antworten auf die Frage

17
Breakthrough

Welche Kerne entsprechen jeder "CPU" unten?

Angenommen, wir haben Core 1, 2, 3 und 4, CPU4 und CPU5 repräsentieren Core 3.

Stehen (sagen wir) die CPU 6 und die CPU 7 unten für einen Kern; die HT und der reale Kern?

Es gibt keinen Unterschied zwischen den beiden - sie verfügen beide über physische Hardwareschnittstellen zur CPU, die logische Schnittstelle ist in Hardware implementiert ( weitere Informationen finden Sie im Intel Core-Prozessor-Datenblatt, Band 1 ). Grundsätzlich besteht jeder Kern aus zwei separaten Ausführungseinheiten, teilt jedoch einige gemeinsame Ressourcen. Aus diesem Grund kann Hyperthreading in bestimmten Fällen die Leistung beeinträchtigen.

Wenn die CPU 6 beispielsweise einen realen Kern und die CPU 7 einen HT-Kern darstellt, erhält ein Thread, der nur der CPU7 zugewiesen ist, nur die verbleibenden Ressourcen eines realen Kerns? (vorausgesetzt, der Kern führt andere Aufgaben aus)

Siehe oben. Ein Thread, der NUR CPU6 oder ONLY CPU7 zugewiesen ist, wird mit der gleichen Geschwindigkeit ausgeführt (vorausgesetzt, der Thread führt die gleiche Arbeit aus und die anderen Kerne im Prozessor befinden sich im Leerlauf). Windows kennt sich mit HT-fähigen Prozessoren aus, und der Prozessplaner berücksichtigt dies.

Wird das Hyperthreading vollständig innerhalb des Prozessors verwaltet, sodass Threads intern jongliert werden? Wenn ja, liegt das am CPU-Umfang oder am Kernbereich? Beispiel: Wenn CPU 6 und 7 einen Kern darstellen, spielt es keine Rolle, welchem ​​Prozess ein Prozess zugewiesen wird, weil die CPU einem laufenden Thread Ressourcen entsprechend zuweist?

Beide. Die eigentliche Hardware selbst plant nicht, auf welchen Kernen Programme ausgeführt werden. Dies ist die Aufgabe des Betriebssystems. Die CPU selbst ist jedoch dafür verantwortlich, Ressourcen zwischen den eigentlichen Ausführungseinheiten aufzuteilen, und Intel legt fest, wie Sie Code schreiben können, um diesen Vorgang so effizient wie möglich zu gestalten.

Ich stelle fest, dass langlebige Single-Threading-Prozesse, zumindest laut Task-Manager, ziemlich stark um Kerne herumprallen. Bedeutet das, dass die Zuweisung eines Prozesses zu einem einzelnen Kern die Leistung ein wenig verbessert (indem Kontextwechsel und Cache-Ungültigmachungen usw. vermieden werden)? Wenn ja, kann ich wissen, dass ich nicht "nur einen virtuellen Kern" zuweise?

Dies ist ein normales Verhalten, und nein, wenn Sie es einem einzelnen Kern zuweisen, wird die Leistung nicht verbessert. Wenn Sie jedoch aus irgendeinem Grund sicherstellen möchten, dass ein einzelner Prozess nur auf einem einzelnen physischen Kern ausgeführt wird, weisen Sie ihn einem einzelnen logischen Prozessor zu.

Der Grund, warum der Prozess "herumspringt", ist auf den Prozess-Scheduler zurückzuführen. Dies ist ein normales Verhalten, und Sie werden wahrscheinlich die Leistung reduzieren, wenn Sie beschränken, auf welchen Prozessorkernen der Prozess ausgeführt werden kann (unabhängig von der Anzahl der Threads), da der Prozesszeitplaner jetzt härter arbeiten muss, damit alles mit den auferlegten Einschränkungen funktioniert. Ja, diese Strafe ist in den meisten Fällen vernachlässigbar, aber das Endergebnis ist, es sei denn, Sie haben einen Grund, dies zu tun .

4
David Schwartz

Das CPU-Layout sollte so organisiert sein, dass ein Betriebssystem, das nicht alle Ihre CPUs erkennt, die maximal mögliche Leistung erreicht. Das bedeutet, dass ein virtueller Kern von jedem physischen Kern aufgelistet wird, bevor ein zweiter virtueller Kern von einem physischen Kern aufgelistet wird.

Angenommen, Sie haben vier Hyper-Threading-Kerne, die als A, B, C und D bezeichnet werden. Wenn Sie davon ausgehen, dass A und B einen L2-Cache und C und D einen L2-Cache gemeinsam verwenden, sollte die Reihenfolge etwa wie folgt lauten:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

Auf diese Weise kann ein Betriebssystem, das nur zwei CPUs beansprucht, den gesamten L2-Cache verwenden. Außerdem kann ein Betriebssystem, das nur vier CPUs beansprucht, alle Ausführungseinheiten verwenden.

Auch dies soll so sein.

Wenn Sie ein Betriebssystem verwenden, das Ihre CPU-Topologie versteht, spielt es keine Rolle. Das BIOS füllt eine Tabelle aus, in der erklärt wird, welche Kerne sich Ausführungseinheiten, welche Cache-Speicher usw. teilen. Jedes moderne Betriebssystem, das Sie wahrscheinlich verwenden werden und das Ihre CPU vollständig unterstützt, versteht die gesamte CPU-Topologie.

1
afrazier
  1. Wie sie übereinstimmen, hängt davon ab, wie Ihre CPU und Ihr Motherboard die Kerne auflisten und identifizieren. Was soll passieren, ist, dass physische Sockets zuerst aufgelistet werden, logische Kerne als Nächstes und virtuelle Kerne als letzte. In Ihrem Fall sollten die Kerne 0-3 physische Kerne und 4-7 die virtuellen HT-Kerne sein. Der Hauptgrund dafür ist, dass für den Fall, dass Sie ein Betriebssystem ausführen, das nicht mit allen verfügbaren Ausführungseinheiten umgehen kann, höchstwahrscheinlich die meisten unabhängigen Einheiten vor den gemeinsam genutzten Einheiten stehen. Es wäre nicht gut, wenn ein hypothetisches 2-CPU-Betriebssystem anstelle von zwei verschiedenen Kernen ein HT-Paar in Ihrem System finden würde. (Dies war ein echtes Problem für einige frühe HT-Systeme, bevor Kernel-Scheduler für die neuen CPUs aktualisiert werden konnten.)
  2. Nr. Siehe 1.
  3. HT ist komplexer als das. Denken Sie daran, dass die zwei virtuellen Kerne häufig einige Ressourcen gemeinsam nutzen, während andere Bits voneinander getrennt sind, dass jedoch nur einer der beiden Kerne gleichzeitig ausgeführt werden kann.
  4. Art von. Ihr Beispiel ist (in Anbetracht der Annahmen) im Allgemeinen korrekt. Wenn die Anwendung jedoch weiß, welche Art von Workload ausgeführt wird, kann das Betriebssystem Threads entsprechend planen.
  5. Es gibt einen sehr guten Grund für Core-Hopping: Die thermische Belastung zu verteilen. Da in vielen Fällen ohnehin übergeordnete Caches (L2, L3) von allen Kernen gemeinsam genutzt werden, hat das Core-Hopping keine signifikanten Auswirkungen auf die Leistung, aber die Auswirkungen auf die Temperatur sind erheblich, da Sie keinen "Hot Spot" haben der eine Kern läuft ständig, während die anderen untätig sitzen. Nun können Kreuzsteckdosen in einem Multi-Sockel-System (insbesondere einem NUMA-System) erhebliche Auswirkungen auf die Leistung haben. Die meisten Scheduler sind sich dessen bewusst und berücksichtigen dies jedoch.

Letztendlich läuft es darauf hinaus, dass Sie (als Endbenutzer) oft wenig mit Thread-Affinität tun können, um die Leistung erheblich zu beeinträchtigen, außer sicherzustellen, dass Sie ein aktuelles Betriebssystem ausführen, das über die verschiedenen Bits in informiert ist dein System.

Wenn Sie Workloads finden, bei denen die manuelle Zuweisung von Affinität erhebliche Auswirkungen hat, melden Sie dies dem Anwendungsentwickler als Fehler, damit das Programm behoben werden kann.

"Kerne 0-3 sollten physische Kerne und 4-7 die virtuellen HT-Kerne sein. Tatsächlich entsprechen Kern 0 und Kern 1 dem gleichen (einzigen) physischen Kern. Jeder "Hyperthreaded Core" hat zwei physische Verbindungen zur CPU, sodass Windows 8 physische Cores erkennt. Es weiß nur, dass die CPU Hyperthreading hat. Weitere Informationen hierzu finden Sie im Intel Core-Datenblatt. Breakthrough vor 13 Jahren 4