Bulldozer - wie werden 2 working Threads verteilt?

wbjc2007

Lieutenant
Registriert
Apr. 2008
Beiträge
637
Hallo miteinander,

ich hab' mir mal so ein bisschen Gedanken zum Bulldozer und seinen "Modulen" gemacht.

Angenommen wir haben einen dieser Bulldozers mit mindestens 2 Modulen. Ein Programm, z.B. ein Spiel kann jetzt (weil es vielleicht ein bisschen älter ist) nur 2 Prozessorkerne belasten, bzw. es kann maximal 2 Threads.
Nun ist es ja so, daß die Module vom Bulldozer mehr oder weniger 2 Kerne enthalten, aber diese eben auf bestimmte "Einheiten" nur gemeinsam zugreifen können, was im Endeffekt bedeutet, daß ein Modul mit 2 Kernen nur etwa 80% der Leistung von 2 "normalen" Prozessorkernen hat. (Die 80% hab ich mal wo aufgeschnappt, ich hoffe, ich habe das richtig interpretiert).

Das Programm, das mit 2 Threads arbeitet, muß jetzt also auf dem Prozessor ausegführt werden. Was macht denn jetzt Windows damit? Wenn es die 2 Threads auf 1 Modul schickt, dann hat das Programm eine geringere ausführungsgeschwindigkeit, als wenn die Threads auf 2 Module geschickt würden, oder?

Wird das im Prozessortreiber geregelt? Oder muß man da hoffen?
Was passiert wenn Windows die Threads zwischen den Kernen hin und her schiebt, und dann mal beide auf einem Modul laufen, und manchmal auf 2 Modulen laufen?

Sorry, das ist jetzt eher hypothetisch, und ich weiß, man sollte mal abwarten.
Aber generell würde mich die Frage nach der Handhabung in Windows schon interessieren.

Danke Euch!
 
da jedes modul als 2 Threads behandelt wird, wird es in erster Linie so sein, dass es willkürlich verteilt wird
 
Man wird die Benchmarks abwarten müssen. Aber allgemein:

daß ein Modul mit 2 Kernen nur etwa 80% der Leistung von 2 "normalen" Prozessorkernen hat
Der zweite Kern bringt 80% richtig. Wenn also nur ein Kern belastet wird sind es 100%.
(Weil die Architektur von 2 Kernen gemeinsam genutzt wird. Bleibt der zweite Kern im Idlemodus so kann Kern 1, die FPU und den Cache alleine nutzen und bringt daher eine höhere Leistung.

Im Endeffekt bringt ein Modul daher 180% Leistung eines Prozessorkerns.

Da Bulldozer auch eine dynamische Übertaktung der Kerne vornimmt würde sich in dem Fall jeweils ein Kern eines Moduls hochtakten.

Ich vermute mal schwer, dass dieses dynamische Vorgehen vom Prozessortreiber gesteuert wird. AMD wird das schon praktikabel umgesetzt haben.
 
Generell würde ich vom Windows Scheduler nicht allzu viel erwarten, z.B. hat Intel HyperThreading schon 2002 eingeführt, aber der Scheduler kann erst seit Windows 7 also 2009 dank CoreParking halbwegs vernünftig damit umgehen.
In einem Bulldozer Modul haben beide Cores ihre eigenen Integer Executionunits, während sie sich die so genannte Flex FP teilen müssen. Dabei kann ein Thread diese ganz belegen und eine 256bit AVX oder 2 128bit SSE Instruktionen ausführen oder er teilt mit dem anderen Thread und führt nur eine 128bit SSE Operation aus.
Dazu kommt noch, dass sich beide Cores in einem Modul den L2 Cache teilen müssen und so in eher seltenen Fällen von einer sehr schnellen Kommunikation profitieren können. Auf der anderen Seite kann Cache Trashing auftreten, d.h. beide Cores verdrägen immer genau die Daten, die der jeweils andere gerade benötigt.
Wenn der Scheduler jetzt beide Threads auf ein Modul legt, kann das andere per PowerGating in einen tiefen Schlafzustand versetzt werden und das verbliebene vom Turbo um mehrere 100MHz übertaktet werden. Die spannende Frage ist, ob dies den Nachteil des geteilten und somit effektiv ca. halbierten L2 Cache und Flex FP aufwiegen kann.
Selbst wenn man nun nur für Bulldozer einen von Grund auf neuen Scheduler schreiben würde, wäre dies unter anderem auf Grund obiger Überlegengen eine sehr Komplexe Anglegenheit, was mich wieder dazu führt, keine große Hoffnungen in den Windows Scheduler zu legen ;).
 
