- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了一个 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 的问题是否已从那时起得到修复。
关于c++ - MPI_Comm_split 和 openmpi 1.4.3 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28686267/
调用 MPI_Comm_split 的成本是多少?它是否以 O(n)、O(log(n)) 或其他方式运行(n 是要拆分的 comm 中的等级数)? 我正在编写针对基于 infiniband 的 sup
比如说,我有 8 个进程。当我执行以下操作时,MPU_COMM_WORLD 通信器将分成两个通信器。 id 为偶数的进程将属于一个 communicator,id 为奇数的进程将属于另一个 commu
有人可以解释并告诉我更多关于 MPI_Comm_split 通信器的信息吗? MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm);
我正在类里面使用 C 语言学习 MPI。我目前正在尝试了解您何时使用 MPI_Comm_split 以及其优点是什么。如果我不使用组或者如果我的所有进程都在一个组中,我也想弄清楚使用它是否比仅使用 M
我遇到了一个 MPI_Split_comm 问题,似乎只有在使用 openmpi 1.4.3 时才会出现。示例代码: #include #include #include const size_
我是一名优秀的程序员,十分优秀!