stei.f
2017-08-16, 10:48:01
Hallo in die Runde. Ich spiele mit dem Gedanken mit einen 1950x zu zulegen. Daher verfolge ich die Reviews und Newsschnipsel mit grossen Interesse.
Nur eine Sache stösst mir auf (Warum ich mich nach jahrelangen stillen mitlesen, einen Account angelegt hab), das ist die NUMA / UMA Sache.
Ich schreib mal mein Verständnis zum Thema. Am besten am Beispiel von Threadripper (So ich wie mir das Denke. Ich hab leider keine Techpapers gewälzt zu genau der AMD Architektur).
Grundsatz Problem:
Jeder Threadripper DIE hängt an jeweils 2 Speicherkontrollern (von 4 insgesammt). Also sagen wir mal DIE A hängt am 1 + 2 und DIE B am 3 + 4. Wenn wir die Sache simple anschauen, kann A nicht auf Memory von 3+4 zugreifen. Das wäre natürlich Blödsinn. Also was wird gemacht in dem Fall, DIE A bittet DIE B stellvertretend den Memory Block zu laden und über den Interconnect (Infinity Fabric ?) in den Cache vom DIE A zu übertragen. Das bedingt natürlich höhere Latenzen.
Das erklärt mir warum Memory Access auf unterschiedliche Bereiche unterschiedlich lang dauert. -> NonUnifiedMemoryAccess == NUMA
OK wie funktioniert UMA:
Meines Wissens nach wird der Memory gestriped. In welchen Blockgrößen ist vermutlich Herstellerspezifisch. Also erklärend gesagt, DIE A fordert 10 Blöcke Speicher an, bekommt er 5 lokal (mit direktem Zugriff) und 5 remote (die ein anderes DIE stellvertretend laden muss). Das führt dazu das gemittelt die Zugriffszeiten so in der Mitte raus kommen. Im Detail bedeutet das aber dass er ständig zwischen schnell und langsam wechselt (Wenn man sich ein serielles lesen vorstellt).
So jetzt lese ich aber Sachen wie:
https://www.3dcenter.org/artikel/launch-analyse-amd-ryzen-threadripper/launch-analyse-amd-ryzen-threadripper-seite-2 Zitat:
Bei letzteren ergibt sich natürlich die Chance, das mittel- und langfristig eher zugunsten des defaultmäßigen UMA-Modus optimiert wird, und daher unter Spielen die Performancegewinne von NUMA mit der Zeit sinken.
[Ich möchte dem Author nicht ans Bein pinkeln. Ich mag 3dcenter.]
Das ist doch meiner Meinung nach falsch rum gedacht. Wenn man optimiert dann Richtung NUMA. Sprich die HW stellt dem OS Informationen zur Verfügung welcher Speicher eine affinity zu welchen Core(thread)/logischen Prozessor hat. Jetzt ist es am Anwendungsentwickler diese Infos aus dem OS zu quetschen und seine Threads auf den logischen Prozessor zu tackern (thread affinity) um nur lokalen Speicher zu verwenden. Oder anders, wenn die Anwendung Berechnungen im Speicherbereich ZZ hat, den Thread auf dem Prozessor auszuführen der diesen Speicher (ZZ) lokal hat.
Das jenes total kompliziert ist und dem ganzen Thread Skalierungsproblem noch den Hut aufsetzt, ist mir klar. Aber UMA ist aus meiner Sicht eine Gehilfe für Programmierer welche sich nicht mit dem Thema auseinander setzen wollen (und der Vendor versucht den Worst-Case zu verhindern).
Auch vergleiche zu Prozessoren die kein NUMA haben hinken meist. Diese Prozessoren arbeiten nicht im gleichen UMA Mode wie ein Prozessor der NUMA unterliegt. Es ist genau anders herum, ein Prozessor der alles lokal hat ist gleich wie ein NUMA DIE welches auf lokalen Speicher zugreift.
Hier kommen die Themen in den Desktop an denen sich Serveradmins schon seid geraumer Zeit die Zähne abkauen. Da ist das Thema auf jeden Fall Prominent, siehe z.B. Saphana.
Also kann sein das ich total auf dem Holzweg bin, aber dann klärt mich bitte auf. Auch ist die Darstellung vom Threadripper CPU simplifiziert. Die Diskussion ist eröffnet.
ps.: Ich find es toll das AMD das NUMA exposed und nicht jedem UMA vorschreibt.
Nur eine Sache stösst mir auf (Warum ich mich nach jahrelangen stillen mitlesen, einen Account angelegt hab), das ist die NUMA / UMA Sache.
Ich schreib mal mein Verständnis zum Thema. Am besten am Beispiel von Threadripper (So ich wie mir das Denke. Ich hab leider keine Techpapers gewälzt zu genau der AMD Architektur).
Grundsatz Problem:
Jeder Threadripper DIE hängt an jeweils 2 Speicherkontrollern (von 4 insgesammt). Also sagen wir mal DIE A hängt am 1 + 2 und DIE B am 3 + 4. Wenn wir die Sache simple anschauen, kann A nicht auf Memory von 3+4 zugreifen. Das wäre natürlich Blödsinn. Also was wird gemacht in dem Fall, DIE A bittet DIE B stellvertretend den Memory Block zu laden und über den Interconnect (Infinity Fabric ?) in den Cache vom DIE A zu übertragen. Das bedingt natürlich höhere Latenzen.
Das erklärt mir warum Memory Access auf unterschiedliche Bereiche unterschiedlich lang dauert. -> NonUnifiedMemoryAccess == NUMA
OK wie funktioniert UMA:
Meines Wissens nach wird der Memory gestriped. In welchen Blockgrößen ist vermutlich Herstellerspezifisch. Also erklärend gesagt, DIE A fordert 10 Blöcke Speicher an, bekommt er 5 lokal (mit direktem Zugriff) und 5 remote (die ein anderes DIE stellvertretend laden muss). Das führt dazu das gemittelt die Zugriffszeiten so in der Mitte raus kommen. Im Detail bedeutet das aber dass er ständig zwischen schnell und langsam wechselt (Wenn man sich ein serielles lesen vorstellt).
So jetzt lese ich aber Sachen wie:
https://www.3dcenter.org/artikel/launch-analyse-amd-ryzen-threadripper/launch-analyse-amd-ryzen-threadripper-seite-2 Zitat:
Bei letzteren ergibt sich natürlich die Chance, das mittel- und langfristig eher zugunsten des defaultmäßigen UMA-Modus optimiert wird, und daher unter Spielen die Performancegewinne von NUMA mit der Zeit sinken.
[Ich möchte dem Author nicht ans Bein pinkeln. Ich mag 3dcenter.]
Das ist doch meiner Meinung nach falsch rum gedacht. Wenn man optimiert dann Richtung NUMA. Sprich die HW stellt dem OS Informationen zur Verfügung welcher Speicher eine affinity zu welchen Core(thread)/logischen Prozessor hat. Jetzt ist es am Anwendungsentwickler diese Infos aus dem OS zu quetschen und seine Threads auf den logischen Prozessor zu tackern (thread affinity) um nur lokalen Speicher zu verwenden. Oder anders, wenn die Anwendung Berechnungen im Speicherbereich ZZ hat, den Thread auf dem Prozessor auszuführen der diesen Speicher (ZZ) lokal hat.
Das jenes total kompliziert ist und dem ganzen Thread Skalierungsproblem noch den Hut aufsetzt, ist mir klar. Aber UMA ist aus meiner Sicht eine Gehilfe für Programmierer welche sich nicht mit dem Thema auseinander setzen wollen (und der Vendor versucht den Worst-Case zu verhindern).
Auch vergleiche zu Prozessoren die kein NUMA haben hinken meist. Diese Prozessoren arbeiten nicht im gleichen UMA Mode wie ein Prozessor der NUMA unterliegt. Es ist genau anders herum, ein Prozessor der alles lokal hat ist gleich wie ein NUMA DIE welches auf lokalen Speicher zugreift.
Hier kommen die Themen in den Desktop an denen sich Serveradmins schon seid geraumer Zeit die Zähne abkauen. Da ist das Thema auf jeden Fall Prominent, siehe z.B. Saphana.
Also kann sein das ich total auf dem Holzweg bin, aber dann klärt mich bitte auf. Auch ist die Darstellung vom Threadripper CPU simplifiziert. Die Diskussion ist eröffnet.
ps.: Ich find es toll das AMD das NUMA exposed und nicht jedem UMA vorschreibt.