Warum ist ein einzelner Thread über die CPUs verteilt?

24

Ich bin nur neugierig, warum der Scheduler eine App ständig zwischen CPUs verschiebt, anstatt sie auf einer zu belassen. Es sieht ein bisschen albern aus, 4 Kerne bei 25% anstatt eines bei 100% zu haben.

Hat es mit Wärme zu tun oder ist es irgendwie effizienter? Tun es andere Betriebssysteme anders?

Einblicke oder Links zu vertiefenden Themen wären nett. (Konnte nicht viel selbst finden.)

Aktualisieren:

Mit "ausbreiten" meine ich nicht, dass es auf mehreren CPUs gleichzeitig ausgeführt wird, sondern es wird mehrmals pro Sekunde von einer zur anderen verschoben, wodurch der Effekt entsteht, dass es ausgebreitet aussieht.

Macke
quelle
3
Selbst wenn "nichts anderes ausgeführt wird", gibt es immer Systemthreads, die um die CPU konkurrieren. Das Betriebssystem verfügt beispielsweise über einen Thread, mit dem freigegebene Speicherseiten auf Null gesetzt werden können. Wenn also Speicher benötigt wird, sind einige Seiten einsatzbereit. Wenn Ihr Thread erneut ausgeführt wird, wird die CPU, auf der Sie sich befanden, möglicherweise von einem dieser Threads verwendet. Was soll das OS tun? Warten Sie oder ziehen Sie auf eine neue CPU um? Was auch immer es tut, in einigen Fällen kommt es zu unerwünschtem Verhalten.
Tony Lee
Es ist eine Goomba. SMB, nicht LBP. :)
Macke
In meiner "Antwort" habe ich ein einzelnes Thread-Programm gezeigt, das sich genau so verhält, wie Sie es beschreiben, dh, es wurde mehrmals pro Sekunde von einem zum anderen verschoben, wodurch sich der Effekt ausbreitete.
Evan Rosica

Antworten:

8

Ich denke, wierobhat den Punkt ziemlich gut beschrieben.
Hier ist ein älterer Artikel diskutiert processor affinityEinstellungen mit einem Quad-Core QX6800 .
(Der Link verweist auf die zweite Seite dieses Artikels).

Wenn Sie keine Prozessaffinität zu einem Kern erzwingen, verlieren Sie an Leistung ?

  • Während der Windows-Scheduler eine solche Affinität festlegen muss, um eine Überlastung der Caches zu vermeiden, berücksichtigt
    das Prozessordesign selbst auch solche Aspekte.
  • Der Intel QX6800 Quad-Core (wie ich in dieser Antwort bereits erwähnt habe)
    verfügt über einen 8-MB- L3Cache, der auf seine 4 Kerne verteilt ist .

Es ist zu beachten, dass Sie möglicherweise nur diesen einen Single-Thread-Prozess auf dem System ausgeführt haben, während auf dem Betriebssystem selbst mehrere andere Aufgaben ausgeführt werden, die ebenfalls geplant werden müssen. Der Scheduler verteilt all diese Aktivitäten auf den verfügbaren Prozessorpool (oder die Prozessorkerne).


Mit der Nehalem- Architektur und NUMA können
Prozessoren über mehrere Sockets hinweg künftig auch Zugriffsbeschädigungen besser bewältigen.
Hier ist ein kurzes Bild von einer ArsTechnica-Seite zu NUMA .

Bildbeschreibung hier eingeben

Wenn Nehalem und i7Sie interessiert, habe ich noch einige Links zu dieser Antwort .

nik
quelle
Was lässt Sie denken, dass "Mit der Nehalem-Architektur und NUMA können Prozessoren über mehrere Sockets hinweg künftig auch besser auf Zugriffs-Thrash reagieren." ? Aus meiner Sicht macht NUMA den Speicher noch lokaler und prozessorbezogener, wodurch sich die Auswirkungen des Papierkorbs verschlechtern.
Roland Pihlakas
@RolandPihlakas, seit dieser Antwort ist schon eine Weile vergangen, aber als ich den Artikel von arstechnica und diese Punkte betrachtete, dachte ich, ich habe die Fähigkeit neuer Plattformen berücksichtigt, eine bessere Speicherkonnektivität zu haben und die Software, diese auszunutzen (anstatt diese Option mit zu haben) Mehrfachsteckdosen-Konfigurationen zu dieser Zeit, dh vor Nehalem).
Nik
6