Die FPU ist an sich nicht halbiert sondern wird je nach Auslastung verdoppelt. Die K10-Architektur hat 128 Bit FPU-Einheiten. Sollte beim Bulldozer nur ein Kern eines Moduls verwendet werden, so kann er zusätzlich die FPU des zweiten Kerns zur Arbeit heranziehen. Die FPU-Leistung pro Kern verdoppelt sich also in bestimmten Szenarien.
 
DAASSI schrieb:
da jedes modul als 2 Threads behandelt wird, wird es in erster Linie so sein, dass es willkürlich verteilt wird

Heißt das dann soviel dass, z.b. etwas was nur 2 Kerne bzw 2 Threads bezieht, auf verschiedenen Modulen angesteuert wird, beide Threads auf den 2 verschiedenen Modulen die volle FPU Power 256 Bit benutzen können?
 
Also, ich folgere:
Meine Frage kann im Endeffekt jetzt nicht beantwortet werden. Alles was ihr geschrieben habt, hab' ich in meiner Frage weggelassen, der kürze halber.
Wenigstens bin ich nicht der einzige, der da nicht weiß, was da auf ihn zukommt. ;-)

Das mit dem Turbo habe ich allerdings nicht bedacht, könnte das "Problem" vermutlich ausbüglen.

Merci!
 
Die FPU ist an sich nicht halbiert sondern wird je nach Auslastung verdoppelt.
War das nicht so, dass es die FPU Einheit nur einmal gab, allerdings besitzt jeder Kern eine eigene Integereinheit? Sachlich daher richtig, sprachlich allerdings nicht ganz korrekt.

Wenn nur ein Kern genutzt wird, dann kann dieser Kern die gesamte FPU nutzen anstelle sie sich mit dem zweiten Kern teilen zu müssen. ;)
 
War das nicht so, dass es die FPU Einheit nur einmal gab, allerdings besitzt jeder Kern eine eigene Integereinheit? Sachlich daher richtig, sprachlich allerdings nicht ganz korrekt.
Pro Modul gibt es zwei Kerne.
Pro Kern gibt es vier Integereinheiten (vier Integerberechnungen auf einmal) und eine 128-Bit-FPU-Einheit (vier 32-Bit-Gleitkommaberechnungen oder zwei 64-Bit-Gleitkommaberechnungen auf einmal).
Die FPU-Einheiten eines Moduls können zu einer 256-Bit-Einheit gekoppelt werden (acht 32-Bit-Gleitkommaberechnungen oder vier 64-Bit-Gleitkommaberechnungen auf einmal).

Gerade im Multimediabereich dürfte so ein Kern gut abgehen, da wimmelt es gerade zu vor Gleitkommaberechnungen.
 
Entweder beide Threads auf ein Modul und den Takt per Turbo hochjagen oder beide Threads auf je ein Modul.
 
Man kann nicht pauschal sagen (oder zumindest tendenziell) was von beiden Möglichkeiten schneller ist, oder?
 
boxleitnerb schrieb:
Man kann nicht pauschal sagen (oder zumindest tendenziell) was von beiden Möglichkeiten schneller ist, oder?

Logischerweise wärs doch schneller wenn jeder Thread zuerstmal einem Modul zugewiesen wird. Da hier ja zuerstmal keine Ressourcen geteilt werden müssen. Und wenn dann ein 3 Thread dazukommt. Im ersten Modul 2 Threads abgearbeitet werden und im 2 nur ein Thread.
 
Die Frage ist, was bringt mehr: Turbo oder nicht gesharter L2/Frontend etc. Wenn ich JF richtig deute, ersteres.
 
Die frage ist nicht, was mehr bringt - die Frage war, was Windows mit den Threads macht.
Was mehr bringt ist hingegen eine total simple Aufgabe:
wenn 1 Kern nur noch 80% bringt, dann muß es um 1/4 schneller laufen, um wieder die 100% zu bringen - so zumindest die Theorie.
 
Das Verwalten von Prozessen/Threads ist Aufgabe des Betriebssystems und wird nicht durch selbst installierte Treiber geregelt. Die Zuweisung von Prozessen/Threads an Kerne wird vom Process-Scheduler übernommen.
Welcher Kern einem Prozess dabei zugewiesen wird, entscheidet das System dynamisch, wie es gerade am besten passt. Höchstwahrscheinlich wird der Prozess/Thread während seiner Lebensdauer auch zwischen verschiedenen Kernen hin und her geschoben.
Möchte man nur bestimmte Kerne benutzen und den Prozess/Thread an einen Kern "festpinnen", so muss man selbst die Kern-Affinität für das jeweilige Programm setzen.
 
