我想更改MPI_Isend()
和MPI_Irecv()
以保持通信以减少并行程序的时间。
但是在迭代过程中通信过程中的变量会发生变化,所以我在通信功能中改变了我的代码,如下所示。
我的问题是:
如果修改后不是持续通信,为什么程序的时间会在计算结果正确的时候停止?
int main() { 对于() { //计算过程1将改变q1,q2,b1,b2,b3,b4的值 ....
//communication process
void comm()
{
/*if(rightBoundary==virtualWall)
{
rightProcessNum=processNum+decompositionY*decompositionZ;
for(int k=1;k<nz+1;k++)
for(int j=1;j<ny+1;j++)
{
MPI_Isend(&q1[n][k][j][nx],1,MPI_DOUBLE,rightProcessNum,20,MPI_COMM_WORLD,&req1[0]);
MPI_Isend(&b1 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,21,MPI_COMM_WORLD,&req1[1]);
MPI_Isend(&b2 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,22,MPI_COMM_WORLD,&req1[2]);
MPI_Isend(&b2 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,23,MPI_COMM_WORLD,&req1[3]);
MPI_Isend(&b4 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,24,MPI_COMM_WORLD,&req1[4]);
MPI_Isend(&q2[n][k][j][nx],1,MPI_DOUBLE,rightProcessNum,25,MPI_COMM_WORLD,&req1[5]);
MPI_Waitall(6,req1,sta1);
}
}
if(leftBoundary==virtualWall)
{
leftProcessNum=processNum-decompositionY*decompositionZ;
for(int k=1;k<nz+1;k++)
for(int j=1;j<ny+1;j++)
{
MPI_Irecv(&q1[n][k][j][0],1,MPI_DOUBLE,leftProcessNum,20,MPI_COMM_WORLD,&req2[0]);
MPI_Irecv(&b1 [k][j][0],1,MPI_DOUBLE,leftProcessNum,21,MPI_COMM_WORLD,&req2[1]);
MPI_Irecv(&b2 [k][j][0],1,MPI_DOUBLE,leftProcessNum,22,MPI_COMM_WORLD,&req2[2]);
MPI_Irecv(&b3 [k][j][0],1,MPI_DOUBLE,leftProcessNum,23,MPI_COMM_WORLD,&req2[3]);
MPI_Irecv(&b4 [k][j][0],1,MPI_DOUBLE,leftProcessNum,24,MPI_COMM_WORLD,&req2[4]);
MPI_Irecv(&b5[n][k][j][0],1,MPI_DOUBLE,leftProcessNum,25,MPI_COMM_WORLD,&req2[5]);
MPI_Waitall(6,req2,sta2);
}
}*/
if(rightBoundary==virtualWall)
{
rightProcessNum=processNum+decompositionY*decompositionZ;
for(int k=1;k<nz+1;k++)
{
for(int j=1;j<ny+1;j++)
{
MPI_Send_init(&q1[n][k][j][nx],1,MPI_DOUBLE,rightProcessNum,20,MPI_COMM_WORLD,&req1[0]);
MPI_Send_init(&b1 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,21,MPI_COMM_WORLD,&req1[1]);
MPI_Send_init(&b2 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,22,MPI_COMM_WORLD,&req1[2]);
MPI_Send_init(&b3 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,23,MPI_COMM_WORLD,&req1[3]);
MPI_Send_init(&b4 [k][j][nx],1,MPI_DOUBLE,rightProcessNum,24,MPI_COMM_WORLD,&req1[4]);
MPI_Send_init(&q2[n][k][j][nx],1,MPI_DOUBLE,rightProcessNum,25,MPI_COMM_WORLD,&req1[5]);
MPI_Startall(6,req1);
}
}
MPI_Waitall(6,req1,sta1);
MPI_Request_free(req1);
}
if(leftBoundary==virtualWall)
{
leftProcessNum=processNum-decompositionY*decompositionZ;
for(int k=1;k<nz+1;k++)
{
for(int j=1;j<ny+1;j++)
{
MPI_Recv_init(&q1[n][k][j][0],1,MPI_DOUBLE,leftProcessNum,20,MPI_COMM_WORLD,&req2[0]);
MPI_Recv_init(&b1 [k][j][0],1,MPI_DOUBLE,leftProcessNum,21,MPI_COMM_WORLD,&req2[1]);
MPI_Recv_init(&b2 [k][j][0],1,MPI_DOUBLE,leftProcessNum,22,MPI_COMM_WORLD,&req2[2]);
MPI_Recv_init(&b3 [k][j][0],1,MPI_DOUBLE,leftProcessNum,23,MPI_COMM_WORLD,&req2[3]);
MPI_Recv_init(&b4 [k][j][0],1,MPI_DOUBLE,leftProcessNum,24,MPI_COMM_WORLD,&req2[4]);
MPI_Recv_init(&q2[n][k][j][0],1,MPI_DOUBLE,leftProcessNum,25,MPI_COMM_WORLD,&req2[5]);
MPI_Startall(6,req2);
}
}
MPI_Waitall(6,req2,sta2);
MPI_Request_free(req2);
}
}
//calculation process 2
....
} } 我很感激你在这个问题上的时间和建议。