在上一篇中我们介绍了 mpi4py 中的单边通信相关操作,下面我们将介绍单边通信的同步操作。
单边通信(远端内存访问)操作包括以下两个范畴:
- 主动目标通信。与点到点通信类似,数据从一个进程的内存传送到另一个进程的内存中,两个进程都直接参与通信。
- 被动目标通信。数据仍从一个进程转移到另外一个进程,但这个进程是一个第三方进程。真正参与通信的两个进程都是源——一个负责将数据 put 到第三方进程,另一个则从第三方进程 get 到本地内存中。
与此对应,MPI 提供以下三种远端内存访问的同步机制:
Fence:主动同步
- 提供并行计算中常用到的宽松同步模型,主要用于活动目标通信;
- 在同一个 window 对象组中的所有进程都需要调用 Fence 来启动一个数据交换阶段;
- 数据交换阶段中所有进程都可以发出读写操作请求;
- 在同一个 window 对象组中的所有进程都需要调用 Fence 来结束一个数据交换阶段;
- 第二次 Fence 同步完成时所有的操作请求都已完成。
Start/Post,Wait/Complete 同步:主动同步
- 也用于活动目标通信,适用于需最大限度减少同步操作的场合——仅对一组进程进行同步;
- 和 Fence 类似,但源进程和目标进程指出他们可以和哪一个组的进程进行通信;
- 目标进程:启动一个暴露阶段(Exposure Epoch): Post 打开,Wait 关闭;
- 源进程:启动一个访问阶段(Access epoch):Start 打开,Complete 关闭。
Lock/Unlock:被动同步
- 单边非同步通信;
- 目标进程不主动参与通信过程;
- Lock/Unlock开始/结束被动通信阶段;
- 可通过此类同步操作模拟共享内存访问模式——即公告牌模式,进程可以随机方式访问/更新公告牌的不同部分; <