mpi4py 中的 info 和 assertion

上一篇中我们介绍了 mpi4py 中的错误处理,下面我们将介绍 mpi4py 中的 info 和 assertion。

MPI 允许用户提供两种类型的与应用有关的信息:hints 和 assertions。hints 是应用中所做的有助于提高程序性能的选项,MPI 实现可以忽略用户提供的 hints 而不影响程序的正确性;assertions 是用户(编程者)给 MPI 实现的有关其应用程序行为的保证——如果程序给出的某个 assertion 并不正确,MPI 实现可能会产生错误的结果。在 MPI 中大多数的 hints 都是通过 MPI.Info 对象传递给 MPI 实现的,而 assertions 则是传递给一些 MPI 函数/方法的整数值。用户可以不提供 hints 或 assertions,应用程序可以在不提供它们的情况下正确运行,但是,提供合适的 hints 或正确的 assertions 可以提高应用程序的性能。hints 和 assetions 都是可移植的。除了 MPI 标准提供的 hints 外,不同的 MPI 实现可能会定义额外的不同的 hints,用户应该查看相关的文档以了解可用的 hints 及其作用。

MPI-2 引进了 Info 对象,MPI 中的很多函数都使用了 info 参数,Info 参数以 <key,value> 字符串二元组的形式定义信息。MPI 本身也使用一些预留的关键字来保存环境与外部交互,以及其他一些属性信息。关键字和值分别由 MPI.MAX_INFO_KEY 和 MPI.MAX_INFO_VAL 定义上限。

hints 和 Info 对象

一般接口

MPI.Info.Create(type cls)

创建一个 Info 对象,将其 <key,value> 二元组初始化为空。

MPI.Info.Dup(self)

复制当前 Info 对象,包括其中的 <key,value> 二元组。

MPI.Info.Delete(self, key)

从当前 Info 对象中删除 <key,value> 二元组,如果 key 参数指定的关键字不存在,则会抛出 MPI.Exception 异常。

MPI.Info.Free(self)

删除并释放当前 Info 对象,将其值设置为 MPI.INFO_NULL。

MPI.Info.Set(self, key, value)

为当前 Info 对象设置二元组 <key,value>,如果 key 所指定的关键字已经存在,则覆盖其原有的值。如果 keyvalue 参数的字符串长度超过上限,则会抛出 MPI.Exception 异常。

MPI.Info.Get(self, key, int maxlen=-1)

从当前 Info 对象中获取关键字 key 的值,如果该关键字不存在,则返回 None。maxlen 是获取的值的最大长度,如果该长度小于值的实际长度,则返回的是被截断的值,maxlen 如果为小于 0 或大于 MPI.MAX_INFO_VAL,则会使用 MPI.MAX_INFO_VAL。

MPI.Info.Get_nkeys(self)

返回当前 Info 对象中定义的关键字总数。

MPI.Info.Get_nthkey(self, int n)

返回当前 Info 对象中第 n 个关键字,关键字编号从 0 开始。

类似与字典的接口

MPI.Info.__len__(self)

使用 len 函数获取当前 Info 对象中定义的关键字总数。

MPI.Info.__contains__(self, object key)

使用 in 来测试当前 Info 对象中是否包含 key 关键字。

MPI.Info.__iter__(self)

迭代器接口。

MPI.Info.__getitem__(self, object key)

使用 info[key] 获取 key 对应的值。

MPI.Info.__setitem__(self, object key, object value)

使用 info[key] = value 的方式为当前 Info 对象设置 <key,value> 二元组。

MPI.Info.__delitem__(self, object key)

使用 del info[key] 的方式从当前 Info 对象中删除 <key,value> 二元组。

MPI.Info.get(self, object key, object default=None)

获取当前 Info 对象的 key 关键字对应的值,如果 key 不存在,则返回 default

MPI.Info.keys(self)

返回当前 Info 对象的所有关键字,结果是一个 list。

MPI.Info.values(self)

返回当前 Info 对象的所有值,结果是一个 list。

MPI.Info.items(self)

返回当前 Info 对象的所有 <key,value> 二元组,结果是一个 list,其每一个元素为一个二元 tuple。

MPI.Info.update(self, other=(), **kwds)

otherkwds 中的 key 和 value 来更新当前 Info 对象的关键字和值,类似于 Python 字典的 update 操作。

MPI.Info.copy(self)

复制当前 Info 对象,包括其中的 <key,value> 二元组。同 MPI.Info.Dup。

MPI.Info.clear(self)

删除当前 Info 对象中的所有 <key,value> 二元组。

MPI-3 新方法

