在上一篇中我们介绍了 mpi4py 中的非阻塞集合通信方法,下面我们将介绍 mpi4py 中的近邻集合通信方法,另一个 MPI-3 引进的新特性。
近邻集合通信(neighborhood collective communication) 是定义在拓扑通信子之上的一类集合通信操作,不同于一般集合通信操作中通信子上的所有进程都会参与,近邻集合通信只要求拓扑通信子上的某个进程和其直接邻居进程之间进行集合通信,其它进程可以不用参与,因此近邻集合通信具有非常好的可扩展性。
近邻集合操作也有阻塞和非阻塞两个版本。
方法接口
下面给出 mpi4py 中近邻集合通信的方法接口。
MPI.Topocomm.neighbor_allgather(self, sendobj)
近邻全收集操作,对应 MPI.Comm.allgather。以小写字母开头的方法,可以传递任意可被 pickle 的 Python 对象 sendobj
,为阻塞通信方法。
MPI.Topocomm.neighbor_alltoall(self, sendobj)
近邻全发散操作,对应 MPI.Comm.alltoall。以小写字母开头的方法,可以传递任意可被 pickle 的 Python 对象 sendobj
,为阻塞通信方法。
MPI.Topocomm.Neighbor_allgather(self, sendbuf, recvbuf)
近邻阻塞全收集操作,对应 MPI.Comm.Allgather,只适用于传递具有缓冲区接口的对象。
MPI.Topocomm.Neighbor_allgatherv(self, sendbuf, recvbuf)
近邻阻塞向量全收集操作,对应 MPI.Comm.Allgatherv,只适用于传递具有缓冲区接口的对象。
MPI.Topocomm.Neighbor_alltoall(self, sendbuf, recvbuf)
近邻阻塞全发散操作,对应 MPI.Comm.Alltoall,只适用于传递具有缓冲区接口的对象。
MPI.Topocomm.Neighbor_alltoallv(self, sendbuf, recvbuf)
近邻阻塞向量全发散操作,对应 MPI.Comm.Alltoallv,只适用于传递具有缓冲区接口的对象。
MPI.Topocomm.Neighbor_alltoallw(self, sendbuf, recvbuf)
近邻阻塞向量全发散操作,对应 MPI.Comm.Alltoallw,只适用于传递具有缓冲区接口的对象。
MPI.Topocomm.Ineighbor_allgather(self, sendbuf