Ono pokud to jede nad intenzivně sdílenými daty v RAMce, tak může být i rozdíl mezi 1x 32core vs. 2x16 vs. 4x8 core (jedna/dvě/čtyři patice) - za předpokladu, že propoj mezi paticemi (HT/QPI) je pomalejší, než interní sběrnice v rámci patice. Každopádně snaha emulovat SMP (NUMA) nad Ethernetem je už na první pohled špatný nápad :-)
Takhle kdyby ten software uměl řešit "lokalitu" alokované RAM a CPU jádra. Tzn. kdyby si byl vědom NUMA struktury stroje. Resp. aspoň kdyby úloha byla s ohledem na nestejné latence v NUMA topologii nějak optimalizovatelná.
Linux má o těchto věcech interně přehled a údajně může proces "svoje" alokované "virtuální" stránky
přestěhovat na konkrétní NUMA uzel (resp. má právo o to požádat.) Jenom mi ohledně linuxu/libnuma není jasné, jestli se baví jenom o procesu (pid) nebo v jemnějším smyslu slova o vlákně. Našel jsem třeba zmínky, že Linux se snaží vlákna v rozvlákněném procesu spouštět na jádrech v rámci jediné "patice" (numa uzlu) - ale "co když chci aby vlákna běžela napříč celým NUMA strojem a měla přehled o svých alokacích paměti" ? To je podle mého téma na další
googlení, průzkum bojem a debatu v LKML. Náznak jsem zažil
kdysi když jsem zjišťoval, jak si nechat probudit kernelovým timerem konkrétní vlákno, tzn. nikoli celý proces. (Pozn.: syscall gettid() je tuším už normálně k dispozici i skrz glibc.) Všimněte si třeba nejednoznačného užívání termínů proces, vlákno a hlavně "task" - člověk musí pořád zkoumat, jestli se bavíme o user space, kernelu a na jaké úrovni abstrakce, jak to mapuje NPTL apod. Konkrétně: výše odkázaná manpage knihovny libnuma používá "task" ve smyslu rozvlákněný proces, kdežto v kernelu "struct task_struct" odpovídá jednotlivému user-space vláknu :-( Přesto se domnívám, že jestli je někde šance, tohle všechno rozplést a "nalinkovat po svém", tak je to v Linuxu. Jindy taktéž velice pokrokové FreeBSD zde patrně teprve
dohání náskok.
S uvedenou problematikou volně souvisí další finta: snažit se, aby algoritmus pokud možno "běžel v CPU cache" - v rámci jednoho vlákna na konkrétním CPU jádře (popř. v rámci NUMA uzlu). Což je ovšem těžko splnitelné, pokud jsou data křížem krážem provázána odkazy (pointery) = úlohy typu "procházení rozsáhlého grafu" se takto optimalizovat z principu nedají :-( a budou vyžírat vždycky ty nejhorší latence.
Závěrem odkaz na jedno hezké
PDF o těchto věcech...