2015-02-24 70 views
2

我遇到了MPI_Split_comm的問題,這似乎只有在使用openmpi 1.4.3時纔會出現。示例代碼:MPI_Comm_split和openmpi 1.4.3的問題

#include <mpi.h> 
#include <cassert> 
#include <vector> 

const size_t n_test=1000000; 

class MyComm{ 
private: 
    MPI_Comm comm; 

public: 
    int size,rank; 

    MyComm(){ 
    comm=MPI_COMM_WORLD; 
    MPI_Comm_rank(comm,&rank); 
    MPI_Comm_size(comm,&size); 
    } 

    MyComm(const MyComm&); 

    MyComm(const MyComm& c, int col){ 
    MPI_Comm_split(c.comm,col,c.rank,&comm); 
    MPI_Comm_size(comm,&size); 
    MPI_Comm_rank(comm,&rank); 
    } 

    ~MyComm(){ 
    if(comm!=MPI_COMM_WORLD) MPI_Comm_free(&comm); 
    } 
}; 

void split(){ 
    std::vector<MyComm*> communicators; 
    communicators.push_back(new MyComm()); 

    while(communicators.back()->size >1){ 
    int size=communicators.back()->size; 
    int rank=communicators.back()->rank; 

    int color= (rank >= size/2) ? 1 : 0; 

    communicators.push_back(new MyComm(*communicators.back(),color)); 

    if(color==0) assert(communicators.back()->size==(size-size%2)/2); 
    else assert(communicators.back()->size==(size+size%2)/2); 
    } 

    for(size_t i=0;i<communicators.size();++i) delete communicators[i]; 
} 

int main(int argc, char** argv){ 
    MPI_Init(&argc,&argv); 

    for(size_t count=0;count<n_test;++count) split(); 

    MPI_Finalize(); 
    return 0; 
} 

問題是新通訊器的大小並不總是正確的。這個問題只發生在一定數量的過程中,例如7.此外,它不會在每次執行中發生。我用g ++和icpc編譯了代碼(在Ubuntu 12.04上,openmpi 1.4.3),並且在兩個可執行文件中都發生錯誤。如果使用openmpi 1.6.5或1.8.3,則不會發生錯誤。這可能看起來像openmpi 1.4.3中的一個bug,但由於mpi的行爲在錯誤用法的情況下未指定,所以它可能也是代碼的問題。所以,我的問題是:

1)任何人都可以在我的代碼中找到一個錯誤?

2)有誰知道MPI_Comm_split在openmpi 1.4.3中的問題已經在以後的版本中解決了嗎?

(順便說一句:所有MPI程序返回MPI_SUCCESS)

+0

只是一個與你的「btw」相關的簡短評論:通信例程的默認MPI錯誤處理程序是「MPI_ERRORS_ARE_FATAL」,它會在發生錯誤時終止MPI作業。因此,除了'MPI_SUCCESS'外,您不會看到任何返回碼。 – 2015-02-25 07:53:30

回答

2

乍一看,你的代碼看起來不錯。

我會堅持使用更高版本的Open MPI,因爲自1.4.x系列以來已經修復了無數的錯誤。特別是:1.4.x太舊了,甚至可能不值得通過記錄來查看MPI_COMM_SPLIT的問題是否已經修復。