在上一篇中我们简要地介绍了 mpi4py 中的单边通信概念,下面我们将介绍单边通信的相关操作。
创建/释放窗口对象
注意:在使用单边通信操作之前,所有进程都须通过共同参与的创建窗口操作公开声明自己可供访问的内存空间。
创建和释放窗口对象的方法(MPI.Win 类方法)接口如下:
Create(type cls, memory, int disp_unit=1, Info info=INFO_NULL, Intracomm comm=COMM_SELF)
创建并返回用于单边通信的窗口对象。在组内通信子 comm
所指定的通信子范围内所有进程上执行集合操作,每个进程通过一块内存缓冲区 memory
指定要创建的窗口,可以为 None(或 MPI.BOTTOM),此时不提供可供其它进程访问的窗口。disp_unit
指定在远端内存访问操作中的地址单位,即 origin 所指定的位置在 target 一侧要以 target 进程所指定的 diap_unit
为单位计算。通常如果采用相同类型创建窗口,则统一将 disp_unit
设置成 1 即可。如果有的进程需要以组合数据类型(type)给出缓冲区,则可能需要指定 disp_unit
为 sizeof(type)。info
对象用于为 MPI 环境提供优化所需的辅助信息,目前可用的 key 为 no_lock,如果该值设置为 True,则指示 MPI 环境不对进程的本地窗口加锁,也就是说此时表示应用程序可以确信相应窗口不会作为第三方参与通信,这样就可减少相应进程异步代理机制上的一些额外操作。参与创建窗口的进程可分别指定不同的 memory
,disp_unit
和 info
参数,内存中的同一块区域也可同时存在于多个窗口中,只要应用程序能确保并发访问这块区域所需的安全语义。
Free(self)
释放当前窗口对象。会在所有进程间实施 barrier 同步操作,直至所有进程都执行完毕才返回。所有进程都必须在其远端内存访问结束后才可调用此操作。
通信操作
单边通信的 3 种操作方法(MPI.Win 类方法)接口如下:
Put(self, origin, int target_rank, target=None)
该操作把当前进程 origin
中的数据传输到进程 target_rank
的 target
位置。参数 origin
应该是一个长度为2或3的 list 或 tuple,类似于