Hopsekäse schrieb:
Die Funktionen sind da, also stelle ich es anders ein und starte es so...? Wäre schön, wenn es so einfach wäre.
Bei sogenannten hybriden Anwendungen, sprich die multi-processing und multi-threading, implementieren, ist es so einfach. Ich muss ja beim starten nur angeben wie viele Prozesse ich bsp. pro Socket/Node/o.ä. haben möchte.
Hopsekäse schrieb:
Ich habe gerade keine Werte zur Hand und arbeite nicht primär mit Stencils, aber eigentlich sollten gerade die eher schlecht auf "mehr NUMA" reagieren. Ja, die Tools um das notwendige Übel NUMA zu berücksichtigen gibt es.
Nein, stencils haben ja den Vortiel primär nur auf nearest-neighbor communication angewiesen zu sein. NUMA wäre tatsächlich dann gravierend wenn jeder mit jedem kommunizieren muss. Mehr dazu weiter unten bei einzelnen "Geschwindigkeiten".
Hopsekäse schrieb:
Aber anhand deiner weiteren Ausführungen muss ich davon ausgehen, dass du es nicht tatsächlich auf einem Epyc-System getestet hast...
Haben hier im Haus Intel SNB, IVB, HSW, BDW, KNC und KNL und eben auch AMD Epyc. Nur (leider) noch keine SKL, aber Test dafür kann man remote auf entsprechenden Clustern ausführen.
Hopsekäse schrieb:
Es ist mMn etwas illusorisch zu denken, dass das keine Performance-Auswirkungen hätte. Wenn man bei beispielhaft insgesamt 32 Kernen anstelle von einmal NUMA alle 16 Kerne (QPI) nun alle 4 Kerne einen Prozess anlegen muss, der mit einem anderen Prozess mit Geschwindigkeit X (intra-Chip) kommuniziert und mit 2 anderen mit Geschwindigkeit Y (inter-Chip), dann ist das schon eine andere Geschichte. Und das ist jetzt noch mit der Annahme gemacht, dass das AMD-System ein Single-Sockel-System ist und das Intel ein Dual. Da kommt dann noch Geschwindigkeit Z dazu, wenn's auf den anderen Sockel geht (kein Wunder dass AMD 1-Socket pusht).
Und die Kommunikation zwischen den 32 Kernen ohne NUMA hat unabhängig davon welche 2 Kerne miteinander kommunizieren die selbe Latenz und Bandbreite, das ist illusorisch.
Ja, AMD hat hier Geschwindigkeit A innerhalb eines CCX, B innerhalb eines "Dies", C zwischen 2 Dies auf einem Socket, D zwischen 2 Dies auf unterschiedlichen Sockets, E zwischen zwei Dies in unterschiedlichen Nodes. Wobei E noch weiter aufgespalten wird, abhängig von der genutzten Fabric Topologie.
Das ist kompliziert, korrekt, aber wie sieht es den bei Intel aus?
SKL mit deaktiviertem SNC: A, B und C sind eine "Gruppe", wobei nicht eine Latenz/Bandbreite, sondern ein breites Spektrum.
SKL mit aktiviertem SNC: A und B eine Gruppe, C ist zwischen zwei SNCs.
KNL mit deaktiviertem SNC: A zwischen 2 Cores in einem Tile, B und C sind eine "Gruppe" zwischen Cores in unterschiedlichen Tiles
SKL mit aktiviertem SNC: A zwischen 2 Cores in einem Tile , B zwischen 2 Cores in unterschiedlichen Dies, C ist zwischen zwei SNCs.
(In allem wurden HW Threads ignoriert.)
Also eigentlich nicht wirklich anders. Eine zusätzliche Ebene hin oder her, macht auch nichts. Im Idealfall stimmen Dimensionen mit den einzelnen Ebenen überein.
Und da hier der Begriff gefallen ist: SNC (Sub NUMA Clustering). Dies erlaubt einen SKL in 2 virtuelle NUMA Domains, einen KNL in 2 oder sogar 4 virtuelle NUMA Domains einzuteilen.
Diese Option verkauft Intel kurz gefasst sogar als: "Nutze NUMA Vorteile in entsprechenden Anwendungen aus." Ja, Intel verwendet hier "NUMA" und "Vorteile" in einem Satz. Es ist eben nicht alles schwarz oder weiß, je nach Anwendung passt das eine System oder das andere besser.
Hopsekäse schrieb:
Ganz ehrlich aus der Praxis: vermutlich wird man eher die untere NUMA-Ebene (CCX) ignorieren und eventuelle penalties in Kauf nehmen...
Ja, vmtl., bzw. würde man einfach benchmarken. Ansonsten git es ja auch noch nested multi-threading.
Hopsekäse schrieb:
Habe hier gerade mal das erstbeste Ergebnis rausgesucht für Stencils und Epyc:
https://www.phoronix.com/scan.php?page=article&item=amd-epyc-7351p&num=4
Gerade der OpenMP-Stencil schmeckt dem Epyc gar nicht. 32 Kerne outperformed von 20 Intel-Kernen (die beiden haben allcore sogar denselben Takt), 16 Kerne auf dem selben Niveau wie höher taktende 8 Intel-Kerne.
Ist ja auch eine reines multi-threading Beispiel, das wird nicht gut auf solchen Systemen laufen. Das hatte ich nie behauptet.
Hopsekäse schrieb:
Natürlich hast du recht und man KANN NUMA behandeln, bzw. es gibt gangbare Wege auch aus NUMA-belasteten Systemen gute Leistungen herauszuholen. Es ist nur bei weniger NUMA-belasteten Systemen wesentlich leichter und bei ansonsten vergleichbaren Systemen kommt man auch mit weniger NUMA dichter an die Peak-Werte. Wir haben ja hier nur über einen Aspekt (process und thread placement) geredet. Richtig gut optimiert hast du ja erst, wenn du die tradeoffs richtig gemacht hast. Man kann/muss ja dann auch noch drüber nachdenken, ob man vielleicht an den Chunksizes (was beim Stencil vielleicht eher Patches oder Cell-Selections sind) dreht, um relevante Daten möglichst NUMA-nah zu haben...
Ist korrekt, nur gibt es faktisch kein NUMA unbelastetes System, und auch diese haben wenn andere Nachteile...
Hopsekäse schrieb:
Wobei man wenn man sowas möchte wohl gerade Intels Mesh besonders gut geeignet ist.
Genau das ist nänlich kein Vorteil, das Intel Mesh ist eine Katastrophe. V.a. beim KNL mit seinen 64+ Cores ist bsp. eine Thread Barrier über den gesamten Chip sehr sehr teuer. Es läuft also oft Code mit 4 Prozessen und dann Threading auf 16+ Cores besser, da hier der multi-processing overhead geringer ist als die Ersparnis nur noch einen Thread Barrier über 16 Cores zu benötigen. Schlussendlich also alles Anwendungsspezifisch, bzw. man muss es einfach alles benchmarken.