MPI_Comm_split和openmpi 1.4.3的问题

Problems with MPI_Comm_split and openmpi 1.4.3

本文关键字:问题 openmpi Comm split MPI      更新时间:2023-10-16

我遇到了一个MPI_Split_comm问题,该问题似乎只有在使用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中的一个错误,但由于在错误使用的情况下,mpi的行为是未指定的,因此这也可能是代码的问题。所以,我的问题是:

1) 有人能在我的代码中找到错误吗?

2) 有人知道openmpi 1.4.3中MPI_Comm_split的问题吗?这些问题在以后的版本中已经解决了?

(顺便说一句:所有MPI例程都返回MPI_SUCCESS)

乍一看,您的代码看起来不错。

我会坚持使用Open MPI的后续版本,因为自1.4.x系列以来,已经修复了无数的错误。具体来说:1.4.x太旧了,甚至不值得仔细查看记录,看看从那时起MPI_COMM_SPLIT的问题是否得到了修复。