我正在学习MPI,并尝试创建一些函数的示例。我有几个工作,但我遇到了MPI_Gather的问题。我有一个更复杂的拟合测试,但我把它修剪成最简单的代码。但是,我仍然收到以下错误:
root@master:/home/sgeadmin# mpirun ./expfitTest5
Assertion failed in file src/mpid/ch3/src/ch3u_request.c at line 584: FALSE
memcpy argument memory ranges overlap, dst_=0x1187e30 src_=0x1187e40 len_=400
internal ABORT - process 0
我正在通过AWS EC2运行一个主实例和两个节点实例。我安装了所有相应的库,因为我已经有其他MPI示例可以工作了。我的节目是:
int main()
{
int world_size, world_rank;
int nFits = 100;
double arrCount[100];
double *rBuf = NULL;
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
assert(world_size!=1);
int nElements = nFits/(world_size-1);
if(world_rank>0){
for(int k = 0; k < nElements; k++)
{
arrCount[k] = k;
}}
MPI_Barrier(MPI_COMM_WORLD);
if(world_rank==0)
{
rBuf = (double*) malloc( nFits*sizeof(double));
}
MPI_Gather(arrCount, nElements, MPI_DOUBLE, rBuf, nElements, MPI_DOUBLE, 0, MPI_COMM_WORLD);
if(world_rank==0){
for(int i = 0; i < nFits; i++)
{
cout<<rBuf[i]<<"\n";
}}
MPI_Finalize();
exit(0);
}
在malloc或MPI_Gather中有什么我不理解的东西吗?我将我的代码与其他样本进行了比较,但未发现任何差异。
答案 0 :(得分:1)
收集操作中的root
进程确实参与了该操作。即它将数据发送到它自己的接收缓冲区。这也意味着你必须为它在接收缓冲区中的部分分配内存。
现在您可以使用MPI_Gatherv
并在0的根目录中指定recvcounts[0]
/ sendcount
来密切关注您的示例。但通常你更愿意以root的方式参与MPI应用程序,即int nElements = nFits/world_size
。