0

我有一个需要传递一些数组的计算代码

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 个常量和多个固定值 3D 数组的初始广播之外,我还传递了大约 300x300x300 个 3D 数组。
像上面这样的设计会起作用吗?

2) 如何使用 MPI_Datatypes 传递 3D 数组?C 不支持将 3D 数组作为第一类语言结构

4

2 回答 2

1

这是对您提出的设计的扩展评论,解决了您问题的第 1 部分。

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

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

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

于 2013-07-07T17:15:10.667 回答
1

1)我在这里看不到任何问题,除非您应该正确传递 3D 数组,正如您在第二个问题中提到的那样。

2)如何将 MPI 派生数据类型用于 3D 数组?

于 2013-07-07T13:45:34.410 回答