在上一篇中我们概要地介绍了最新的 MPI-3 标准中引进的新特性,mpi4py 3.0.0 支持 MPI-3 的很多新特性,我们将在后面逐步介绍,下面我们首先介绍 mpi4py 中的非阻塞集合通信。
在前面我们介绍了 mpi4py 中的集合通信,不过前面介绍的是 MPI-1 和 MPI-2 标准下的集合通信方法,所有这些方法都是阻塞式的,在通信没有完成之前,这些方法不会返回,因此无法进行后面的计算任务。MPI-3 标准引进了所有这些集合通信方法的非阻塞版本,mpi4py 中的非阻塞集合通信方法与其对应的阻塞版本有着完全一样的方法接口,不同的是这些非阻塞方法会返回一个 MPI.Request 对象,然后可以通过该对象的 Test 或者 Wait 等方法来测试或等待通信的完成,这部分与非阻塞的点到点通信的测试和等待是一样的。非阻塞集合通信也可以防止死锁,并通过将通信和计算重叠而提高程序的运行效率。
方法接口
下面给出非阻塞集合通信的方法接口。
MPI.Comm.Ibcast(self, buf, int root=0)
非阻塞广播操作。对应阻塞版本的 MPI.Comm.Bcast,返回 MPI.Request 对象。
MPI.Comm.Iscatter(self, sendbuf, recvbuf, int root=0)
非阻塞发散操作。对应阻塞版本的 MPI.Comm.Scatter,返回 MPI.Request 对象。
MPI.Comm.Iscatterv(self, sendbuf, recvbuf, int root=0)
非阻塞向量发散操作。对应阻塞版本的 MPI.Comm.Scatterv,返回 MPI.Request 对象。
MPI.Comm.Igather(self, sendbuf, recvbuf, int root=0)
非阻塞收集操作。对应阻塞版本的 MPI.Comm.Gather,返回 MPI.Request 对象。
MPI.Comm.Igatherv(self, sendbuf, recvbuf, int root=0)
非阻塞向量收集操作。对应阻塞版本的 MPI.Comm.Gatherv,返回 MPI.Request 对象。
MPI.Comm.Ireduce(self, sendbuf, recvbuf, Op op=SUM, int root=0)
非阻塞规约操作。对应阻塞版本的 MPI.Comm.Reduce,返回 MPI.Request 对象。
MPI.Comm.Iallgather(self, sendbuf, recvbuf)
非阻塞全收集操作。对应阻塞版本的 MPI.Comm.Allgather,返回 MPI.Request 对象。
MPI.Comm.Iallgatherv(self, sendbuf, recvbuf)
非阻塞向量全收集操作。对应阻塞版本的