无法在进程0中从其他进程分配的内存中写入超过4个字符

时间:2012-09-17 06:28:28

标签: mpi

我对这段代码感到有点困惑。第一件事是我读了很多帖子,建议不要在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;
}

1 个答案:

答案 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