因为 Info 对象可以潜在地帮助 MPI 实现提供更高的性能,MPI-3 中新增了若干与 Info 相关的方法,允许设置和获取通信子,窗口以及文件句柄的 Info。另外,MPI-3 中增加一个新的通信子复制方法 MPI.Comm.Dup_with_info,该方法与 MPI.Comm.Dup 的作用类似,不过允许在复制通信子对象的时候为其设置一个新的 Info 对象,而不是将原通信子的 Info 对象也一并复制过来。该方法对 MPI 库的开发非常有用,因为通信子复制方法通常被库的开发者用来在库内部创建一个私有的通信子,以防止库内的通信操作对外部的通信产生干扰,库在复制通信子的过程中可能并不需要将用户设置在原通信子上的某些 info 键值对也一并复制过去,因此可以使用 MPI.Comm.Dup_with_info 在复制的过程中为其设置一个新的库所需要的 Info 对象。下面是这些新方法的使用接口。注意:在 mpi4py 中,MPI.Comm.Dup 方法在传递一个有效的 info 参数时等价于 MPI.Comm.Dup_with_info。

通信子

MPI.Comm.Dup(self, Info info=None)

MPI.Comm.Dup_with_info(self, Info info)

MPI.Comm.Set_info(self, Info info)

MPI.Comm.Get_info(self)

窗口

MPI.Win.Set_info(self, Info info)

MPI.Win.Get_info(self)

文件

MPI.File.Set_info(self, Info info)

MPI.File.Get_info(self)

assertions

MPI 中,assertions 主要使用在单边通信的相关操作中,比如下面的一些方法接口:

MPI.Win.Fence(self, int assertion=0)

MPI.Win.Lock(self, int rank, int lock_type=LOCK_EXCLUSIVE, int assertion=0)

MPI.Win.Lock_all(self, int assertion=0)

MPI.Win.Post(self, Group group, int assertion=0)

MPI.Win.Start(self, Group group, int assertion=0)

这些方法及其 assertion 参数的作用和可能取值在单边通信MPI-3 中增强的单边通信中作过相应的介绍。

例程

下面给出使用例程。

# info.py

"""
Demonstrates the usage of info and assertion.

Run this with 1 processes like:
$ mpiexec -n 1 python info.py
or
$ python info.py
"""

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_WORLD

# create an info object
info = MPI.Info.Create()
# dupicate the info
info1 = info.Dup()
# free the duplicated info
info1.Free()
# becomes MPI.INFO_NULL after the free op
assert info1 == MPI.INFO_NULL

try:
    # try to delete a non-existed key from info
    info.Delete('a')
except MPI.Exception as e:
    print e.error_string

# set key and value
info.Set('k1', 'v1')
info.Set('k2', 'v2')
info.Set('k3', 'v3')
print 'k1:', info.Get('k1')
print 'nkeys:', info.Get_nkeys()
print 'the second key:', info.Get_nthkey(1)

try:
    # try to set a key with length > MPI.MAX_INFO_KEY
    info.Set('k' * (MPI.MAX_INFO_KEY + 1), 'v')
except MPI.Exception as e:
    print e.error_string

try:
    # try to set a value with length > MPI.MAX_INFO_VAL
    info.Set('k', 'v' * (MPI.MAX_INFO_VAL + 1))
except MPI.Exception as e:
    print e.error_string

# dict interface
print 'len(info):', len(info)
print 'k1 in info:', 'k1' in info
# __iter__ method
for k in info:
    print k
info['k4'] = 'v4'
print 'k4:', info['k4']
del info['k4']
print 'k4:', info.get('k4', 'v4_new')
print 'keys:', info.keys()
print 'values:', info.values()
print 'items:', info.items()
info.update({'k1': 'v1_new', 'k5': 'k5_new'})
print 'items after update:', info.items()
info.clear()
print 'items after clea:', info.items()

# info with comm
comm_info = MPI.Info.Create()
comm.Set_info(comm_info)
comm.Get_info()
info_dup = MPI.Info.Create()
comm.Dup_with_info(info_dup)

运行结果如下:

$ python info.py
MPI_ERR_INFO_NOKEY: unknown key for given info object
k1: v1
nkeys: 3
the second key: k2
MPI_ERR_INFO_KEY: invalid key argument for info object
MPI_ERR_INFO_VALUE: invalid value argument for info object
len(info): 3
k1 in info: True
k1
k2
k3
k4: v4
k4: v4_new
keys: ['k1', 'k2', 'k3']
values: ['v1', 'v2', 'v3']
items: [('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')]
items after update: [('k1', 'v1_new'), ('k2', 'v2'), ('k3', 'v3'), ('k5', 'k5_new')]
items after clea: []

以上介绍了 mpi4py 中的 info 和 assertion,在下一篇中我们将介绍 mpi4py 中的 Status 对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,966评论 25 707
  • 乳房疯长 重到 世界不能承受之重 轻到 世界不能承受之轻 (一女,乳痛。每天早上一觉醒来,没有痛感。奔波一天之后,...
    热水c阅读 237评论 0 0
  • 从3号晚上吃完药开始注定今天的不平静,原以为3号可以顺顺利利11点半睡觉,结果吃错了药,胃里开始翻腾,又疼又难受,...
    就是有点倔阅读 187评论 0 0
  • In this week, Haw felt much stronger in body and spirit a...
    tomatoking阅读 556评论 0 0
  • 突破古代帝国极限——蒙古帝国的崛起 一 蒙古帝国的崛起,是世界军事史上的奇迹。 在鼎盛时期,蒙古帝国横跨欧亚大陆,...
    司空曙阅读 1,162评论 1 3