MPI_Comm_split和openmpi 1.4.3的问题
Problems with MPI_Comm_split and openmpi 1.4.3
我遇到了一个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的问题是否得到了修复。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- 在本地安装OpenMPI的问题与CUDA一起使用
- MPI_Comm_split和openmpi 1.4.3的问题