在上一篇中我们介绍了 MPI-3 中引进的非阻塞通信子复制和组集合通信子创建方法,下面我们将介绍 MPI-3 中增强的单边通信方法。
MPI-2 引进了单边通信,也称远端内存访问(Remote Memory Access,RMA)。单边通信操作可以提供更高的性能(在有好的硬件支撑的情况下)和更强的功能,简化某些并行编程任务。在前面我们介绍过 MPI-2 引进的单边通信的相关概念和操作方法。MPI-3 极大地扩展了 MPI-2 的单边通信功能,澄清了一些比较模糊的概念,并且解决了限制 MPI-2 的单边通信广泛应用的一些限制。
方法接口
下面给出 MPI-3 中扩展的单边通信相关方法(MPI.Win 类方法)。
窗口创建
Create_dynamic(type cls, Info info=INFO_NULL, Intracomm comm=COMM_SELF)
创建并返回用于单边通信的窗口对象,返回的窗口对象没有为其分配的内存。在组内通信子 comm
所指定的通信子范围内所有进程上执行集合操作。info
对象用于为 MPI 环境提供优化所需的辅助信息,可用的 key 有:
- no_locks:如果为 True,会假定所创建的窗口不会被加锁(即调用 MPI.Win.Lock 或者 MPI.Win.Lock_all)。如果只使用主动同步,则可以设定此 key 为 True,此时 MPI 实现可对单边操作做一些优化。
- accumulate_ordering:默认情况下对同一个窗口的多个 Accumulate 操作会按照严格的调用顺序执行。如果将此 key 设置成 none,则 MPI 实现不会保证对同一个窗口的多个 Accumulate 操作的执行顺序。该 key 也可以设置成一系列由逗号分隔的 rar (read-after-read), war (write-after-read), raw (read-after-write) 和 waw (write-after-write) 以指明相应的执行顺序。放松对执行顺序的限制可能会提高执行效率。
accumulate_ops:如果设置成 same_op,MPI 实现会假定对窗口的同一目的地址的并发 Accumulate 调用都会使用同样的算符。如果设置成 same_op_no_op,MPI 实现会假定对窗口的同一目的地址的并发 Accumulate 调用都会使用同样的算符或者 MPI.NO_OP。该 key 的默认值为 same_op_no_op。
Allocate(type cls, Aint size, int disp_unit=1, Info info=INFO_NULL, Intracomm comm=COMM_SELF)
分配指定大小的内存并创建和返回用于单边通信的窗口对象。在组内通信子 comm
所指定的通信子范围内所有进程上执行集合操作。每个进程所返回的窗口对象会包含一块分配好的 size
大小的内存。每个进程的 size
可以不同,甚至可以为 0。disp_unit
指定在远端内存访问操作中的地址单位,即 origin 所指定的位置在 target 一侧要以 target 进程所指定的 diap_unit
为单位计算。通常如果采用相同类型创建窗口,则统一将 disp_unit
设置成 1 即可。如果有的进程需要以组合数据类型(type)给出缓冲区,则可能需要指定 disp_unit
为 sizeof(type)。info
对象用于为 MPI 环境提供优化所需的辅助信息。
Allocate_shared(type cls, Aint size, int disp_unit=1, Info info=INFO_NULL, Intraco