【问题标题】:Send/Receiving 3D arrays in MPI在 MPI 中发送/接收 3D 数组
【发布时间】:2013-07-08 02:38:36
【问题描述】:

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

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 数组作为 一流的语言结构

【问题讨论】:

    标签: c mpi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      关于您的第二个问题,我认为 Nikolay 为您指明了一个有用的方向。

      【讨论】:

      • 谢谢。问题是,我是一个初学者,对根据进程数分发数组切片不是很有信心。将工作的不同部分分配给不同进程的循环运行的基本设计是否合理?
      猜你喜欢
      • 2018-11-11
      • 2014-09-17
      • 2018-03-12
      • 2012-10-18
      • 2011-08-19
      • 2018-12-04
      相关资源
      最近更新 更多