Hyperthreading und wie Anwendungen davon profitieren

470
Erik9631

Ich habe mich für Hyper-Threading interessiert und wie können Anwendungen davon profitieren. Nach dem, was ich gelesen habe, wird das Hyper-Threading direkt vom Betriebssystem verwaltet. Es hängt davon ab, wie virtuelle Threads, die auf jedem Core ausgeführt werden, auf gemeinsam genutzte Ausführungseinheiten in jedem Core zugreifen. Die meisten Beiträge deuteten darauf hin, dass dies etwas ist, das Sie nicht interessieren sollten und das das Betriebssystem verwalten sollte.

Ich war mit der Antwort in Ordnung, bis ich in einem Spiel auf eine Einstellung stieß, die mich völlig abschreckte. Es gibt ein Spiel namens Arma 3, das in den Optionen eine Einstellung für "Hyper-Threading" hat. Ich habe mich ein bisschen umgesehen und bin auf einen Beitrag des Entwicklers gestoßen, in dem erklärt wird, was die Einstellung bewirkt. Er hat genau das gesagt

Die Engine sagt, dass sie HT-Kerne nur für Threads mit kleineren Aufgaben / Mikrojobs verwenden soll. Denken Sie jedoch daran, dass -cpuCount = -enableHT negiert

Nun, was ich über HT gelesen habe und wie es funktioniert, sollte es keine direkte Möglichkeit geben, der Anwendung zu sagen, dass sie Hyper-Threading verwenden soll. Offenbar bewirkt die Einstellung "etwas Magie" in der Engine, dass HT für bestimmte Aufgaben verwendet wird.

Könnte jemand bitte das für mich klären? Weil es ehrlich verwirrend ist. Vielen Dank.

0

1 Antwort auf die Frage

0
Austin Hemmelgarn

Um zu erklären, warum Hyper-Threading überhaupt hilft, ist eine Erklärung erforderlich, was genau es ist und wie Ressourcen in einem Prozessor gemeinsam genutzt werden.

Hintergrund

Eine herkömmliche Multi-Core-CPU teilt sich in Bezug auf die internen Ressourcen sehr wenig zwischen den Kernen. In den meisten älteren Fällen wurde nur der L3-Cache (und möglicherweise L4, falls vorhanden) zwischen Cores gemeinsam genutzt, alles andere war für jeden Core eindeutig. Aufgrund der Funktionsweise von Computern führt dies dazu, dass die meisten Teile eines Kerns nicht von jedem darauf ausgeführten Befehl tatsächlich verwendet werden.

Der Umgang mit dieser Ineffizienz ist der Punkt, an dem Hyper-Threading eingesetzt wird. Die allgemeine Idee ist, dass durch das Aufteilen vieler Ressourcen zwischen zwei (oder mehr) Kernen nahezu derselbe Arbeitsaufwand erreicht wird, der weitaus weniger Speicherplatz (und Leistung) erfordert. Die Einschränkung hierauf ist natürlich, dass Sie nicht wirklich 100% von dem ausführen können, was Sie auf einer CPU mit einer Anzahl physischer Kerne ausführen könnten, die der Anzahl Ihrer Threads entspricht.

Es ist wahrscheinlich erwähnenswert, dass Hyper Threading nicht dasselbe ist wie das von einigen anderen CPU-Architekturen (POWER, SPARC und (wahrscheinlich) AMDs Ryzen-Chips) bereitgestellte symmetrische MultiThreading. SMT ist viel näher an einem klassischen Multicore-Design und leidet nicht unter den meisten Problemen, die Hyper Threading hat.

Wenn Sie also nicht einfach irgendetwas auf allen Kernen ausführen können, wozu ist es dann gut?

Nun, es ist eigentlich schwer zu sagen. Um den größtmöglichen Nutzen zu erzielen, müssen Sie tatsächlich ähnlichen Code zu Paaren von Threads gruppieren, die Ressourcen in der CPU gemeinsam nutzen.) Aber selbst dann ist es schwierig zu wissen, ob Hyper-Threading tatsächlich viel helfen wird. Einige ältere Betriebssysteme haben diese Art der Gruppierung überhaupt nicht vorgenommen, und die Ergebnisse werden immer noch als Paradebeispiel für den Ausdruck "pathologisch schlecht" angesehen. Neuere Systeme bilden zwar eine gewisse Gruppierung, sind aber immer noch nicht perfekt.

E / A-umfangreiche Aufgaben (z. B. Webserver und Datenbanken) profitieren in der Regel zumindest teilweise von Hyper-Threading, aber wie viel davon profitieren wird, hängt davon ab, was genau sie tun, und sie sind einer der wenigen Fälle, in denen dies der Fall ist hat einen ziemlich klaren Vorteil.

Es ist jedoch ziemlich gut bekannt, welche Arten von Workloads mit SMT schlechter abschneiden. So ziemlich alles, was alle CPU-Kerne bei 100% Last nutzen muss, wird nicht viel von SMT profitieren, wenn überhaupt. Bei HT-Chips läuft es manchmal langsamer als bei ausgeschaltetem HT. Bei einigen anderen Implementierungen kann es je nach Ausführung etwas verbessern oder verschlimmern, je nachdem, was gerade ausgeführt wird (SPARC-Chips eignen sich zum Beispiel gut für solche Workloads, sofern sie nicht wirklich tief verschachtelte Funktionsaufrufe ausführen).

OK, was ist mit dieser Arma 3-Sache?

Wie oben erwähnt, kann Hyper-Threading sehr schlechte Ergebnisse für Ihre Leistung bewirken, wenn Sie die Dinge nicht auf jedem Kern sinnvoll zusammenfassen. Die für diese Gruppierung erforderliche Logik ist normalerweise spezifisch für eine bestimmte Software. Der oben genannte Schalter für Arma 3 steuert nur, ob diese Logik aktiviert ist oder nicht. Nun, da es nicht automatisch erkannt wird, bin ich nicht ganz sicher (es ist nicht so, dass es schwierig ist herauszufinden, ob Hyper-Threading verwendet wird oder nicht).

Können Sie durch "Gruppieren des Codes" angeben, was Sie meinen. Ich habe nach C ++ - Kanälen gegoogelt (seit ich ein C ++ - Entwickler bin) und von dem, was ich gelesen habe, gibt es keine Möglichkeit, programmgesteuert Hyperthreading zu verwenden. Alles was Sie tun müssen, ist einen Thread hochzufahren und das Betriebssystem damit umgehen zu lassen. Kannst du das erklären? Erik9631 vor 6 Jahren 0
@ Erik9631 Es gibt keine Möglichkeit, HyperThreading programmgesteuert direkt zu verwenden. Sie können dem Scheduler jedoch mitteilen, welchen logischen Kern jeder Ihrer Threads und Prozesse verwenden soll. Auf diese Weise können Sie steuern, auf welchem ​​Thread auf welchem ​​physischen Kern er ausgeführt wird. Der Systemaufruf für Linux heißt "sched_setaffinity". Ich bin mir nicht ganz sicher, was das Windows-Äquivalent ist, aber ich weiß, dass eines existiert. Bei den meisten Systemen sind die beiden Threads in der logischen Kernreihenfolge gruppiert (0 und 1 sind ein physischer Kern, 2 und 3 sind der nächste usw.), so dass es schwierig ist, die Platzierung herauszufinden. Austin Hemmelgarn vor 6 Jahren 0