我有一个需要传递一些数组的计算代码
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阵列 第一类语言构造
答案 0 :(得分:1)
1)我没有看到任何问题,除非你应该像第二个问题中提到的那样正确传递3D数组。
答案 1 :(得分:1)
这是对您提议的设计的扩展评论,涉及您问题的第1部分。
您应该重新考虑您的计划的设计。几乎可以肯定,设计一个可在4个(只有4个)流程上运行的程序是不必要的,也不是有效的。我建议你考虑一下:
mpi_comm_size
和mpi_comm_rank
)让每个流程在运行时确定有多少流程以及每个流程的排名。300*300*10
个切片。mpi_bcast
,其他进程调用mpi_recv
进行匹配。 mpi_bcast
是MPI的集体操作之一,必须由发送/接收数据的所有进程调用。关于你的第二个问题,我认为尼古拉指出了一个有用的方向。