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