2016-05-15 166 views
1

我想知道哪个是确保独占访问MPI中n个进程之间共享资源(如内存窗口)的最佳方式。我试过MPI_Win_lock & MPI_Win_fence,但它们看起来并不像预期的那样工作,即:我可以看到多个进程同时进入关键区域(MPI_Win_lock & MPI_Win_unlock包含MPI_Get和/或MPI_Put)之间的代码。MPI:确保独占访问共享内存(RMA)

我希望你的建议。谢谢。

回答

1

在MPI 2中,您无法真正做到原子操作。这是在MPI 3中使用MPI_Fetch_and_op引入的。这就是您的关键数据被修改的原因。

此外,请注意'MPI_Win_lock'。如上所述here

此例程的名称是误导性的。特别是,这个例程不需要阻塞,除非目标进程是调用进程。

实际阻塞的进程是MPI_Win_unlock,也就是说只有从这个过程返回后,你可以肯定的是,从putget的值是否正确。也许这是更好地描述here

MPI被动目标操作被组织到由MPI Win锁和MPI Win解锁呼叫括起来的访问时期。聪明的MPI实现[10]将所有的数据移动操作(放置,获取和累积)合并到解锁时发生的一个网络事务中。

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

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