2013-01-12 60 views
1

我搜索了很多解釋,但我想我無法弄清楚我該如何做到這一點。我想要做這樣的事情: 使用主處理器,我創建了一個動態二維數組。然後我想;MPI向其他處理器廣播動態2D陣列

1-將此數組發送到其他處理器。並且每個處理器打印這個二維數組。012-2-將此數組的一部分發送給其他人。並且每個處理器將其部件打印到屏幕上。

例如;我有2D陣列11 * 11和4個處理器。等級0是主人。其他人是奴隸。對於第一種情況,我想將所有數組發送到1級,2級和3級。而對於第二種情況,我想將行分享給從機。 11/3 = 3.因此,等級1取3行,等級2取3行,等級3取5行。

這裏是我的代碼:

int processorID; 
int numberOfProcessors; 


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

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD ,&numberOfProcessors); 
    MPI_Comm_rank(MPI_COMM_WORLD ,&processorID); 

    double **array; 

    if(MASTER){ 
     array = (double**) malloc(11*sizeof(double *)); 
     for(i=0; i<11; i++){ 
      array[i] = (double *) malloc(11*sizeof(double)); 
     } 

     for(i=0; i<11; i++){ 
      for(j=0; j<11; j++){ 
       array[i][j] = i*j; 
      } 

     } 
    } 
    MPI_Bcast(array, 11*11, MPI_DOUBLE, 0, MPI_COMM_WORLD); 
    if(SLAVE){ 
     for(i=0; i<11; i++){ 
      for(j=0; j<11; j++){ 
       printf("%f ", array[i][j]); 
      } 

     } 
    } 

    MPI_Finalize(); 
    return 0; 
} 

根據這些鏈接; MPI_Bcast a dynamic 2d array;我需要創建我的數組爲;

if (MASTER){ 

    array = (double**) malloc(121*sizeof(double)) 

     for(i=0; i<11; i++){ 
      for(j=0; j<11; j++){ 
       array[i][j] = i*j; // this is not working. 
      } 
     } 
} 

但如果我這樣做,我不能初始化數組中的每個成員。 Inner for循環不起作用。我找不到解決問題的辦法。

而對於我的第二個問題,我跟着這個鏈接sending blocks of 2D array in C using MPI。我想我需要改變if(從)的內部。我應該爲每個從處理器創建2D子數組。我需要使用MPI_Scatterv。但我完全無法理解。

int main() { 

    ... 
    ... 

    MPI_Scatterv() // what must be here? 
    if(SLAVE){ 
     if(processorID = numberOfProcessor-1){ 
      subArray = (double**) malloc(5*sizeof(double *)); // beacuse number of row for last processor is 5 
      for(i=0; i<11; i++){ 
       array[i] = (double *) malloc(11*sizeof(double)); 
      } 
     } 
     else { 
      subArray = (double**) malloc(3*sizeof(double *)); 
      for(i=0; i<11; i++){ 
       array[i] = (double *) malloc(11*sizeof(double)); 
      } 
     } 
    } 
} 
+0

什麼是您確切的編譯器錯誤信息? –

回答

1

C實際上並沒有多維數組。我建議將您的值存儲在常規的1D緩衝區中,然後從1D值計算正確的索引。像這樣:

double* data = (double*)malloc(sizeof(double)*11*11); 

// Now, to access data[i][j], simply do: 
data[j + i*11] = ...; // this "maps" 2D indices into 1D 

這將免去你所有層次malloc -ing的麻煩,它可以很容易地傳遞給MPI的API。

+0

我做了你所說的。但現在我得到「進程退出沒有調用finalize」錯誤。這是我的新代碼。如果(MASTER){//你說過的話} MPI_Bcast(array,11 * 11,MPI_FLOAT,0,MPI_COMM_WORLD); if(SLAVE){//此處沒有任何內容} MPI_Finalize();返回0; }代碼在這裏結束。但我無法解決它 –

+0

你必須爲從機上的陣列分配內存,否則它們將會出現段錯誤並提前退出。所以分配(但不是填充數組)應該放在'if(MASTER)'部分之前。也許這是問題?否則,檢查MPI_Bcast的返回值是否有任何錯誤代碼。 –

1

不能使用指針數組(你被錯誤地調用「二維數組」),因爲每行指針是不可移植到另一個節點的地址空間。

你所報的線性內存分配創建一個二維數組的代碼是完全正確的,所有你需要做的是索引存儲在row major order,使循環成爲:

double* array = (double*) malloc(121*sizeof(double)); 
if (MASTER){ 
    for(i=0; i<11; i++){ 
     for(j=0; j<11; j++){ 
      array[j+i*11] = i*j; // row major indexing here 
     } 
    } 
} 

/* Scatter code follows */ 

你可以放心地將這類數組分散到多個節點。

+0

但我認爲,而不是雙**,雙*應取代它。我對麼? –

+0

我做了你所說的。但現在我得到「進程退出沒有調用finalize」錯誤。這是我的新代碼。如果(MASTER){//你說過的話} MPI_Bcast(array,11 * 11,MPI_FLOAT,0,MPI_COMM_WORLD); if(SLAVE){//此處沒有任何內容} MPI_Finalize();返回0; }代碼在這裏結束。但我無法解決它 –

+0

對不起,我從你的答案中複製了它,但沒有注意到它。看我的編輯 – talonmies