CPU-Zeit für HyperThreading-Systeme unter Linux

645
grandrew

Ich versuche, den Arbeitsaufwand einer Multithread-Anwendung abzuschätzen. Dies ist eine ziemlich einfache Aufgabe mit echten CPU / Cores, da ich einfach die CPU-Zeit von proc nehmen kann. Dies wird eine Schätzung der CPU-Auslastung einer Anwendung sein.

Aber was ist mit HT-fähigen Prozessoren? Wie wird die Zeit gezählt? Wenn der Thread nur wartet, bis die Prozessor-Pipeline im Falle eines HT-Rennens frei wird - wird dies als Zeit in der CPU gezählt? Oder wenn der Thread 10% von HT ausnutzen könnte, zählt er 10% der tatsächlichen CPU-Laufzeit.

0

1 Antwort auf die Frage

1
Jamie Hanrahan

Sorry, aber es ist sehr unbestimmt.

Wenn Sie HT aktiviert haben, haben Sie pro Kern zwei logische Prozessoren. Wenn Sie es deaktiviert haben, haben Sie nur einen. (Dadurch können wir über die Funktionsweise des Schedulers sprechen, ohne ständig zu definieren, was wir unter einer "CPU" verstehen.) In jedem Fall wird ein logischer Prozessor vom Betriebssystem als Prozessor betrachtet, und mit Ausnahme einiger Versuche, Optimierungen einzuplanen, macht das Betriebssystem dies nicht nichts anderes durch, für oder wegen Hyperthreading.

Ab dem Zeitpunkt, zu dem ein LP-Kontext zu einem Thread wechselt, bis zu einem anderen Thread, wird davon ausgegangen, dass der LP zu 100% von diesem Thread verwendet wird. Das Betriebssystem hat keine Möglichkeit zu wissen, ob ein Thread in einer LP 10% des Kerns oder 90% des Kerns verwendet oder vollständig wegen eines Problems blockiert ist, das der Thread in der anderen LP ausführt. Das Betriebssystem glaubt nur, dass es läuft.

HT implementiert auch keine Thread-Prioritäten. Wenn also zwei Threads versuchen, in den beiden LPs eines Kerns zu laufen, und einer im Betriebssystem auf eine höhere Priorität als der andere gesetzt ist, kann der Kern nichts dagegen tun - es gibt keine Möglichkeit, es überhaupt zu wissen. Der Kern behandelt die beiden Threads als gleichrangig und weist die Ressourcen der Mikroarchitektur entsprechend zu.

* Optimierungen: Moderne Betriebssysteme kennen die Beziehung zwischen LPs und Kernen und versuchen beispielsweise, nur eine LP aus jedem Kern zu verwenden, bis mehr als number_of_cores- Threads ausgeführt werden sollen. Die zwei LP eines Kerns werden hinsichtlich der Cache-Investitionen als gleichwertig betrachtet. usw.

Jamie, danke für eine gründliche Erklärung. Soweit ich es verstehe, versuchen Sie zu sagen, dass, falls ich "NTHREADS == NCORES" - logische Kernzeit ** habe, ** dies tatsächlich als CPU-Zeit zählt und die tatsächliche Anzahl an Anweisungen, die sie gemeinsam nutzen konnte, nicht berücksichtigt wird. Ich bekomme also praktisch die doppelte CPU-Zeit mit aktiviertem HT und wahrscheinlich die Hälfte der durchschnittlichen FLOPS pro (LP) -Kern bei (vollständig) angemessenem Warteschlangen? grandrew vor 7 Jahren 0
F1: Ja, obwohl ich Ihre Phrase nicht mit Anweisungen bezeichne, die sie teilen konnte - was würden Sie in dieser Situation mitteilen? F2: Ja, bei aktiviertem HT und "NTHREADS == 2xNCORES" würden Sie 2x die scheinbare CPU-Zeit sehen, aber nicht 2x die geleistete Arbeit. Drittens: Wenn die FP-Einheit des Kerns Ihr Engpass war, wenn HT deaktiviert war, dann wäre die gesamte FP-Arbeit bei HT und zwei Threads pro Kern ungefähr dieselbe Arbeit wie bei einem Thread pro Kern, aber jeder Thread würde nur die Hälfte des FP erhalten Durchbruch. Die FP-Leistung hängt jedoch auch von anderen Faktoren als der FP-Einheit ab (z. B. Speicherzugriff). Daher ist dies nicht sicher. Jamie Hanrahan vor 7 Jahren 0
Wie ich es sehe, wenn zwei Threads um die Zeit eines einzelnen Kerns in HT-CPU konkurrieren - können die Threads einen Teil des Kerns "teilen", anstatt darauf zu warten, dass der Kern frei wird. wartender Thread während der erste Thread ausgeführt wird. grandrew vor 7 Jahren 0
Nun, es gibt kein Konzept des "ersten Threads", dh keine der LPs hat Vorrang. Die Firmware versucht, die Ressourcen des Kerns zu planen, damit beide LPs Fortschritte erzielen können. Jamie Hanrahan vor 7 Jahren 0