使用分散发送2个暗淡的数组

时间:2010-05-19 21:57:11

标签: c mpi multidimensional-array scatter

我是MPI的初学者,我正在使用C语言和处理器模拟器(MPICH2),我编写了以下代码来发送2D数组以使2个处理器从中获取一行但是在运行时会产生错误MPICH2,代码是:

#include <stdio.h>  
#include <stdlib.h>  
#include "mpi.h"

int main(int argc, char *argv[]) {
    int rank;
    int commsize;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD,&commsize);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    char** name=malloc(2*sizeof(char*));
    int i;

    for(i=0;i<2;i++){
        name[i]=malloc(15*sizeof(char));
    }
    name[0]="name";
    name[1]="age";
    /////////////////////
    if(rank==0) {
        char** mArray=malloc(2*sizeof(char*));
        MPI_Scatter(&name,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//send
    }
    else {
        char** mArray=malloc(2*sizeof(char*));
        int k;

        for(k=0;k<2;k++){
            mArray[k]=malloc(15*sizeof(char));
        }
        MPI_Scatter(&mArray,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//receive       
        printf("line is %s \n",mArray[rank-1]);
    }
    MPI_Finalize();
}

2 个答案:

答案 0 :(得分:3)

  name[0]="name";

  name[1]="age";

这不是字符串副本。好吧,不像你可能认为的那样。 你对malloced空间进行了malloced并将其分配给name [0]和name [1],然后你用指向文字字符串“name”和“age”的指针来编写这些指针。你被malloced的char [15]数组丢失了(内存泄漏)。

然后,当您尝试使用MPI_Scatter发送它时,您实际上发送了name指向的内容,这是一个指针,而不是字符串。 (-->以下表示要点)

name --> [0x4321, 0x2348]
0x4321 --> "name"
0x2348 --> "age"

但是你散布(至少部分)[0x4321, 0x2348]甚至更多。

我之前没有使用过MPI库(我记得),但我怀疑你对MPI_Scatter的其他参数是不对的,因为误解了字符串(字符数组)和指针。

我想如果你这样做了:

char name[2][15] = {"name", "age"};

并且在代码的分散部分忘记了你的malloc,你会有更轻松的时间,尽管很多次尝试使用2d C数组也会让你搞砸了。这里有很多问题是由于人们误解了数组指针和2d数组之间的差异。

答案 1 :(得分:0)

正如nategoose指出的那样,你的字符串定义都是错误的。首先解决这些问题,不要打扰MPI调用,直到你printf()为止。此外,只有当age字符串直接跟在内存中的name字符串时,Scatter才会起作用:否则,它将用垃圾填充邮件的第二部分(或者直接向你发送段错误)。我不确定是否

char name[2][15] = {"name", "age"};

将两个字符串放在彼此的旁边,或者它只是将两个指针放在彼此相邻的位置,这些指针指向内存中。如果它是前者,那么使用它。否则,我建议你根本不使用二维数组,而是声明你的字符串:

char[2*15] name = "name";
sprintf(name+15, "age");

Scatter的参数也是错误的。第一个参数应该是name,而不是&name:Scatter需要一个指针,传递&name将导致它尝试发送name的内存地址而不是其内容。< / p>

第二个和第五个参数也不正确:你想发送30个字符(因为它是一个2 * 15阵列),而不只是1个。