Der Scheduler führt gerade den nächsten Thread aus, der zur Ausführung auf einem "freien" Kern / einer CPU bereit ist.

Über den Windows-Task-Manager können Sie einer bestimmten CPU einen Prozess zuordnen.

Mit 4 Kernen bei 25% werden 4 Threads gleichzeitig ausgeführt. Während ein Kern bei x% bedeutet, dass nur ein Thread ausgeführt wird. Ersteres ist also in einigen Fällen effizienter.

Während der Ausführung wird der Cache der CPU jedoch mit Daten gefüllt, auf die der Thread zugreift. Wenn der Thread also auf einer anderen CPU ausgeführt wird, kommt es zu mehr Cache-Fehlern, die teuer sind, da sich die Daten nicht im Cache dieser CPU befinden.

Was macht dein Thread? Wenn der Thread für eine sehr kurze Zeit "inaktiv" ist, ist der Kern, auf dem er zuvor ausgeführt wurde, möglicherweise von einer anderen Bedrohung besetzt, sodass Ihr Thread auf dem nächsten verfügbaren Kern ausgeführt wird. Was passiert, wenn Sie nur einen Kern angeben, der von Ihrem Prozess verwendet werden soll (z. B. einen Task-Manager)?

Wierob
quelle
3
afaik Windows Scheduler leistet gute Arbeit darin, Threads für die Dauer des Prozesses auf derselben CPU / demselben Core zu belassen, um dieses Problem zu vermeiden.
Paxxi,
@ Pär: Mein Thread scheint eigentlich auf jedem Kern zu laufen.
Macke
Ja, wahrscheinlich ist es das Betriebssystem, das meinen Thread durcheinander bringt. Wie akzeptiere ich zwei Antworten? :)
Macke
@Pärbjörklund aus meiner erfahrung macht zumindest Windows XP nicht. Ich denke, das "Cache-Bouncing" -Problem wurde in Vista oder höher
behoben
1
"Mit 4 Kernen bei 25% werden 4 Threads gleichzeitig ausgeführt." Nein, es bedeutet, dass ein Thread ausgeführt wird, ein bisschen auf einem Kern, dann auf einem anderen und so weiter. Da der Task-Manager eine durchschnittliche Auslastung aufweist, werden 25% (auf einem 4-Kern-System und auf einem 2-Kern-System 50%) für jeden Kern angezeigt. Dies bedeutet, dass der Kern ein Viertel der Zeit voll ausgelastet war und die restliche Zeit im Leerlauf war.
David Balažic
0

Es ist nicht. Ein Thread kann nur auf einem Prozessor ausgeführt werden. Einige Prozesse haben jedoch mehrere Threads, die verteilt werden können.

Die Überlegung, ob Sie es glauben oder nicht, hat nie darüber nachgedacht, wie es aussieht. Das System versucht, Fäden zu verteilen, da es nicht wissen kann, wann eine Spitze auftritt.

Tsilb
quelle
1
Siehe meine zusätzliche Klarstellung. Dies ist ein Thread, der mit Vollgas läuft und schnell verschoben wird, sodass mit der Zeit jeder Kern (außerhalb des Vordergrunds) zu 25% ausgelastet ist. (Alle anderen Prozesse / Threads sind vernachlässigbar)
Macke
0

Das Betriebssystem migriert den Thread über CPU-Kerne (schnell, mehrmals pro Sekunde). Es ist effizienter, es die ganze Zeit auf demselben Kern auszuführen. Dies kann durch den Kontextmenüpunkt "Affinität festlegen" im Task-Manager erzwungen werden.

Beachten Sie, dass der Unterschied normalerweise (bei normaler Verwendung zu Hause) im Bereich weniger Prozent liegt.

Die Angabe "4 Kerne mit jeweils 25% Auslastung" bedeutet, wie der Task-Manager die durchschnittliche Auslastung angibt, dass jeder Kern ein Viertel der Zeit voll ausgelastet und den Rest der Zeit frei war.

Die Beschreibung gilt für Windows, ist aber auch auf anderen Betriebssystemen ähnlich.

David Balažic
quelle
-1

