2010-05-19 37 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.