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

25

Wie funktioniert die Windows-Prozessoraffinität bei Hyperthread-CPUs? Lassen Sie uns ein Beispiel (im Bild) eines Systems mit vier Kernen verwenden, von denen jeder einen virtuellen Kern mit Hyper-Thread aufweist.

  1. Welche Kerne entsprechen jeder "CPU" unten?
  2. Stellen (sagen wir) CPU 6 und CPU 7 unten einen Kern dar? die HT und der wahre Kern?
  3. Wenn zum Beispiel CPU 6 einen realen Kern und CPU 7 einen HT-Kern darstellt, erhält ein Thread, der nur CPU 7 zugewiesen ist, nur die verbleibenden Ressourcen eines realen Kerns? (unter der Annahme, dass der Kern andere Aufgaben ausführt)
  4. Wird das Hyperthreading vollständig im Prozessor verwaltet, sodass Threads intern durcheinander gebracht werden? Wenn ja, liegt das am CPU-Bereich oder am Kernbereich? Beispiel: Wenn CPU 6 und 7 einen Kern darstellen, spielt es keine Rolle, welchem ​​Prozess ein Prozess zugewiesen ist, da die CPU einem laufenden Thread die entsprechenden Ressourcen zuweist?
  5. Ich stelle fest, dass lang andauernde Single-Thread-Prozesse, zumindest laut Task-Manager, ziemlich häufig um Kerne herumlaufen. Bedeutet dies, dass das Zuweisen eines Prozesses zu einem einzelnen Kern die Leistung ein wenig verbessert (durch Vermeiden von Kontextwechseln und Cache-Ungültigkeiten usw.)? Wenn ja, kann ich wissen, dass ich nicht "nur einen virtuellen Kern" zuordne?

Das ist alles sehr vage und verwirrend für mich. HT ist großartig, aber es scheint die Transparenz der Ressourcenzuweisung zu verringern.

Processor affinity menu

Charles Burns
quelle
Damit Sie wissen, ist jeder CPU-Kern, den Sie sehen, ein "virtueller Kern". Jeder hat eine physische Verbindung zur CPU. Der Begriff "virtuell" leitet sich aufgrund der Hardware-Hyperthreading-Implementierung davon ab, wie Windows Prozesse auf diesen CPUs plant. Siehe meine Antwort für weitere Details.
Breakthrough
Auch ein letzter Kommentar für Sie. "HT ist großartig, aber es scheint die Transparenz der Ressourcenzuweisung zu verringern." Dies ist zu 100% wahr, aber Sie können weder etwas dagegen tun, noch gibt es viel Grund zum Sie etwas dagegen zu tun. Alle modernen Betriebssysteme wissen, was Hyperthreading ist, die meisten haben fortschrittliche Prozessor-Scheduler, um dies zu kompensieren, und abgesehen von wenigen speziellen Fällen (und ich meine nur wenigen) gibt es fast immer einen Leistungsvorteil.
Breakthrough

Antworten:

17

Welche Kerne entsprechen jeder "CPU" unten?

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

Stellen (sagen wir) CPU 6 und CPU 7 unten einen Kern dar? die HT und der wahre Kern?

Es gibt keine Unterscheidung zwischen den beiden - beide haben physikalische Hardwareschnittstellen zur CPU, die logische Schnittstelle ist in Hardware implementiert (siehe Intel Core Prozessor Datenblatt, Band 1 für mehr Details). Grundsätzlich verfügt jeder Core über zwei separate Ausführungseinheiten, die sich jedoch einige gemeinsame Ressourcen teilen. Aus diesem Grund kann Hyperthreading in bestimmten Fällen die Leistung beeinträchtigen.

Wenn z. B. CPU 6 einen realen Kern und CPU 7 einen HT-Kern darstellt, erhält ein Thread, der nur CPU 7 zugewiesen ist, nur die verbleibenden Ressourcen eines realen Kerns? (unter der Annahme, dass der Kern andere Aufgaben ausführt)

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

Wird das Hyperthreading vollständig im Prozessor verwaltet, sodass Threads intern durcheinander gebracht werden? Wenn ja, liegt das am CPU-Bereich oder am Kernbereich? Beispiel: Wenn CPU 6 und 7 einen Kern darstellen, spielt es keine Rolle, welchem ​​Prozess ein Prozess zugewiesen ist, da die CPU einem laufenden Thread die entsprechenden Ressourcen zuweist?

Beide. Die eigentliche Hardware tut dies nicht Planen Sie, auf welchen Kernen Programme ausgeführt werden sollen. Dies ist die Aufgabe des Betriebssystems. Die CPU selbst ist jedoch für die gemeinsame Nutzung von Ressourcen zwischen den tatsächlichen Ausführungseinheiten verantwortlich, und Intel schreibt vor, wie Sie Code schreiben können, um dies so effizient wie möglich zu gestalten.

Ich stelle fest, dass lang andauernde Single-Thread-Prozesse, zumindest laut Task-Manager, ziemlich häufig um Kerne herumlaufen. Bedeutet dies, dass das Zuweisen eines Prozesses zu einem einzelnen Kern die Leistung ein wenig verbessert (durch Vermeiden von Kontextwechseln und Cache-Ungültigkeiten usw.)? Wenn ja, kann ich wissen, dass ich nicht "nur einen virtuellen Kern" zuordne?

