C 以MPI格式发送/接收3D阵列
我有一个计算代码,需要传递给一些数组C 以MPI格式发送/接收3D阵列,c,mpi,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 durin
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;
}
intmain()
{
//...
//…分配多个3D、1D数组并初始化固定值数组
//..在编译时在此初始化命名常量
//..在运行时初始化其他常量(在程序运行时未更改)
//...
对于(int n=0;n1),我在这里没有看到任何问题,除非您应该正确地传递3D数组,正如您在第二个问题中提到的
2) 这是对您提出的设计的延伸评论,涉及您问题的第一部分
您应该重新考虑程序的设计。几乎可以肯定,设计一个将运行4个(且仅4个)进程的程序是不必要的,也是无效的。我建议您考虑:
- 使用MPI的功能(特别是例程
MPI\u comm\u size
和MPI\u comm\u rank
)让每个进程在运行时确定有多少个进程以及每个进程的级别
- 使用进程数和每个进程的排名来决定每个进程获得的数组切片。例如,如果程序在30个进程上执行,则每个进程可能获得3D数组的
300*300*10
切片
- MPI计算中的主进程从文件(或其他源)中读取数据是完全明智的,而且是常见的并将其发送到其他进程,以在收集和存储结果时扭转这种通信模式。但是,也可以让每个进程从文件系统读取自己的数据;如果您有并行文件系统,这可能会更快,但即使没有并行文件系统,也会更容易(如果较慢)让每个进程轮流从文件系统读取
- 您的大纲中有一个完全错误。您只有进程0调用
mpi\u bcast
,其他进程调用mpi\u recv
进行匹配。mpi\u bcast
是mpi的集体操作之一,必须由所有发送/接收数据的进程调用
关于你的第二个问题,我认为Nikolay为你指出了一个有用的方向。谢谢。问题是,我是一个初学者,对于根据进程数分发数组片不是很有信心。在循环中运行将工作的不同部分分配给不同进程的基本设计是否合理?
//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();