2017-01-27 83 views
0

我對並行處理很新穎。我有一個按順序計算和存儲二維數組元素的例子。我想用MPI將它轉換成並行程序。使用並行處理迭代2D陣列MPI

以下是順序程序的代碼。

#include <stdio.h> 
int x,y,xMax=10,yMax=10; 
int main() 
{ 
    int arr[yMax][xMax]; 
    for(y =0; y<yMax;x++) 
    { 
     for (x=0;x<xMax;x++) 
     { 
     arr[y][x]=x+y; 
     printf("%d",arr[y][x]); 
     } 
     printf("\n"); 
    } 
} 

我試圖通過並行外for循環將此轉換爲等效的MPI程序如下: 在這裏,我希望每一個過程以計算值爲每個陣列行和發送輸出數組到根方法,該方法在end會收集所有的數組並將它們組合成單個二維數組。

#include <stdio.h> 
#include <mpi.h> 
int x,y,xMax=10,yMax=10,size,rank; 
int main() 
{ 
    int arr[xMax]; 
    int arrall[yMax][xMax]; 
    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    for(y =0+rank; y<yMax;y=y+size) 
    { 
     for (x=0;y<xMax;x++) 
     { 
     arr[y][x]=x+y; 

     } 
     MPI_Send(arr,xMax,MPI_INT,0,0,MPI_COMM_WORLD); 
    } 
    if(rank==0) 
    { 
    MPI_Gather(arr,xMax,MPI_INT,&arrall,xMax*yMax,MPI_INT,0,MPI_COMM_WORLD); 
    } 
    MPI_Finalize(); 
} 

但是,當我編譯程序,並等待了一段時間,但它仍然沒有給出任何結果。並沒有顯示錯誤。 我在此嘗試了相當長的一段時間,並尋找任何解決方案,但無法找到。任何幫助都感激不盡。謝謝

回答

0

你實際上在想太複雜。 MPI的集體業務負責發送和接收部分。在標記寫入時,點對點消息(如MPI_Send)將僅與點對點消息(例如MPI_Recv)匹配,並且集體只與相同的集體匹配。

整個通信與一個單一的調用來完成,以MPI_Gather所有進程:

MPI_Gather(arr,xMax,MPI_INT,arrall,xMax,MPI_INT,0,MPI_COMM_WORLD); 

注意,該recvcountxMax,因爲它指定的元素在每一個收到的號碼。

一些更多的言論:

  • 你必須確保size == yMax
  • 這隻能是因爲2D陣列奠定了逐行連續在內存中。這不適用於指針「2D」陣列。
  • 在一個真實的MPI程序中,您希望避免將整個工作數據收集在一個等級上,因爲它提供了可伸縮性的限制。相反,你應該分配一切。

編輯:

int rows_per_rank = yMax/size; 
assert(rows_per_rank * size == yMax); 
MPI_Gather(arr,xMax * rows_per_rank,MPI_INT,arrall,xMax * rows_per_rank,MPI_INT,0,MPI_COMM_WORLD); 
+0

謝謝:每列多行特定的一種方式!輸出的大小是多少?它會是一個2D數組嗎? – Max

+0

'arrall'將填充'size * xMax'元素。 「輸出」將匹配2D陣列的數據佈局。 – Zulan

+0

「你必須確保尺寸== yMax」你能幫我解決這個問題嗎?如果yMax = 1000,我不能將任務交給1000個進程。謝謝 – Max