mpi4py 中的 info 和 assertion

上一篇中我們介紹了 mpi4py 中的錯(cuò)誤處理囚痴,下面我們將介紹 mpi4py 中的 info 和 assertion。

MPI 允許用戶提供兩種類型的與應(yīng)用有關(guān)的信息:hints 和 assertions审葬。hints 是應(yīng)用中所做的有助于提高程序性能的選項(xiàng)深滚,MPI 實(shí)現(xiàn)可以忽略用戶提供的 hints 而不影響程序的正確性;assertions 是用戶(編程者)給 MPI 實(shí)現(xiàn)的有關(guān)其應(yīng)用程序行為的保證——如果程序給出的某個(gè) assertion 并不正確涣觉,MPI 實(shí)現(xiàn)可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果痴荐。在 MPI 中大多數(shù)的 hints 都是通過 MPI.Info 對(duì)象傳遞給 MPI 實(shí)現(xiàn)的,而 assertions 則是傳遞給一些 MPI 函數(shù)/方法的整數(shù)值官册。用戶可以不提供 hints 或 assertions生兆,應(yīng)用程序可以在不提供它們的情況下正確運(yùn)行,但是膝宁,提供合適的 hints 或正確的 assertions 可以提高應(yīng)用程序的性能鸦难。hints 和 assetions 都是可移植的。除了 MPI 標(biāo)準(zhǔn)提供的 hints 外员淫,不同的 MPI 實(shí)現(xiàn)可能會(huì)定義額外的不同的 hints合蔽,用戶應(yīng)該查看相關(guān)的文檔以了解可用的 hints 及其作用。

MPI-2 引進(jìn)了 Info 對(duì)象介返,MPI 中的很多函數(shù)都使用了 info 參數(shù)拴事,Info 參數(shù)以 <key沃斤,value> 字符串二元組的形式定義信息。MPI 本身也使用一些預(yù)留的關(guān)鍵字來(lái)保存環(huán)境與外部交互刃宵,以及其他一些屬性信息衡瓶。關(guān)鍵字和值分別由 MPI.MAX_INFO_KEY 和 MPI.MAX_INFO_VAL 定義上限。

hints 和 Info 對(duì)象

一般接口

MPI.Info.Create(type cls)

創(chuàng)建一個(gè) Info 對(duì)象牲证,將其 <key哮针,value> 二元組初始化為空。

MPI.Info.Dup(self)

復(fù)制當(dāng)前 Info 對(duì)象从隆,包括其中的 <key,value> 二元組缭裆。

MPI.Info.Delete(self, key)

從當(dāng)前 Info 對(duì)象中刪除 <key键闺,value> 二元組,如果 key 參數(shù)指定的關(guān)鍵字不存在澈驼,則會(huì)拋出 MPI.Exception 異常辛燥。

MPI.Info.Free(self)

刪除并釋放當(dāng)前 Info 對(duì)象,將其值設(shè)置為 MPI.INFO_NULL缝其。

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

為當(dāng)前 Info 對(duì)象設(shè)置二元組 <key挎塌,value>,如果 key 所指定的關(guān)鍵字已經(jīng)存在内边,則覆蓋其原有的值榴都。如果 keyvalue 參數(shù)的字符串長(zhǎng)度超過上限,則會(huì)拋出 MPI.Exception 異常漠其。

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

從當(dāng)前 Info 對(duì)象中獲取關(guān)鍵字 key 的值嘴高,如果該關(guān)鍵字不存在,則返回 None和屎。maxlen 是獲取的值的最大長(zhǎng)度拴驮,如果該長(zhǎng)度小于值的實(shí)際長(zhǎng)度,則返回的是被截?cái)嗟闹担?code>maxlen 如果為小于 0 或大于 MPI.MAX_INFO_VAL柴信,則會(huì)使用 MPI.MAX_INFO_VAL套啤。

MPI.Info.Get_nkeys(self)

返回當(dāng)前 Info 對(duì)象中定義的關(guān)鍵字總數(shù)。

MPI.Info.Get_nthkey(self, int n)

返回當(dāng)前 Info 對(duì)象中第 n 個(gè)關(guān)鍵字随常,關(guān)鍵字編號(hào)從 0 開始潜沦。

類似與字典的接口

MPI.Info.__len__(self)

使用 len 函數(shù)獲取當(dāng)前 Info 對(duì)象中定義的關(guān)鍵字總數(shù)。

MPI.Info.__contains__(self, object key)

使用 in 來(lái)測(cè)試當(dāng)前 Info 對(duì)象中是否包含 key 關(guān)鍵字绪氛。

MPI.Info.__iter__(self)

迭代器接口止潮。

MPI.Info.__getitem__(self, object key)

使用 info[key] 獲取 key 對(duì)應(yīng)的值。

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

使用 info[key] = value 的方式為當(dāng)前 Info 對(duì)象設(shè)置 <key钞楼,value> 二元組喇闸。

MPI.Info.__delitem__(self, object key)

使用 del info[key] 的方式從當(dāng)前 Info 對(duì)象中刪除 <key,value> 二元組。

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

獲取當(dāng)前 Info 對(duì)象的 key 關(guān)鍵字對(duì)應(yīng)的值燃乍,如果 key 不存在唆樊,則返回 default

MPI.Info.keys(self)

返回當(dāng)前 Info 對(duì)象的所有關(guān)鍵字刻蟹,結(jié)果是一個(gè) list逗旁。

MPI.Info.values(self)

