2014-01-17 33 views
1

我新的MPI和常常看到在MPI代碼以下代碼:
MPI等級確定

if (rank == 0) { 
    MPI_Send(buf, len, MPI_CHAR, 1, 0, MPI_COMM_WORLD); 
} 
else { 
    MPI_Recv(buf, len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &status); 
} 

看來,秩確定該方法的發送和該方法的接收。但是 通過調用MPI_Comm_rank(MPI_COMM_WORLD, &rank);確定進程的級別如何?
它與mpirun的命令行參數有關嗎?
例如:

mpirun -n 2 -host localhost1,localhost2 ./a.out 

localhost1是等級0,localhost2是1級?)
如何在程序將決定誰擁有等級0和誰擁有1級?
有沒有一種方法可以讓我指定某種東西,例如localhost1正在發送,localhost2正在接收?

回答

2

通常情況下,如果您嘗試考慮基於物理處理器/機器的MPI程序中的通信,那麼您無法以正確的方式進行處理。大多數時候,每個級別映射到哪臺實際機器並不重要。重要的是,您可以撥打mpiexecmpirun(它們通常是同一件事),MPI實施內的某些內容可啓動n進程,這些進程可能位於本地,遠程或兩者的某個組合中,並將它們分配給隊列。從理論上講,這些等級可以任意分配,但通常是以某種可預測的方式(通常就像在整個可用主機組上進行循環一樣)。在您的程序中,無論您是在host0還是host1上運行排名0,它通常沒有什麼區別。重要的是,你正在做0級的特定工作,需要1級的通信。

這就是說,有更多的罕見時間哪些級別映射到哪個處理器可能很重要。示例可能是:

  1. 如果您在某些節點上使用GPU而不是其他節點,並且您需要某些級別才能控制GPU。
  2. 您需要將某些進程映射到同一物理節點,以優化共享內存等通信模式。
  3. 您在某些需要映射到特定排名的主機上放置數據。

這些都是高級示例。通常情況下,如果你遇到這種情況,你一直在使用MPI足夠長的時間來知道你需要在這裏做什麼,所以我打賭你可能沒有在這種情況下。

請記住,我的職位在哪裏並不重要。重要的是我擁有合適的人數。

免責聲明:所有這些都說了,它啓動正確數量的進程並不重要。我的意思是,如果你有兩臺主機,每臺主機都有一個四核處理器,那麼用16個等級開始工作是沒有意義的。你最終會花費你所有的計算時間上下文來切換你的進程。儘量不要擁有比計算核心更多的等級。