3

有没有一种简单的方法可以在 mpi 中实现原子整数操作(单面)?上次我三年前看的时候,mpi book 中的示例实现起来相当复杂。

4

3 回答 3

2

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

前两种模式是“主动目标同步”,其中目标(作为目标的进程,进行单向调用的进程称为源)显式声明其窗口(“共享”区域)暴露的时期。然后,您可以区分这个时代被集体声明(MPI_Win_fence)和它是一个组的本地(///MPI_Win_start调用)。postwaitcomplete

MPI_Win_lock使用/调用完成了接近真正片面的事情,unlock其中​​源锁定目标上的“共享”区域以获得对其的独占访问。这称为“被动目标同步”,因为目标完全不知道其共享区域发生的任何事情;这需要在目标上运行一个守护进程左右。

到目前为止 MPI-2 的状态。不幸的是,您只能在锁定/解锁时期读取或写入,但不能同时读取或写入,因此无法以直接的方式进行原子获取和任何操作。这在具有MPI_Fetch_and_op指令的 MPI-3 中得到了解决。

例如,如果您使用,MPI_REPLACE您将读取“共享”内存中的区域并用您指定的内容覆盖它。这足以实现原子操作。

于 2013-08-22T17:40:53.473 回答
1

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

于 2020-08-22T00:32:06.133 回答
0

没有办法使用 MPI 实现一般情况下的“原子”单面读/修改/写操作。

对于节点之间的操作,没有办法使用通用互连来接近“原子”操作。TCP/IP 层不能做任何原子操作。IBV 结构涉及到本地 HCA 的库层和内核模块,通过一个或多个交换机的一些路径,另一个具有内核模块的 HCA 和另一侧的更多层库。

对于同一节点上的等级之间的操作,如果您需要保证单个整数操作的“原子”,那么共享内存是合适的工具,MPI 不是。

于 2010-05-25T13:48:39.750 回答