返回當(dāng)前 Info 對(duì)象的所有值,結(jié)果是一個(gè) list舆瘪。

MPI.Info.items(self)

返回當(dāng)前 Info 對(duì)象的所有 <key片效,value> 二元組,結(jié)果是一個(gè) list英古,其每一個(gè)元素為一個(gè)二元 tuple淀衣。

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

otherkwds 中的 key 和 value 來(lái)更新當(dāng)前 Info 對(duì)象的關(guān)鍵字和值,類似于 Python 字典的 update 操作召调。

MPI.Info.copy(self)

復(fù)制當(dāng)前 Info 對(duì)象膨桥,包括其中的 <key,value> 二元組唠叛。同 MPI.Info.Dup只嚣。

MPI.Info.clear(self)

刪除當(dāng)前 Info 對(duì)象中的所有 <key,value> 二元組艺沼。

MPI-3 新方法

因?yàn)?Info 對(duì)象可以潛在地幫助 MPI 實(shí)現(xiàn)提供更高的性能册舞,MPI-3 中新增了若干與 Info 相關(guān)的方法,允許設(shè)置和獲取通信子障般,窗口以及文件句柄的 Info环础。另外,MPI-3 中增加一個(gè)新的通信子復(fù)制方法 MPI.Comm.Dup_with_info剩拢,該方法與 MPI.Comm.Dup 的作用類似线得,不過允許在復(fù)制通信子對(duì)象的時(shí)候?yàn)槠湓O(shè)置一個(gè)新的 Info 對(duì)象,而不是將原通信子的 Info 對(duì)象也一并復(fù)制過來(lái)徐伐。該方法對(duì) MPI 庫(kù)的開發(fā)非常有用贯钩,因?yàn)橥ㄐ抛訌?fù)制方法通常被庫(kù)的開發(fā)者用來(lái)在庫(kù)內(nèi)部創(chuàng)建一個(gè)私有的通信子,以防止庫(kù)內(nèi)的通信操作對(duì)外部的通信產(chǎn)生干擾办素,庫(kù)在復(fù)制通信子的過程中可能并不需要將用戶設(shè)置在原通信子上的某些 info 鍵值對(duì)也一并復(fù)制過去角雷,因此可以使用 MPI.Comm.Dup_with_info 在復(fù)制的過程中為其設(shè)置一個(gè)新的庫(kù)所需要的 Info 對(duì)象。下面是這些新方法的使用接口性穿。注意:在 mpi4py 中勺三,MPI.Comm.Dup 方法在傳遞一個(gè)有效的 info 參數(shù)時(shí)等價(jià)于 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 主要使用在單邊通信的相關(guān)操作中吗坚,比如下面的一些方法接口:

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 參數(shù)的作用和可能取值在單邊通信MPI-3 中增強(qiáng)的單邊通信中作過相應(yīng)的介紹祈远。

例程

下面給出使用例程。

# 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)

運(yùn)行結(jié)果如下:

$ 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 對(duì)象车份。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牡彻,隨后出現(xiàn)的幾起案子扫沼,更是在濱河造成了極大的恐慌,老刑警劉巖庄吼,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缎除,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡总寻,警方通過查閱死者的電腦和手機(jī)器罐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)废菱,“玉大人技矮,你說(shuō)我怎么就攤上這事抖誉∈庵幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵袒炉,是天一觀的道長(zhǎng)旁理。 經(jīng)常有香客問我,道長(zhǎng)我磁,這世上最難降的妖魔是什么孽文? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮夺艰,結(jié)果婚禮上芋哭,老公的妹妹穿的比我還像新娘。我一直安慰自己郁副,他們只是感情好减牺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著存谎,像睡著了一般拔疚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上既荚,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天稚失,我揣著相機(jī)與錄音,去河邊找鬼恰聘。 笑死句各,一個(gè)胖子當(dāng)著我的面吹牛吸占,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诫钓,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旬昭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菌湃?” 一聲冷哼從身側(cè)響起问拘,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惧所,沒想到半個(gè)月后骤坐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡下愈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纽绍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片势似。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拌夏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出履因,到底是詐尸還是另有隱情障簿,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布栅迄,位于F島的核電站站故,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毅舆。R本人自食惡果不足惜西篓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憋活。 院中可真熱鬧岂津,春花似錦、人聲如沸悦即。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盐欺。三九已至赁豆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冗美,已是汗流浹背魔种。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粉洼,地道東北人节预。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓叶摄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親安拟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛤吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • 乳房瘋長(zhǎng) 重到 世界不能承受之重 輕到 世界不能承受之輕 (一女,乳痛糠赦。每天早上一覺醒來(lái)会傲,沒有痛感。奔波一天之后拙泽,...
    熱水c閱讀 237評(píng)論 0 0
  • 從3號(hào)晚上吃完藥開始注定今天的不平靜淌山,原以為3號(hào)可以順順利利11點(diǎn)半睡覺,結(jié)果吃錯(cuò)了藥顾瞻,胃里開始翻騰泼疑,又疼又難受,...
    就是有點(diǎn)倔閱讀 190評(píng)論 0 0
  • In this week, Haw felt much stronger in body and spirit a...
    tomatoking閱讀 561評(píng)論 0 0
  • 突破古代帝國(guó)極限——蒙古帝國(guó)的崛起 一 蒙古帝國(guó)的崛起荷荤,是世界軍事史上的奇跡退渗。 在鼎盛時(shí)期,蒙古帝國(guó)橫跨歐亞大陸蕴纳,...
    司空曙閱讀 1,164評(píng)論 1 3