在上一篇中我们介绍了 mpi4py 中的数据类型解析,下面我们将介绍 mpi4py 中的 Op 对象。
MPI 内置定义了很多算符,可以用在 Reduce,Allreduce,Reduce_scatter,Scan,Exscan 等操作上,但是这些内置定义的算符通常只能使用 MPI 预定义数据类型。不过 MPI 支持自定义操作算符,可以用自定义的算符完成更通用的操作,或者操作自定义的数据类型。
mpi4py 中的 MPI.Op 类提供了对操作算符的基本抽象,MPI 中的预定义算符,如 MPI.MAX, MPI.SUM, MPI.REPLACE,MPI.NO_OP,MPI.OP_NULL 等都是 MPI.Op 类的对象,MPI.Op 类提供了相应的方法来创建新的操作算符。MPI.OP 类的相关方法接口如下:
方法
MPI.Op.Create(type cls, function, bool commute=False)
由函数 function
创建一个自定义算符,commute
指明该操作是否满足交换律。function
的原型接口为 func(a, b, dt),其中 a,b 是操作的数据,dt 是数据类型。在 mpi4py 中,如果使用的是以大写字母开头的方法,如 Allreduce,则传递进来的 a 和 b 是 MPI.memory 对象,dt 是一个 MPI.Datatype 对象;如果使用的是以小写字母开头的方法,如 allreduce,则传递进来的 a 和 b 都是 Python 对象,而 dt 为 None 。
MPI.Op.Free(self)
释放该算符对象。注意:只能释放自定义算符,否则会抛出 MPI.Exception。
MPI.Op.Is_commutative(self)
该算符是否满足交换律,是返回 True,否则返回 False。也可以通过属性 is_commutative 获取。
MPI.Op.Reduce_local(self, inbuf, inoutbuf)
将 inbuf
和 inoutbuf
中的数据执行本地规约操作,结果存放在 inoutbuf
中。不支持 MPI.IN_PLACE。
MPI.Op.__bool__(self)
返回 True 如果该算符不是 MPI.OP_NULL,否则返回 False。
MPI.Op.__call__(self, x, y)
以参数 x
和 y
调用该算符。