【发布时间】:2013-10-28 15:50:21
【问题描述】:
在例如 100 个处理器上的并行 MPI 程序中:
如果有一个所有 MPI 进程都应该知道的全局计数编号,并且每个进程都可以添加到该编号,其他进程应该立即看到更改并添加到更改的值。
同步是不可能的并且会有很多延迟问题。
是否可以在所有进程之间打开共享内存并使用该内存来访问这个数字也改变它?
是否可以使用MPI_WIN_ALLOCATE_SHARED 或类似的东西,或者这不是一个好的解决方案?
【问题讨论】:
在例如 100 个处理器上的并行 MPI 程序中:
如果有一个所有 MPI 进程都应该知道的全局计数编号,并且每个进程都可以添加到该编号,其他进程应该立即看到更改并添加到更改的值。
同步是不可能的并且会有很多延迟问题。
是否可以在所有进程之间打开共享内存并使用该内存来访问这个数字也改变它?
是否可以使用MPI_WIN_ALLOCATE_SHARED 或类似的东西,或者这不是一个好的解决方案?
【问题讨论】:
您的问题向我表明,您也想拥有自己的蛋糕并吃掉它。这将以泪水告终。
我写你想吃蛋糕也想吃,因为你声明你想同步 100 个进程的活动而不同步。您希望有 100 个进程递增一个共享计数器,(大概)正确且一致地应用所有更新,并将增量立即传播到所有进程。无论您如何解决这个问题,它都是同步之一;要么您编写同步代码,要么将任务卸载到为您执行此操作的库或运行时。
期望 MPI RMA 为您提供自动同步是否合理?不,不是。首先请注意,mpi_win_allocate_shared 仅在通信器中进行调用的所有进程都在共享内存中时才有效。鉴于您拥有在同一共享内存中支持 100 个进程的硬件,您仍然必须编写代码以确保同步,MPI 不会为您完成。如果您确实有 100 个进程,其中任何一个或所有进程都可能增加共享计数器,那么 MPI 标准或我熟悉的任何实现中没有任何内容可以防止该计数器上的数据竞争。
即使是共享内存并行程序(与 MPI 提供类似共享内存的并行程序相反)也必须采取措施避免数据争用和其他类似问题。
您当然可以编写一个 MPI 程序来同步对共享计数器的访问,但更好的方法是重新考虑您的程序结构以避免进程之间过于紧密的同步。
【讨论】:
MPI_ACCUMULATE 允许在共享窗口中以原子方式递增值,但仍需要通过锁 (MPI_LOCK/MPI_UNLOCK) 或栅栏 (MPI_WIN_FENCE) 同步内存访问。另请注意,MPI_WIN_ALLOCATE_SHARED 是一个 MPI-3.0 调用,因此仍未得到广泛实施。