2010-05-19 35 views
0

我是MPI的初学者,我正在使用C语言和处理器模拟器(MPICH2),我写了下面的代码发送一个二维数组,以使2个处理器从其中取出一条线但它在运行时MPICH2产生的错误,代码:发送2个昏暗的阵列使用分散

#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(); 
} 

回答

3
name[0]="name"; 

    name[1]="age"; 

这不是一个字符串拷贝。好吧,不像你可能认为它是。 您添加了空格并将其分配给名称[0]和名称[1],然后使用指向字符串“name”和“age”的指针写入这些指针。你配合的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数组将得到你也搞砸了。这里有很多问题是由于人们误解阵列和二维数组的指针数组之间的差异。

0

由于nategoose指出,你的字符串定义都是错误的。首先解决这些问题,不要打扰MPI电话,直到你可以printf()他们。而且,只有当age字符串直接跟在内存中的name字符串之后,Scatter才能正常工作:否则,它会用垃圾填充消息的第二部分(或直接在您上面的segfault)。我不知道如果

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

将会把两个字符串紧挨着对方,或者它只是把两个指针相邻点徘徊无论在内存中。如果它确实如此,那就使用它。否则,我会建议您不要在所有使用二维数组,和而宣告你的字符串是这样的:

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

您的散射参数也是错误的。第一个参数应该是name而不是&name:Scatter需要一个指针,通过&name将导致它尝试发送name的内存地址而不是其内容。

第二个和第五个参数也不对:要发送30个字符(因为它是2 * 15阵列),而不仅仅是1.