在上一篇中我们介绍了 MPI 3.1 新增的若干功能,下面我们将介绍 mpi4py 中的属性和命名操作。
应用程序可在运行时定制一些信息与相应的 MPI 对象(包括通信子对象,数据类型对象,窗口对象等)相关联,称之为该对象的属性。实际上,MPI 内部的一些工作机制也是通过这种方式来实现的,如集合操作,虚拟进程拓扑等。属性为本地(当前)进程和相关对象所私有,不会自动迁移到其它对象中,除非使用像 MPI_Comm_dup 等的操作进行复制。
从 MPI-2 开始也可对 MPI 对象命名。命名 MPI 对象可方便错误处理、调试等工作。命名 MPI 对象无须全局同步,即命名函数是一个本地操作。 MPI 对象命名后不会因复制而被其副本继承。对象的名字采用与属性不同的处理方式——即对象的名字由 MPI 环境复制保存而非通过应用程序加以维护。
下面对属性和命名操作的相关方法接口进行介绍。
通信子
MPI.Comm.Create_keyval(type cls, copy_fn=None, delete_fn=None, nopython=False)
创建并返回一个与通信子对象关联的属性键(为一个整型值),以后使用该键访问其所关联的值。copy_fn
为属性复制函数,用于定义在调用 MPI.Comm.Dup 时复制相应属性的策略,delete_fn
为属性删除函数,用于定义在调用 MPI.Comm.Free 或 MPI.Comm.Delete_attr 时释放相应属性的策略。当 copy_fn
为 None 时,会使用默认的复制函数(默认行为为不复制),当 delete_fn
为 None 时,会使用默认的删除函数(默认行为为不删除),如果非 None,它们的函数原型定义为
def copy_fn(o, k, v):
和
def del_fn(o, k, v):
其中的参数为:o
为属性所关联的对象,k
为所创建的属性键,v
为 k
所关联的值,可以在这两个函数中定制对某个值的复制和删除行为,然后将它们作为参数传递给 copy_fn
和 delete_fn
以实现特定的复制和删除行为。参数 nopython
指明是否可以设置 Python 对象作为属性,其默认值 False 表明可以设置 Python 对象作为属性,否则只能设置 C/Fortran 支持的数据对象。
MPI.Comm.Free_keyval(type cls, int keyval)
将属性键 keyval
的值设置为 MPI.KEYVAL_INVALID 并返回,待不用时释放占用空间。
MPI.Comm.Set_attr(self, int keyval, attrval)
为属性键 keyval
设置属性值 attrval
,如果指定的 keyval
键尚不存在则出错,如果该键已经有属性值,则该调用相当于先调用 MPI.Comm.Delete_attr 删除旧值,然后再设置新值。注意:当调用 MPI.Comm.Create_keyval 创建 keyval
时如果其 nopython
参数为 False,则此处 attrval
可以为 Python 对象如列表,字典等,但是如果 nopython
参数为 Tru