【问题标题】:MPI: Ensure an exclusive access to a shared memory (RMA)MPI:确保对共享内存 (RMA) 的独占访问
【发布时间】:2016-09-11 05:09:13
【问题描述】:
我想知道在 MPI 中的 n 个进程之间,确保对共享资源(例如内存窗口)的独占访问是最好的方法。我已经尝试过 MPI_Win_lock 和 MPI_Win_fence 但它们似乎没有按预期工作,即:我可以看到多个进程同时进入一个关键区域(MPI_Win_lock 和 MPI_Win_unlock 之间包含 MPI_Get 和/或 MPI_Put 的代码)。
非常感谢您的建议。谢谢。
【问题讨论】:
标签:
algorithm
mpi
mutual-exclusion
mpi-rma
【解决方案1】:
在 MPI 2 中,您无法真正进行原子操作。这是在 MPI 3 中使用MPI_Fetch_and_op 引入的。这就是您的关键数据被修改的原因。
此外,请注意“MPI_Win_lock”。如here所述:
此例程的名称具有误导性。特别是,这个例程不需要阻塞,除非目标进程是调用进程。
实际的阻塞过程是MPI_Win_unlock,也就是说只有从这个过程返回后,你才能确定put和get的值是正确的。也许这更好地描述here:
MPI 被动目标操作被组织成由 MPI Win lock 和 MPI Win unlock 调用括起来的访问时期。聪明的 MPI 实现 [10] 将所有数据移动操作(放置、获取和累积)组合到一个在解锁时发生的网络事务中。
同样的文档还可以为您的问题提供解决方案,即关键数据不是原子写入的。它通过使用 mutex 来做到这一点,这是一种确保同时只有一个进程可以访问数据的机制。
我建议您阅读此文档:他们提出的解决方案并不难实施。