我对这段代码感到有点困惑。第一件事是我读了很多帖子,建议不要在MPI中发送指针。但是我在这里送一个它正在工作。我对此代码的另一个问题是它可以从其他进程写入最多4个字符来处理0的已分配内存,就像在代码中一样。有人可以解释一下吗?
#include<mpi.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int MyRank, NumProcs, index, ret;
MPI_Status status;
MPI_File cFile;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&MyRank);
MPI_Comm_size(MPI_COMM_WORLD,&NumProcs);
//Allocated memory for a double pointer.
char **var;
MPI_Alloc_mem(sizeof(char *)*NumProcs, MPI_INFO_NULL, &var);
for(index = 0; index < NumProcs; index++)
MPI_Alloc_mem(sizeof(char)*50, MPI_INFO_NULL, &var[index]);
if(MyRank == 0)
{
//Copied data to the 0th position of the double pointer
strcpy(var[MyRank],"KKKKKK");
//Process 0 sent the array to other process to overwrite the data
for(index = 1; index < NumProcs; index++)
MPI_Send(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD );
for(index = 1; index < NumProcs; index++)
MPI_Recv(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD,&status);
}
else
{
//Overwrite of data is done.
MPI_Recv(var[MyRank],1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
strcpy(var[MyRank],"MMMMMM");
MPI_Send(var[MyRank],1,MPI_INT,0,1,MPI_COMM_WORLD );
}
if(MyRank == 0)
{
//After writing data, printed in process 0;
printf("My Rank is -%d\n", MyRank);
for(index = 0; index < NumProcs; index++)
printf(" %s\n",var[index]);
}
MPI_Finalize();
return 0;
}
答案 0 :(得分:3)
当你说MPI_Send(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD );
时,你告诉编译器发送1个整数。在32位系统上,这只有4个字节。
您可能希望更改所有发送和接收行,使其具有与MPI_Send(var[index],50,MPI_CHAR,index,1,MPI_COMM_WORLD );
相同的参数
只是为了澄清你对发送指针的误解:MPI实际上并没有“发送指针”。上面的代码将从char
指向的var[index]
开始,然后发送char
和下一个chars
。