0
我对此代码有点困惑。第一件事是我读了很多帖子,建议不要在MPI中发送指针。但我在这里发送一个,它正在工作。此代码的另一个问题是它可以从其他进程写入最多4个字符来处理0分配的内存,如代码中所示。有人可以解释一下吗?无法在从其他进程分配的进程0内存中写入超过4个字符
#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;
}
如果在连续的内存块中分配所有的'NumProcs'字符串,可以使用'MPI_Scatter'和'MPI_Gather',而不是通过'MPI_Send'和'MPI_Recv'循环所有的行列。也可以使用'malloc'来代替'MPI_Alloc_mem'。后者主要用于分配_special_内存(无论在具体的MPI实现环境中使用什么_special_手段)。 –