Wenn jemand dies noch liest, habe ich es auch bemerkt und einige Tests durchgeführt, um festzustellen, ob es nicht nur ein Zufall ist. Es stellt sich heraus, dass es nicht ist! Ich halte es aus mehreren Gründen für effizienter, einen einzelnen Thread über alle Kerne zu verteilen:

  1. Das Verteilen eines Threads auf alle Kerne ermöglicht einen geringeren Stromverbrauch. Die meisten Prozessoren senken ihre Frequenzen und, was noch wichtiger ist, die Spannung entsprechend der Last, so dass beispielsweise ein Core 2 Quad viel weniger Strom verbraucht und weniger Wärme erzeugt, indem ein Thread auf alle 4 Kerne verteilt wird, anstatt einen Kern zu verwenden (was der Fall wäre) führen dazu, dass die Spannung an ALLEN Kernen ansteigt, da es nur einen Spannungsregler gibt * - das ist ziemlich ineffektiv).
  2. Dies stellt sicher, dass der Faden immer mit maximaler / konstanter Geschwindigkeit läuft. Wenn der Thread plötzlich mehr Rechenleistung anfordert, kann ein Kern überlastet werden und die Ausführung verzögert sich. Durch die Verteilung auf die Kerne wird jede plötzliche Spitze reibungslos und ohne Verzögerungen und Verzögerungen verarbeitet.

Aufgrund der obigen zwei Beobachtungen bin ich zu dem Schluss gekommen, dass Turbo Boost und IDA unwirksam sind. Sie mögen auf älteren Betriebssystemen nützlich sein, aber Linux und Windows 7 verteilen alles ziemlich effizient auf alle Kerne. Also, ein Core 2 Quad q9100 mit 2,26 GHz wird fast (es gibt immer Ausnahmen :-) immer schneller sein als ein Core 2 Duo X9100 mit 3,06 GHz, und ich habe selten gesehen, dass er IDA verwendet (im Grunde genommen der Vorgänger von Turbo Boost). Erhöht die Frequenz auf einem oder zwei Kernen nur für Anwendungen mit einem Thread.

  • Der Core 2 Quad verfügt über zwei Taktdomänen, da zwei physische Chips vorhanden sind, sodass zwei Kerne mit voller Frequenz ausgeführt werden können, während zwei Kerne mit der niedrigsten Frequenz arbeiten. Ich weiß jedoch nicht, ob es zwei Spannungsregler gibt - mir ist aufgefallen, dass die Spannung über alle 4 Kerne gleich ist, daher muss es nur einen Regler für das gesamte Paket geben.
JakL
quelle
3
Dies klingt aus mehreren Gründen zweifelhaft. Bitte geben Sie Hinweise auf Ihre "Fakten". Erstens, warum verbraucht die Rechenleistung von 25% auf vier Kernen weniger als 100% auf einem? (Ich kann dem zustimmen, dass die Wärme gleichmäßiger verteilt wird, aber ...) Außerdem läuft der Thread in meiner Frage mit voller Neigung (100%), sodass nicht "mehr Verarbeitungsleistung angefordert wird", da dies bereits geschieht so viel wie möglich.
Macke
Nun, das geht nur auf meine eigenen Beobachtungen zurück - ich war fasziniert von IDA und TurboBoost und habe beschlossen, einige Tests durchzuführen. Es ist schon eine Weile her, aber ich bin zu den obigen Schlussfolgerungen gekommen. Der Prozessor verbraucht weniger Strom, da alle Kerne mit einer niedrigeren Spannung betrieben werden - eine Reduzierung um 0,1 V spart etwa 6 bis 10 Watt Strom (wenn ein Kern zu 100% geladen ist, werden alle Kerne mit einer höheren Spannung betrieben, unabhängig davon, ob sie sich im Leerlauf befinden oder nicht). Dies gilt insbesondere für Core2Duo mit SLFM-Modus. Sie haben Recht damit, dass der Thread mit voller Geschwindigkeit läuft und keine weiteren Prozessortakte anfordert, aber es gibt Apps, die dies tatsächlich tun.
JakL
Es gibt kein "Verbreiten eines Fadens" (nein, nicht einmal 5 Jahre später). Es gibt einen einzelnen Thread, der auf einem Kern ausgeführt wird. Und dann später noch einen. Und so weiter. In jedem Moment läuft ein Kern mit 100% und die anderen laufen im Leerlauf. Es wird also nicht gespart. Vor allem, wenn Sie erwähnen, dass alle Kerne ohnehin die ganze Zeit über unter Spannung stehen (wie Sie sagten, sie teilen sich die Spannung). Auch wie bereits angesprochen, wird sichergestellt, dass der Thread die gesamte Verarbeitungsleistung erhält, die es gibt. Da dieser Kern bereits zu 100% ausgelastet ist, plant das Betriebssystem andere Threads für andere, weniger ausgelastete Kerne.
David Balažic