可以在for循环中使用持久通信吗?

时间:2017-12-04 04:09:43

标签: for-loop mpi communication nonblocking

我想更改MPI_Isend()MPI_Irecv()以保持通信以减少并行程序的时间。

但是在迭代过程中通信过程中的变量会发生变化,所以我在通信功能中改变了我的代码,如下所示。

我的问题是:

  1. 修改后是否持续沟通?
  2. 如果修改后不是持续通信,为什么程序的时间会在计算结果正确的时候停止?

    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
    ....
    

    } } 我很感激你在这个问题上的时间和建议。

0 个答案:

没有答案