2013-07-07 48 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

谢谢。问题是,我是一名初学者,对于根据进程数量分发数组片是不太自信的。循环运行的基本设计是否将工作的不同部分分配给不同的过程声音? –