Ob man die Flex FP als geteilt, gleich oder verdoppelt ansieht ist eine Frage des Standpunkts. Im Vergleich zur 128bit FPU des K10 bleibt sie gleich oder wird verdoppelt, wohingengen sie im Vergleich zu Sandy oder Ivy Bridges 256bit FPU halbiert wird oder gleich bleibt. Von den Integereinheiten gibt es beim K10 3 pro Core während von den angegebenen 4 eines Bulldozer Cores 2 nahezu ausschließlich zur Adressgenerierung dienen und darüber hinaus nur wenige weitere Befehle beherrschen, sodass man eigentlich auch von nur 2 Intergereinheiten sprechen könnte.
 
@y33h@
Dass die verschiedenen Einheiten innerhalb eines Moduls versch. Taktraten und Spannungen haben können und somit auch unterschiedliche Betriebszustände einnehmen können ist definitiv ausgeschlossen?

@e-Laurin
Ob es jetzt eine verbreiterte FPU ist oder ob es 2 FPUs sind ist wohl ne philosophische Frage. ;)
 
e-Laurin schrieb:
Pro Modul gibt es zwei Kerne.
Pro Kern gibt es vier Integereinheiten (vier Integerberechnungen auf einmal) und eine 128-Bit-FPU-Einheit (vier 32-Bit-Gleitkommaberechnungen oder zwei 64-Bit-Gleitkommaberechnungen auf einmal).
Die FPU-Einheiten eines Moduls können zu einer 256-Bit-Einheit gekoppelt werden (acht 32-Bit-Gleitkommaberechnungen oder vier 64-Bit-Gleitkommaberechnungen auf einmal).

Gerade im Multimediabereich dürfte so ein Kern gut abgehen, da wimmelt es gerade zu vor Gleitkommaberechnungen.
Laut der Grafik dort gibt es einen separaten "Floating Point Unit".
In einem Kern befinden sich allerdings 4x ALU und 4x AGU. Die FPU sitzt wie bereits gesagt extern in der Mitte und beide Kerne eines Moduls müssen sie sich teilen.

http://www.chw.net/up/2010/04/b3overview-466x350.png

Aber im Prinzip ist es doch egal solange man ungefährt das Prinzip verstanden hat.
Lasst uns auf eine gute Performance hoffen, und die zählt eh nur noch am Ende.
 
@bensen
Sowohl Intel als auch AMD verbauen Stromsparmechanismen in ihren CPUs, die ganze Teile eines Chips abschalten können. Sofern sie gerade nicht gebraucht werden.

Das mit der FPU ist wohl wirklich Ansichtssache. Ich hatte die neue FPU von den Folien von AMD mal angesehen und etwas ein bisschen verglichen. Soweit ich erkennen konnte, ist die neue schneller als die alte (im 128-Bit-Modus), da sie bis zu zwei Instruktionen pro Gleitkommazahl ausführen kann (von der Situation abhängig). Die alte K10-Architektur und Intels aktuelle Architektur erlauben nur eine Instruktion pro Gleitkommazahl pro Takt.

Das macht summa summarum:
K10: parallel 1x 128 Bit FADD-Operation auf eine Gleitkommazahl & 1x 128 Bit FMUL-Operation auf eine Gleitkommazahl pro Taktzyklus
Sandy Bridge: 4x Gleitkommaberechnungen in einer 256 Bit FPU mit 128 Bit Pipeline (:rolleyes:), mit FADD oder FMUL pro Taktzyklus
Bulldozer: parallel 4x FMAC (FMAC = 1x FMUL + 1x FADD) in einer 128 Bit FPU bzw. das doppelte bei 2x 128 Bit FPU pro Taktzyklus

Hier kann man erkennen, dass schon eine Bulldozer 128 Bit FPU der von Intel überlegen ist. Dadurch, dass der Bulldozer zwei Operationen pro Zahl ausführen kann, ist die FPU in manchen Fällen doppelt so schnell wie Intels FPU. Im schlechtesten Fall ist sie genau so schnell wie das Intel Pendant. Und dann kommt noch dazu, dass die FPU des Nachbarn auch noch zur Arbeit herangezogen werden kann, falls die gerade nix zu tun hat.

Die FPU-Leistung des Bulldozers wird Bombe sein!
 
Zurück
Oben