mpi4py 中的收集操作

本文从本人简书博客同步过来

上一篇中我们介绍了 mpi4py 中的发散操作方法,下面我们将介绍收集操作。

收集操作是发散操作的逆操作,根进程从其它进程收集不同的消息依次放入自己的接收缓冲区内。

对组间通信子上的收集操作,其方法调用必须包含组间通信子内的所有进程,且其中根进程必须属于某个组。根进程的 root 参数需使用 MPI.ROOT,与根进程处在同一组的其它进程的 root 参数需设置成 MPI.PROC_NULL,而另一组的所有进程的 root 参数为根进程在其组内的 rank。数据将从另一组的所有进程收集到根进程中。

方法接口

mpi4py 中的收集操作的方法(MPI.Comm 类的方法)接口为:

gather(self, sendobj, int root=0)

Gather(self, sendbuf, recvbuf, int root=0)
Gatherv(self, sendbuf, recvbuf, int root=0)

这些方法的参数与发散操作对应的方法的参数类似。Gatherv 用于从各个进程收集不同长度的消息,它的第二个参数 recvbuf 需要设置成类似于 [data, count, displ, MPI.DOUBLE], 其中 countdispl 都是一个整数系列,count 指明应该从各个进程收集来的数据个数,displ 指明从各个进程收集来的数据段应放到接收数据缓冲区中的起始偏离。

对组内通信子对象的 Gather 和 Gatherv,可以将其 sendbuf 参数设置成 MPI.IN_PLACE,此时根进程只会收集与其自身之外的所有其它进程的数据。

例程

下面给出收集操作的使用例程。

# gather.py

"""
Demonstrates the usage of gather, Gather, Gatherv.

Run this with 4 processes like:
$ mpiexec -n 4 python gather.py
"""

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值