2012-09-17 27 views
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; 
} 
+0

如果在连续的内存块中分配所有的'NumProcs'字符串,可以使用'MPI_Scatter'和'MPI_Gather',而不是通过'MPI_Send'和'MPI_Recv'循环所有的行列。也可以使用'malloc'来代替'MPI_Alloc_mem'。后者主要用于分配_special_内存(无论在具体的MPI实现环境中使用什么_special_手段)。 –

回答

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实际上并不“送的指针”。上面的代码将从var[index]指向的char开始,并发送char和接下来的。