Kernnutzung im Multithreading

LordArgaron

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
304
Hallo liebe Community,
vor nicht allzu langer Zeit kam mir ein Gedanke, dieser lautet:
Welche Kriterien nutzt eine CPU um Multitreading (2 Kernauslastung) optimal zu nutzen, bzw. die Treads den entsprechenden Kernen zuzuweisen?

Beispiel Core2Quad
[(Kern1+Kern2)L2 Cache + (Kern3+Kern4)L2 Cache] :

  • Diese CPU besteht aus 2 zusammengesetzten Core2Duo's.
  • Der Core2Duo hat 2 vollwertige Kerne mit je einem L1 Cache, aber einem gemeinsamgenutzen L2 Cache.
  • Dieser L2 Cache kann bei einem Tread einem Kern vollständig zugewiesen werden.

Dementsprechen müsste die CPU aus Leistungsgründen bei einer Auslastung von 2Kernen, Kern1 und Kern3 oder Kern2 und Kern4 nutzen. Bei der Nutzung von Kern1 und Kern2 oder Kern3 und Kern4 würde dann nicht die "volle" Leistung genutzt werden können weil dann der L2 Cache geteilt wird.

Beispiel "Bulldozer":

Ein Bild der Architektur. Dieses entspricht einem Modul. Die CPU hat dann noch zusätzlich einen L3 Cache den alle Module gemeinsam nutzen. Wie im Core2Quad beispiel würde ein 4-Kern "Bulldozer" aus 2 Modulen bestehen und einem L3 Cache. Hier müsste der Unterschied noch deutlicher sein. Der L3 Cache wird ja in jedem Fall geteilt.

EDIT:
cutulhu schrieb:
Hallo,

ich denke mal, die Kriterien für die Nutzung der Kerne bestimmt das OS bzw. die entsprechend programmierte Software. Die CPU stellt nur die Rechenwerke zur Verfügung.

Wenn die Software oder das OS die Kerne bestimmt, meint ihr das mein Gedanke berücksichtigt wird? Wenn ja, wie?
 
Zuletzt bearbeitet:
Hallo,

ich denke mal, die Kriterien für die Nutzung der Kerne bestimmt das OS bzw. die entsprechend programmierte Software. Die CPU stellt nur die Rechenwerke zur Verfügung.

Wenn die Software oder das OS die Kerne bestimmt, meint ihr das mein Gedanke berücksichtigt wird? Wenn ja, wie?

Die Zuweisung spezieller Kerne/Module kann nur ein Treiber übernehmen. Die Software sollte aber schon soweit parallel programmiert sein, dass sie überhaupt mehr als einen Kern nutzen kann.

Zum Bulldozer: Ein Modul entspricht ja nicht so ganz einem Dualcore. Die Integer-Einheiten sind getrennt, wärend die FPUs gemeinsam von zwei Kernen genutzt werden. Dies hat es in dieser Form (meines Wissens) noch nicht gegeben.
Mit der x87-Architektur hatte Intel in der CPU-Steinzeit mal so etwas ähnliches im Programm, aber das ist mit dem Bulldozer nicht wirklich vergleichbar. (kein gemeinsamer Cache, da baulich getrennte Fließkomma- und Integer-Einheit)
 
Zuletzt bearbeitet:
Der Vorteil von "gemeinsamen" Cache liegt darin, das ein Kern nicht alle Befehle nochmal laden und separat ablegen muss. Somit ist die Verteilung von Kern 1&2 für den gemeinsamen L2 für eine Multithread Anwendung schon ok. Besser wäre natürlich ein kompletter, gemeinsamer Cache für alle Kerne.
Kern 1&3 hätten zwar einen größeren L2 zur verfügung, müssten aber alle Befehle (Ausführungsoperatoren) eventuell doppelt laden.

Gruß
Ergänzung ()

Wie Windows diese Verteilung vornimmt kann ich nicht sagen, ich nehme aber an, dass es nach der einzelnen Auslastung der Kerne passiert.
 
Ist doch kein Problem, probier es aus. Im Taskmanager kann man nicht nur die Priorität zuweisen, sondern auch die Zugehörigkeit zur CPU festlegen. Ich habe da schon öfters Mal dran gedreht, nur merkt man eigentlich nichts. Man muss schon einen Benchmark laufen lassen, um was zu sehen. Wenn man es nicht wirklich spürt, dann kann man sich aber den Aufwand sparen.

MS hat ja in Windows 7 eine Art feste Bindung an einen Kern implementiert, die dafür sorgen soll, dass ein Thread nicht mehr von Kern zu Kern springt. Dieses ist besonders bei Thread sinnvoll, die auf 100% CPU-Last laufen. Dadurch, dass diese trotzdem springen geht Leistung verloren. Nur habe ich von dieser Technik noch nichts gemerkt, automatisch passiert da garnichts.

Um das Problem vollends los zu werden, muss man in Zukunft CPU kaufen die einen gemeinsamen L3 Cache haben.
 
kevchen01 schrieb:
Der Vorteil von "gemeinsamen" Cache liegt darin, das ein Kern nicht alle Befehle nochmal laden und separat ablegen muss. Somit ist die Verteilung von Kern 1&2 für den gemeinsamen L2 für eine Multithread Anwendung schon ok. Besser wäre natürlich ein kompletter, gemeinsamer Cache für alle Kerne.
Kern 1&3 hätten zwar einen größeren L2 zur verfügung, müssten aber alle Befehle (Ausführungsoperatoren) eventuell doppelt laden.

Laufen aber unterschiedliche Operationen dreht sich die Geschichte um oder? Weil die Kerne jeweils andere Daten benötigen.

ata2core schrieb:
Ist doch kein Problem, probier es aus. Im Taskmanager kann man nicht nur die Priorität zuweisen, sondern auch die Zugehörigkeit zur CPU festlegen. Ich habe da schon öfters Mal dran gedreht, nur merkt man eigentlich nichts. Man muss schon einen Benchmark laufen lassen, um was zu sehen. Wenn man es nicht wirklich spürt, dann kann man sich aber den Aufwand sparen.

MS hat ja in Windows 7 eine Art feste Bindung an einen Kern implementiert, die dafür sorgen soll, dass ein Thread nicht mehr von Kern zu Kern springt. Dieses ist besonders bei Thread sinnvoll, die auf 100% CPU-Last laufen. Dadurch, dass diese trotzdem springen geht Leistung verloren. Nur habe ich von dieser Technik noch nichts gemerkt, automatisch passiert da garnichts.
Habe nur einen Core2Duo:) Stimmt ich meine mich zu erinnern dass W7 besonderes Augenmerkt auf die Ausnutzung der Kerne legt, und eine manuelle Zuweisung nicht mehr nötig ist, bzw. sogar negative Auswirkungen mit sich bringen kann.
 
Du kannst ja nur die Tasks manuell den Kernen zuordnen, nicht deren einzelne Threads.
 
Zurück
Oben