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.
- Welche Kerne entsprechen jeder "CPU" unten?
- Stellen (sagen wir) CPU 6 und CPU 7 unten einen Kern dar? die HT und der wahre Kern?
- 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)
- 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?
- 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.
windows
scheduling
hyper-threading
affinity
Charles Burns
quelle
quelle
Antworten:
Angenommen, wir haben Core 1, 2, 3 und 4, dann repräsentieren CPU4 und CPU5 Core 3.
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.
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.
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.
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 !
quelle
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.
quelle
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.
quelle