在mpi中有一种简单的方法来实现原子整数运算(单向)吗? 上次我三年前看过,mpi书中的例子实现起来相当复杂。
答案 0 :(得分:2)
前两种模式是“主动目标同步”,其中目标(目标进程,执行单向调用的进程称为原点)明确声明其窗口(“共享”区域)的时期暴露了。然后,您可以区分这个统一声明的时期(MPI_Win_fence
)和它是一个群组的本地时间(MPI_Win_start
/ post
/ wait
/ complete
来电)。
通过MPI_Win_lock
/ unlock
调用完成接近真实片面的事情,其中原点锁定目标上的“共享”区域以获得对它的独占访问权。这称为“被动目标同步”,因为目标完全没有意识到其共享区域发生的任何事情;这需要守护进程在目标上运行。
MPI_Fetch_and_op
指令。
例如,如果您使用MPI_REPLACE
,您将获得“共享”内存中区域的读数,并使用您指定的内容覆盖它。这足以实现原子操作。
答案 1 :(得分:0)
我不这么认为。问题的一部分是大多数平台(硬件,o / s,库等的组合)在并发进程运行时不为整数操作提供原子性保证,通常由程序员在需要时强制执行此类行为。 MPI似乎以同样的方式运作。
答案 2 :(得分:0)
使用MPI无法实现一般情况下的“原子”单侧读/修改/写操作。
对于节点之间的操作,没有办法使用公共互连来获得“原子”操作附近的任何地方。 TCP / IP层不能执行任何原子操作。 IBV结构涉及库的层和本地HCA的内核模块,一些通过一个或多个交换机的路径,另一个带有内核模块的HCA和另一侧的更多层库。
对于同一节点上的排名之间的操作,如果需要为单个整数操作保证“原子”,那么共享内存是适当的工具,MPI不是。
答案 3 :(得分:0)
MPI 3.0添加了原子。有关详细信息,请参见https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report/node272.htm。
MPI_Accumulate
对窗口数据执行原子更新。MPI_Get_accumulate
获取值并执行更新。MPI_Fetch_and_op
与MPI_Get_accumulate
类似,但是它是单个元素常见情况的简写功能。MPI_Compare_and_swap
的名称所暗示的作用。有关这些功能的语义保证的详细信息,请参见https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report/node290.htm。