我遇到了使用MPI的程序的问题,我刚刚修复了它,但是,我似乎并不了解首先出现的问题。我很喜欢编程相关的东西,所以请原谅。
该计划是:
#include <iostream>
#include <cstdlib>
#include <mpi.h>
#define RNumber 3
using namespace std;
int main() {
/*Initiliaze MPI*/
int my_rank; //My process rank
int comm_sz; //Number of processes
MPI_Comm GathComm; //Communicator for MPI_Gather
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
/*Initialize an array for results*/
long rawT[RNumber];
long * Times = NULL; //Results from threads
if (my_rank == 0) Times = (long*) malloc(comm_sz*RNumber*sizeof(long));
/*Fill rawT with results at threads*/
for (int i = 0; i < RNumber; i++) {
rawT[i] = i;
}
if (my_rank == 0) {
/*Main thread recieves data from other threads*/
MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber, MPI_LONG, 0, GathComm);
}
else {
/*Other threads send calculation results to main thread*/
MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber, MPI_LONG, 0, GathComm);
}
/*Finalize MPI*/
MPI_Finalize();
return 0;
};
执行时,程序返回以下消息:
PMPI_Gather中的致命错误:无效的通信器,错误堆栈: PMPI_Gather(863):MPI_Gather(sbuf = 0xbf824b70,scount = 3,MPI_LONG, rbuf = 0x98c55d8,rcount = 3,MPI_LONG,root = 0,comm = 0xe61030)失败 PMPI_Gather(757):无效的通信器PMPI_Gather中的致命错误: 无效的通信器,错误堆栈:PMPI_Gather(863): MPI_Gather(sbuf = 0xbf938960,scount = 3,MPI_LONG,rbuf =(nil),rcount = 3, MPI_LONG,root = 0,comm = 0xa6e030)PMPI_Gather失败(757):无效 通信器
在我完全删除GathComm
并将其替换为MPI_COMM_WORLD
默认通信器后,一切正常。
任何人都可以如此友善地解释我做错了什么以及这种调整是如何使一切运转的?
答案 0 :(得分:2)
那是因为GathComm
尚未被分配有效的沟通者。 “MPI_Comm GathComm;
”仅声明变量以保存通信器但不创建通信器。
如果您只想在操作中包含所有过程,则可以使用默认通信器(MPI_COMM_WORLD
)。
当您想要在不同的组中组织过程或使用virtual communication topologies.
时,自定义通讯器非常有用要了解更多信息,请查看描述群组,通信器和拓扑的this article。