Das ist normal und nein, es einem einzelnen Kern zuzuweisen nicht Leistung verbessern. 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", liegt am Prozess-Scheduler. Dies ist ein normales Verhalten, und Sie werden höchstwahrscheinlich Leistungseinbußen feststellen, wenn Sie einschränken, auf welchen Kernen der Prozess ausgeführt werden kann (unabhängig von der Anzahl der Threads), da der Prozess-Scheduler jetzt härter arbeiten muss, damit alles mit den auferlegten Einschränkungen funktioniert. Ja, diese Strafe mag in den meisten Fällen vernachlässigbar sein, aber das Endergebnis ist es es sei denn, Sie haben einen Grund, dies zu tun, nicht !

Breakthrough
quelle
5

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

Angenommen, Sie haben vier Hyper-Thread-Kerne mit den Namen A, B, C und D. Wenn Sie davon ausgehen, dass A und B einen L2-Cache und C und D einen L2-Cache gemeinsam nutzen, sollte die Reihenfolge folgendermaßen aussehen:
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 erfasst, den gesamten L2-Cache nutzen. Außerdem kann ein Betriebssystem, das nur vier CPUs erfasst, alle Ausführungseinheiten verwenden.

Wieder ist das so, wie es sein soll.

Natürlich spielt es keine Rolle, wenn Sie ein Betriebssystem verwenden, das Ihre CPU-Topologie versteht. Das BIOS füllt eine Tabelle aus, in der erläutert wird, welche Cores die Ausführungseinheiten, welche Caches usw. gemeinsam nutzen. Jedes moderne Betriebssystem, das Sie wahrscheinlich verwenden und das Ihre CPU vollständig unterstützt, versteht die vollständige CPU-Topologie.

David Schwartz
quelle
1
  1. Wie sie sich entsprechen, hängt davon ab, wie Ihre CPU & amp; Motherboard Auflisten und Identifizieren der Kerne. Was passieren soll, ist, dass physische Sockets zuerst aufgelistet werden, logische als nächstes und virtuelle zuletzt. In Ihrem Fall sollten die Kerne 0-3 physische Kerne und 4-7 virtuelle HT-Kerne sein. Der Hauptgrund dafür ist, dass, wenn Sie ein Betriebssystem ausführen, das nicht alle verfügbaren Ausführungseinheiten verarbeiten kann, die unabhängigsten Einheiten wahrscheinlich zuerst vor den gemeinsam genutzten Einheiten abgerufen werden. Es wäre nicht gut, wenn ein hypothetisches 2-CPU-Betriebssystem in Ihrem System ein HT-Paar anstelle von zwei unterschiedlichen Kernen 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. Siehe 1.
  3. HT ist komplexer als das. Denken Sie daran, dass die beiden virtuellen Kerne häufig Ressourcen gemeinsam nutzen, während andere Bits getrennt sind. Es kann jedoch immer nur einer der beiden gleichzeitig ausgeführt werden.
  4. Art von. Ihr Beispiel (unter den gegebenen Annahmen) ist im Allgemeinen korrekt. Wenn die Anwendung jedoch weiß, welche Art von Workload ausgeführt wird, kann sie dem Betriebssystem dabei helfen, Threads entsprechend zu planen.
  5. Es gibt einen sehr guten Grund für das Core-Hopping: die Verteilung der thermischen Belastung. Da in vielen Fällen Caches höherer Ebene (L2, L3) ohnehin auf alle Kerne verteilt sind, hat das Core-Hopping keine signifikanten Auswirkungen auf die Leistung, die thermische Auswirkung ist jedoch erheblich, da Sie keinen "Hot Spot" haben der eine Kern, der ständig läuft, während die anderen im Leerlauf sitzen. Das Überkreuzen von Sockets in einem Multi-Socket-System (insbesondere einem NUMA-System) kann nun eine erhebliche Auswirkung auf die Leistung haben. Die meisten Scheduler sind sich dessen bewusst und berücksichtigen dies.

Letztendlich läuft dies darauf hinaus, dass Sie (als Endbenutzer) mit der Thread-Affinität oft nur wenig anfangen können, um die Leistung erheblich zu beeinträchtigen, außer sicherzustellen, dass Sie ein aktuelles Betriebssystem verwenden, das über die verschiedenen Komponenten informiert ist dein System.

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

afrazier
quelle
4
"Die Kerne 0-3 sollten physische Kerne sein und 4-7 die virtuellen HT-Kerne" Tatsächlich entsprechen Kern 0 und Kern 1 demselben (einzelnen) physischen Kern. Jeder "Hyperthread-Kern" verfügt über zwei physische Verbindungen zur CPU, sodass Windows buchstäblich 8 physische Kerne erkennt. Es weiß nur, dass die CPU Hyperthreading hat. Weitere Informationen hierzu finden Sie im Intel Core-Datenblatt.
Breakthrough
@Breakthrough Das wäre keine gute Topologie, da dies bedeuten würde, dass ein naives Betriebssystem, das nur 4 Kerne unterstützt, nur die Hälfte der physischen Kerne benötigt. Ein virtueller Kern von jedem physischen Kern sollte in der Liste der virtuellen Kerne erscheinen, bevor ein zweiter virtueller Kern von einem physischen Kern aufgelistet wird.
David Schwartz
@DavidSchwartz Gute Topologie oder nicht, so werden die logischen Prozessoren aufgelistet. Es wird daher allgemein empfohlen, das Hyperthreading auf frühen Betriebssystemen (z. B. Windows 2000 und früher) zu deaktivieren, bei denen die LPs nicht ordnungsgemäß im Vergleich zu den Kernen und den physischen CPU-Paketen aufgeführt sind.
Jamie Hanrahan