MPI_Comm_split和openmpi 1.4.3的问题

时间:2015-02-24 00:31:53

标签: c++ ubuntu mpi openmpi

我遇到了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)

1 个答案:

答案 0 :(得分:2)

乍一看,您的代码看起来很好。

我坚持使用更高版本的Open MPI,因为自1.4.x系列以来已经修复了无数错误。具体来说:1.4.x是如此之久以至于甚至不值得通过记录来查看MPI_COMM_SPLIT的问题是否已经修复了。