2012-05-23 29 views
2

我開始了與MPI和已經寫了一個快速演示程序:爲什麼我所有的mpi線程都是主人?

int main(int argc, char** argv) 
{ 
    MPI_Init(&argc, &argv); 
    int myRank = MPI_Comm_rank(MPI_COMM_WORLD, &myRank); 
    if (myRank) { 
    cout << "slave" << endl; 
    } 
    else { 
    cout << "master" << endl; 
    } 
    MPI_Finalize(); 
    return 0; 
} 

我用下面的命令來運行它:

aprun -n 4 test 

我的輸出是

master 
master 
master 
master 

我期待類似

slave 
master 
slave 
slave 

這是怎麼發生的?爲什麼我所有的線程都是主人?

+0

「If」只對「0」爲真,對於其他整數值爲false? 嘗試檢查MPI_SUCCESS和MPI_ERR_COMM? – phantasmagoria

+0

MPI_Comm_rank函數的返回值不是您認爲的那樣。返回的值是一個錯誤代碼。大多數MPI *功能都是如此。 –

回答

6

的問題是在這條線:

int myRank = MPI_Comm_rank(MPI_COMM_WORLD, &myRank); 

你不應該分配給myRank調用MPI_Comm_rank的結果。只要做:

int myRank; 
MPI_Comm_rank(MPI_COMM_WORLD, &myRank); 

它會工作。

+0

是的,OP的代碼似乎將調用的返回值分配給myRank的mpi_comm_rank。如果成功調用返回0,並且如果將0視爲布爾值時值爲'false',則myRank將爲false。 –

+2

這很尷尬,但至少MPI_Comm_rank不會返回任何錯誤:-) – Mikhail

+1

@Misha:默認情況下,MPI函數調用'MPI_Abort()' - 除非您手動設置錯誤處理程序,否則將永遠不會看到與「MPI_SUCCESS」不同的東西該通信者爲'MPI_ERRORS_RETURN'。這就是爲什麼在普通MPI應用程序中,您永遠不需要檢查返回值,並且在MPI 3.0中將Fortran MPI子例程的錯誤值參數設置爲可選。 –

相關問題