有没有一种简单的方法可以在 mpi 中实现原子整数操作(单面)?上次我三年前看的时候,mpi book 中的示例实现起来相当复杂。
3 回答
单面的 MPI 相当复杂,大约有三种(更像是两个半)不同的机制。
前两种模式是“主动目标同步”,其中目标(作为目标的进程,进行单向调用的进程称为源)显式声明其窗口(“共享”区域)暴露的时期。然后,您可以区分这个时代被集体声明(MPI_Win_fence
)和它是一个组的本地(///MPI_Win_start
调用)。post
wait
complete
MPI_Win_lock
使用/调用完成了接近真正片面的事情,unlock
其中源锁定目标上的“共享”区域以获得对其的独占访问。这称为“被动目标同步”,因为目标完全不知道其共享区域发生的任何事情;这需要在目标上运行一个守护进程左右。
到目前为止 MPI-2 的状态。不幸的是,您只能在锁定/解锁时期读取或写入,但不能同时读取或写入,因此无法以直接的方式进行原子获取和任何操作。这在具有MPI_Fetch_and_op
指令的 MPI-3 中得到了解决。
例如,如果您使用,MPI_REPLACE
您将读取“共享”内存中的区域并用您指定的内容覆盖它。这足以实现原子操作。
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。
没有办法使用 MPI 实现一般情况下的“原子”单面读/修改/写操作。
对于节点之间的操作,没有办法使用通用互连来接近“原子”操作。TCP/IP 层不能做任何原子操作。IBV 结构涉及到本地 HCA 的库层和内核模块,通过一个或多个交换机的一些路径,另一个具有内核模块的 HCA 和另一侧的更多层库。
对于同一节点上的等级之间的操作,如果您需要保证单个整数操作的“原子”,那么共享内存是合适的工具,MPI 不是。