2013-07-07 46 views
0

接收3D陣列我有需要傳遞一些陣列發送/ MPI中

int main() 
{ 
    //... 
    //..Allocating many 3D,1D arrays and initializing fixed-value arrays 
    //..Initializing named constants here at compile time   
    //..initializing other constants at run time (not changed during the program runtime) 
    //... 

    for(int n=0;n<=1000;n++){ 
     func1(); //Needs some 3D arrays to modify, some fixed-value arrays and lots of constants 
     func2(); //Same here 
     func3(); //Same here 

    } 

    //.. Data saving routines 
    return 0; 
} 

我正在考慮拆分它分爲MPI程序,像這樣

//Allocate all of the arrays 
MPI_Comm_rank(MPI_Comm_World,&rank); 

if(rank==0){ 
    //Initialize all of the arrays and named constants 
    MPI_Bcast(); //Broadcasting all the constants and fixed-value arrays needed 

    MPI_ISend();//Send 3D arrays needed by func1() 
    MPI_ISend();//Send 3D arrays needed by func2() 
    MPI_ISend();//Send 3D arrays needed by func3() 

    MPI_IRecv();//Receive modified 3D arrays from func1() 
    MPI_IRecv();//Receive modified 3D arrays from func2() 
    MPI_IRecv();//Receive modified 3D arrays from func3() 

    MPI_Wait(); //For all responses to come in 
} 
for(int n=0;n<=1000;n++){ 
    if(rank==1){ 
     MPI_Recv();//Receive broadcast of constants and fixed value arraysfrom master 
     MPI_IRecv(); //Receive 3D arrays from master 
     func1();  //Modify 3D arrays 
     MPI_ISend(); //Send modified arrays back to master 
    } 
    else if(rank==2){ 
     //Similar code 
    } 
    else if(rank==3){ 
     //Similar code 
    } 
} 

MPI_Finalize(); 

我有一個計算程序兩個問題:
1)我繞過300x300x300 3D陣列除了30個常數
和多個被在運行時初始化的固定值的3D陣列的初始廣播。 這樣的設計是否會起作用?

2)如何去使用經過3D MPI_Datatypes陣列? C不支持3D陣列作爲 第一類語言構造

回答

1

這是對你提出的設計擴展的意見,解決你的問題的第1部分。

你應該重新考慮你的計劃的設計。設計一個在4個(而且只有4個)流程上運行的程序幾乎肯定不是必要的也不是有效的。我建議你考慮:

  • 使用MPI(具體的程序mpi_comm_sizempi_comm_rank)的設施讓每個進程確定在運行時有多少進程有什麼級別的每個進程都有。
  • 使用的過程的數目和每道工序,以決定每個進程得到該陣列的片(S)的秩。例如,如果程序在30個進程上執行,則每個進程可能會獲得3D陣列的一片300*300*10
  • 這是完全合理的,而且常常看到的那樣,用於在MPI計算來從一個文件(或其他源)讀取的數據和將其發送到其他過程,和當它涉及到扭轉通信的該圖案中的主過程收集和存儲結果。但是,也可以讓每個進程從文件系統讀取自己的數據;如果你有一個並行文件系統,這可能會更快,但即使沒有,它也可以使每個進程從文件系統中讀取文件系統變得更容易(如果更慢)。
  • 大綱中有一個out和out錯誤。您只有進程0調用mpi_bcast,其他進程調用mpi_recv才能匹配。 mpi_bcast是MPI的集體操作之一,必須由所有這些都發送/接收數據的方法來調用。

至於你的第二個問題,我認爲尼古拉已經指出你在一個有用的方向。

+0

謝謝。問題是,我是一名初學者,對於根據進程數量分發數組片是不太自信的。循環運行的基本設計是否將工作的不同部分分配給不同的過程聲音? –