mpi原子读/修改/写

时间:2010-05-25 04:20:11

标签: atomic mpi

在mpi中有一种简单的方法来实现原子整数运算(单向)吗? 上次我三年前看过,mpi书中的例子实现起来相当复杂。

4 个答案:

答案 0 :(得分:2)

MPI单方面相当复杂,大约有三个(更像是两个半)不同的机制。

前两种模式是“主动目标同步”,其中目标(目标进程,执行单向调用的进程称为原点)明确声明其窗口(“共享”区域)的时期暴露了。然后,您可以区分这个统一声明的时期(MPI_Win_fence)和它是一个群组的本地时间(MPI_Win_start / post / wait / complete来电)。

通过MPI_Win_lock / unlock调用完成接近真实片面的事情,其中​​原点锁定目标上的“共享”区域以获得对它的独占访问权。这称为“被动目标同步”,因为目标完全没有意识到其共享区域发生的任何事情;这需要守护进程在目标上运行。

到目前为止MPI-2的状态。不幸的是,你只能在锁定/解锁时代中读取或写入但不能同时读取或写入,因此原子获取和任何操作都不可能以直接的方式进行。这是在MPI-3中解决的,它具有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_opMPI_Get_accumulate类似,但是它是单个元素常见情况的简写功能。
  • MPI_Compare_and_swap的名称所暗示的作用。

有关这些功能的语义保证的详细信息,请参见https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report/node290.htm