在上一篇中我们介绍了 mpi4py 中的全收集操作方法,下面我们将介绍全规约操作。
对组内通信子上的全规约操作,组内所有进程都作为根执行一次规约操作,操作完毕后所有进程接收缓冲区的数据均相同。这个操作等价于以某个进程作为根首先进行一次规约操作,然后执行一次广播操作,最后每个进程都得到相同的结果。
对组间通信子上的全规约操作,其关联的两个组 group A 和 group B 都要执行该方法调用,该操作使得 group A 中进程提供的规约结果将保存到 group B 的各进程中,反之亦然。
方法接口
mpi4py 中的全规约操作的方法(MPI.Comm 类的方法)接口为:
allreduce(self, sendobj, op=SUM)
Allreduce(self, sendbuf, recvbuf, Op op=SUM)
这些方法的参数与规约操作对应方法的参数类似,不同的是对全规约操作没有了 root
参数。
对组内通信子对象的 Allreduce,可以将其 sendbuf
参数设置成 MPI.IN_PLACE,此时各进程将从自己的接收缓冲区中提取数据,经过规约操作后,将结果替换接收缓冲区中原来的内容。