我想知道在 MPI 中的 n 个进程之间确保对共享资源(例如内存窗口)的独占访问的最佳方法是什么。我已经尝试过 MPI_Win_lock 和 MPI_Win_fence 但它们似乎没有按预期工作,即:我可以看到多个进程同时进入一个关键区域(MPI_Win_lock 和 MPI_Win_unlock 之间包含 MPI_Get 和/或 MPI_Put 的代码)。
我会很感激你的建议。谢谢。
我想知道在 MPI 中的 n 个进程之间确保对共享资源(例如内存窗口)的独占访问的最佳方法是什么。我已经尝试过 MPI_Win_lock 和 MPI_Win_fence 但它们似乎没有按预期工作,即:我可以看到多个进程同时进入一个关键区域(MPI_Win_lock 和 MPI_Win_unlock 之间包含 MPI_Get 和/或 MPI_Put 的代码)。
我会很感激你的建议。谢谢。
在 MPI 2 中,您不能真正进行原子操作。这是在 MPI 3 中使用MPI_Fetch_and_op
. 这就是您的关键数据被修改的原因。
此外,请注意“MPI_Win_lock”。如此处所述:
该例程的名称具有误导性。特别是,这个例程不需要阻塞,除非目标进程是调用进程。
实际的阻塞过程是MPI_Win_unlock
,这意味着只有从这个过程返回后,您才能确定 fromput
和的值get
是正确的。也许这在这里描述得更好:
MPI 被动目标操作被组织成由 MPI Win lock 和 MPI Win unlock 调用括起来的访问时期。聪明的 MPI 实现 [10] 将所有数据移动操作(放置、获取和累积)组合到一个在解锁时发生的网络事务中。
该文档还可以为您的问题提供解决方案,即关键数据不是原子写入的。它通过使用互斥体来做到这一点,互斥体是一种确保同时只有一个进程可以访问数据的机制。
我建议您阅读此文档:他们提出的解决方案并不难实施。