【问题标题】:Problems with MPI_Comm_split and openmpi 1.4.3MPI_Comm_split 和 openmpi 1.4.3 的问题
【发布时间】:2015-04-25 12:19:30
【问题描述】:

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

【问题讨论】:

  • 只是与您的“btw”相关的简短评论:通信例程的默认 MPI 错误处理程序是 MPI_ERRORS_ARE_FATAL,它会在发生错误时终止 MPI 作业。因此,除了MPI_SUCCESS,您不会看到任何返回码。

标签: c++ ubuntu mpi openmpi


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 2011-10-01
    • 2013-03-12
    • 1970-01-01
    • 2011-07-08
    • 2013-05-21
    • 2020-09-16
    • 2021-04-03
    • 2021-11-08
    相关资源
    最近更新 更多