這取決於如此多的因素,單個「銀彈」答案不可能存在。其中包括計算強度(FLOPS /字節)以及本地數據量與進程之間傳遞的數據量之間的比率。這也取決於系統的體系結構。計算強度可以用分析方法估算,也可以用PAPI,Likwid等分析工具進行測量。可以使用OpenMPI附帶的hwloc
庫的一部分lstopo
實用程序來檢查系統的體系結構。不幸的是lstopo
不能告訴你每個內存通道有多快以及NUMA節點之間的鏈接有多快/多少。
是的,有:--report-bindings
使每個等級打印到其標準錯誤輸出應用於它的親和力掩碼。的輸出來改變不同的開放MPI版本中的位:
打開MPI 1.5.x的顯示親和力掩碼的十六進制值:
mpiexec --report-bindings --bind-to-core --bycore
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],0] to cpus 0001
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],1] to cpus 0002
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],2] to cpus 0004
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],3] to cpus 0008
這表明等級0的親和掩碼設置爲0001
,它允許它僅在CPU 0上運行。等級1的親和掩碼設置爲0002
,它允許它僅在CPU 1上運行。等等。
mpiexec --report-bindings --bind-to-socket --bysocket
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],0] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],1] to socket 1 cpus 0fc0
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],2] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],3] to socket 1 cpus 0fc0
在這種情況下003f
和0fc0
之間的親和性掩碼交替。 003f
二進制是0000000000111111
並且這樣的親和掩碼允許每個偶數等級對從0 CPU上執行至5 0fc0
是0000111111000000
,因此奇數行列僅調度上的CPU 5至11
打開MPI 1.6.x版採用更好的圖形顯示,而不是:
mpiexec --report-bindings --bind-to-core --bycore
[hostname:39646] MCW rank 0 bound to socket 0[core 0]: [B . . . . .][. . . . . .]
[hostname:39646] MCW rank 1 bound to socket 0[core 1]: [. B . . . .][. . . . . .]
[hostname:39646] MCW rank 2 bound to socket 0[core 2]: [. . B . . .][. . . . . .]
[hostname:39646] MCW rank 3 bound to socket 0[core 3]: [. . . B . .][. . . . . .]
mpiexec --report-bindings --bind-to-socket --bysocket
[hostname:13888] MCW rank 0 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 1 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]
[hostname:13888] MCW rank 2 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 3 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]
每個插座用圖形表示爲一組方括號,每個核心用一個點表示。每個級別所綁定的核心都由字母B
表示。進程只綁定到第一個硬件線程。
打開MPI 1.7。X是一個比較冗長,也知道硬件線程:
mpiexec --report-bindings --bind-to-core
[hostname:28894] MCW rank 0 bound to socket 0[core 0[hwt 0-1]]: [BB/../../../../..][../../../../../..]
[hostname:28894] MCW rank 1 bound to socket 0[core 1[hwt 0-1]]: [../BB/../../../..][../../../../../..]
[hostname:28894] MCW rank 2 bound to socket 0[core 2[hwt 0-1]]: [../../BB/../../..][../../../../../..]
[hostname:28894] MCW rank 3 bound to socket 0[core 3[hwt 0-1]]: [../../../BB/../..][../../../../../..]
mpiexec --report-bindings --bind-to-socket
[hostname:29807] MCW rank 0 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 1 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]
[hostname:29807] MCW rank 2 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 3 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]
開放MPI 1.7.x也取代了--bycore
和--bysocket
選擇與更普遍--rank-by <policy>
選項。
--report-bindings本身是否會在cmd上打印某些內容,或者如何進一步獲取進程使用的實際綁定?它爲我打印了額外的東西! –
它使每個等級打印出對標準錯誤輸出的綁定。 –
即使將此重定向到stdout,我也沒有收到stderr上的任何信息; char buf [BUFSIZ]; 012busetbuf(stderr,buf); –