如何在流水线通信中使用MPI_Sendrecv?

时间:2016-11-27 06:45:30

标签: c mpi

我一直试图使用流水线通信方法解决高斯消除的并行版本。当我使用MPI_SendMPI_Recv时,我的代码陷入僵局,我试图切换到MPI_Sendrecv_replace。这就是我写的:

     int pred, succ,k;
        MPI_Status stat;
        pred = (size + (rank -1 ))%size;
        succ = (rank + 1) %size;

        for(k=0;k<matrix_size;++k) 
        {
          if(k%size == rank) {
               MPI_Sendrecv_replace(row_comm, matrix_size+1, MPI_DOUBLE,succ,0,
                                    pred, 1, MPI_COMM_WORLD, &stat);
          } else {
                  MPI_Sendrecv_replace(row_comm, matrix_size+1,MPI_DOUBLE,succ,0,
                                        pred, 1, MPI_COMM_WORLD, &stat);
                   if(succ != k%size) {
                      MPI_Send(row_comm, matrix_size+1, MPI_DOUBLE,succ,0,MPI_COMM_WORLD);
                      }


                  }
}

此处,sizerank是通信拓扑中处理器的总数和处理器的等级。 row_comm是一个大小为matrix_size+1的向量。在流水线通信中,前任发送给后继者。如果后继者的排名为size-1,则它会翻转并发送到排名为0的流程。但是,我这样做了吗?

1 个答案:

答案 0 :(得分:0)

我建议这个方案避免死锁: IReceive(前) IReceive(SUCC) ISend(前) ISend(SUCC) Waitall(4把手)

如果所有进程都处于同步状态,那么MPI可以完全没有缓冲。