MPI共享内存访问

时间:2013-10-28 15:50:21

标签: parallel-processing mpi

在并行MPI程序中,例如100个处理器:

如果所有MPI流程都应知道全局计数,并且每个流程中的每一个都可以添加到此数字,其他人应立即看到更改并添加到更改的值。

无法进行同步,并且会出现很多延迟问题。

在所有进程中打开共享内存并使用此内存来访问此数字也可以改变它吗?

使用MPI_WIN_ALLOCATE_SHARED或类似的东西是否可以,或者这不是一个好的解决方案?

1 个答案:

答案 0 :(得分:4)

你的问题告诉我你要吃蛋糕也要吃。这将以泪水结束。

我写你想要你的蛋糕并且也吃它因为你声明要同步100个进程的活动而不同步。您希望有100个进程递增共享计数器(可能)以正确且一致地应用所有更新,并使增量立即传播到所有进程。无论你如何解决这个问题,它都是同步的;要么编写同步代码,要么将任务卸载到库或运行时为您完成。

期望MPI RMA为您提供自动同步是否合理?不,不是真的。首先请注意,mpi_win_allocate_shared仅在通信器中进行调用的所有进程都在共享内存中时才有效。鉴于您拥有支持同一个共享内存中100个进程的硬件,您仍然必须编写代码以确保同步,MPI不会为您执行此操作。如果您确实有100个进程,其中任何一个或所有进程可能会增加共享计数器,则MPI标准中没有任何内容,或者我熟悉的任何实现,这将阻止该计数器上的数据竞争。

即使是共享内存并行程序(与提供类似共享内存的并行程序的MPI相反)也必须采取措施来避免数据争用和其他类似问题。

您当然可以编写一个MPI程序来同步对共享计数器的访问,但更好的方法是重新考虑程序的结构,以避免进程之间过于紧密的同步。