在例如 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 程序来同步对共享计数器的访问,但更好的方法是重新考虑您的程序结构以避免进程之间过于紧密的同步。