【发布时间】:2016-01-21 00:52:17
【问题描述】:
在我的 MPI 程序中,我想向相邻进程发送和接收信息。但是如果一个进程结束并且没有发送任何东西,它的邻居将永远等待。我该如何解决这个问题?这是我想要做的:
if (rank == 0) {
// don't do anything until all slaves are done
} else {
while (condition) {
// send info to rank-1 and rank+1
// if can receive info from rank-1, receive it, store received info locally
// if cannot receive info from rank-1, use locally stored info
// do the same for process rank+1
// MPI_Barrier(slaves); (wait for other slaves to finish this iteration)
}
}
我当然要检查边界。当进程号为 1 时,我不会检查 rank-1,当进程是最后一个时,我不会检查 rank+1。但我怎样才能做到这一点?我应该再把它包起来吗?我很困惑。
【问题讨论】:
-
使用单方面的通信怎么样?创建一个包含您想要更新的值的窗口,让远程进程在可能的情况下更新它们(例如
MPI_Set()),当您的循环完成时,使用您拥有的任何值(如果它已被修改与否)。 -
@Gilles 我认为如果代码保持原样会更容易,除了使用 MPI 单向通信来编辑两个布尔值:
prevNeighborDone和nextNeighborDone。当你完成你的循环时,你会在你的两个邻居身上使用单方面的通讯,让他们知道你已经完成了。他们所要做的就是检查他们的布尔值的个人副本,看看他们是否应该收到。
标签: c++ parallel-processing synchronization mpi