2013-07-11 67 views
3

我知道,在openMPI實現中有一些基本功能,用於將不同進程映射到不同套接字的不同核心(如果系統具有多個套接字)。在openMPI中的處理器/套接字親和力?

  1. --bind-to-socket(先到先得)
  2. --bysocket(循環賽,基於負載balencing)
  3. --npersocket N(分配數處理到每個插座)
  4. --npersocket N --bysocket(分配Ñ過程到每個插座,但以循環方式)
  5. --bind-to-core(以順序方式將一個進程綁定到每個核心)
  6. --bind-to-core --bysocket(a SSIGN一個過程給每個核,但從來沒有留下較少使用的任何插座)
  7. --cpus-per-proc N(綁定過程以一個以上的核)
  8. --rankfile(可寫的每個處理的優先級)的完整描述

我我在一個有8個插槽(每個10個核心)的服務器上運行我的openMPI程序,並且由於多線程開啓,所以有160個可用內核。 我需要通過在套接字/內核和進程的不同組合上運行openMPI程序進行分析。我期望使用所有套接字的情況,並且代碼處理某些數據傳輸,因爲內存傳輸速度最快這兩個進程都在相同套接字的核心上執行。

So my questions are follows, 

  1. 哪些進程和套接字(每個進程具有休眠持續時間和數據傳輸到根處理)之間最壞/最好的情況下映射?

  2. 是否有任何方法可以打印進程正在執行的套接字和核心細節的名稱? (ⅰ將使我們的是要知道,如果處理真正的插座之間分配本身)

回答

7
  1. 這取決於如此多的因素,單個「銀彈」答案不可能存在。其中包括計算強度(FLOPS /字節)以及本地數據量與進程之間傳遞的數據量之間的比率。這也取決於系統的體系結構。計算強度可以用分析方法估算,也可以用PAPI,Likwid等分析工具進行測量。可以使用OpenMPI附帶的hwloc庫的一部分lstopo實用程序來檢查系統的體系結構。不幸的是lstopo不能告訴你每個內存通道有多快以及NUMA節點之間的鏈接有多快/多少。

  2. 是的,有:--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 

在這種情況下003f0fc0之間的親和性掩碼交替。 003f二進制是0000000000111111並且這樣的親和掩碼允許每個偶數等級對從0 CPU上執行至5 0fc00000111111000000,因此奇數行列僅調度上的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>選項。

+0

--report-bindings本身是否會在cmd上打印某些內容,或者如何進一步獲取進程使用的實際綁定?它爲我打印了額外的東西! –

+0

它使每個等級打印出對標準錯誤輸出的綁定。 –

+0

即使將此重定向到stdout,我也沒有收到stderr上的任何信息; char buf [BUFSIZ]; 012busetbuf(stderr,buf); –

2
1.

如果每個節點和根和沒有其它通信模式,則通信之間相等的通信不會影響特定進程 - >套接字映射的性能。 (假設插座之間有規則的對稱互連拓撲結構)。否則,您通常會嘗試將通信拓撲中彼此距離很近的過程對放在一起。使用共享內存系統上的MPI可能不相關,但在羣集上肯定是這樣。

但負載平衡也可能會影響映射的性能。如果某些進程等待消息/屏障,則該套接字上的其他內核可能會使用更高的turbo頻率。這在很大程度上取決於應用程序的運行時行爲。只包含睡眠和轉移的應用程序並不合理。

  1. 您可以使用libnuma/sched_getaffinity來手動確認您的進程鎖定。

有許多性能分析工具可以幫助您回答您的問題。例如,OpenMPI附帶VampirTrace,可生成包含有關MPI通信等信息的跟蹤。您可以使用Vampir進行查看。