我一直试图使用流水线通信方法解决高斯消除的并行版本。当我使用MPI_Send
和MPI_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);
}
}
}
此处,size
和rank
是通信拓扑中处理器的总数和处理器的等级。 row_comm
是一个大小为matrix_size+1
的向量。在流水线通信中,前任发送给后继者。如果后继者的排名为size-1
,则它会翻转并发送到排名为0
的流程。但是,我这样做了吗?
答案 0 :(得分:0)
我建议这个方案避免死锁: IReceive(前) IReceive(SUCC) ISend(前) ISend(SUCC) Waitall(4把手)
如果所有进程都处于同步状态,那么MPI可以完全没有缓冲。