在MPI中发送/接收3D阵列

时间:2013-07-07 06:48:57

标签: c 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)除了30个常数的初始广播外,我正在传递300x300x300个3D阵列    以及在运行时初始化的多个固定值3D数组。将这样的设计如上所述    工作?

2)如何使用MPI_Datatypes传递3D数组? C不支持3D阵列    第一类语言构造

2 个答案:

答案 0 :(得分:1)

1)我没有看到任何问题,除非你应该像第二个问题中提到的那样正确传递3D数组。

2)How to use MPI derived data type for 3D array?

答案 1 :(得分:1)

这是对您提议的设计的扩展评论,涉及您问题的第1部分。

您应该重新考虑您的计划的设计。几乎可以肯定,设计一个可在4个(只有4个)流程上运行的程序是不必要的,也不是有效的。我建议你考虑一下:

  • 使用MPI的工具(特别是例程mpi_comm_sizempi_comm_rank)让每个流程在运行时确定有多少流程以及每个流程的排名。
  • 使用进程数和每个进程的等级来确定每个进程获取的数组的切片。例如,如果程序在30个进程上执行,那么每个进程可能会获得3D数组的300*300*10个切片。
  • MPI计算中的主进程从文件(或其他源)读取数据并将其发送到其他进程,并且当它涉及到时反转该通信模式,这是完全合理的,并且经常可见收集和存储结果。但是,也可以让每个进程从文件系统中读取自己的数据;如果你有一个并行文件系统,这可能会更快,但即使没有它,它也可以使每个进程更容易(如果更慢)从文件系统中读取它。
  • 大纲中有一个输出错误。您只有进程0调用mpi_bcast,其他进程调用mpi_recv进行匹配。 mpi_bcast是MPI的集体操作之一,必须由发送/接收数据的所有进程调用。

关于你的第二个问题,我认为尼古拉指出了一个有用的方向。