2

我想知道在 MPI 中的 n 个进程之间确保对共享资源(例如内存窗口)的独占访问的最佳方法是什么。我已经尝试过 MPI_Win_lock 和 MPI_Win_fence 但它们似乎没有按预期工作,即:我可以看到多个进程同时进入一个关键区域(MPI_Win_lock 和 MPI_Win_unlock 之间包含 MPI_Get 和/或 MPI_Put 的代码)。

我会很感激你的建议。谢谢。

4

1 回答 1

1

在 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] 将所有数据移动操作(放置、获取和累积)组合到一个在解锁时发生的网络事务中。

该文档还可以为您的问题提供解决方案,即关键数据不是原子写入的。它通过使用互斥体来做到这一点,互斥体是一种确保同时只有一个进程可以访问数据的机制。

我建议您阅读此文档:他们提出的解决方案并不难实施。

于 2016-08-19T10:27:38.920 回答