MPI-3 非阻塞集合通信

上一篇中我們概要地介紹了最新的 MPI-3 標(biāo)準(zhǔn)中引進(jìn)的新特性,mpi4py 3.0.0 支持 MPI-3 的很多新特性梨州,我們將在后面逐步介紹痕囱,下面我們首先介紹 mpi4py 中的非阻塞集合通信。

前面我們介紹了 mpi4py 中的集合通信暴匠,不過前面介紹的是 MPI-1 和 MPI-2 標(biāo)準(zhǔn)下的集合通信方法鞍恢,所有這些方法都是阻塞式的,在通信沒有完成之前巷查,這些方法不會(huì)返回有序,因此無法進(jìn)行后面的計(jì)算任務(wù)。MPI-3 標(biāo)準(zhǔn)引進(jìn)了所有這些集合通信方法的非阻塞版本岛请,mpi4py 中的非阻塞集合通信方法與其對(duì)應(yīng)的阻塞版本有著完全一樣的方法接口旭寿,不同的是這些非阻塞方法會(huì)返回一個(gè) MPI.Request 對(duì)象,然后可以通過該對(duì)象的 Test 或者 Wait 等方法來測(cè)試或等待通信的完成崇败,這部分與非阻塞的點(diǎn)到點(diǎn)通信的測(cè)試和等待是一樣的盅称。非阻塞集合通信也可以防止死鎖,并通過將通信和計(jì)算重疊而提高程序的運(yùn)行效率后室。

方法接口

下面給出非阻塞集合通信的方法接口缩膝。

MPI.Comm.Ibcast(self, buf, int root=0)

非阻塞廣播操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Bcast岸霹,返回 MPI.Request 對(duì)象疾层。

MPI.Comm.Iscatter(self, sendbuf, recvbuf, int root=0)

非阻塞發(fā)散操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Scatter贡避,返回 MPI.Request 對(duì)象痛黎。

MPI.Comm.Iscatterv(self, sendbuf, recvbuf, int root=0)

非阻塞向量發(fā)散操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Scatterv刮吧,返回 MPI.Request 對(duì)象湖饱。

MPI.Comm.Igather(self, sendbuf, recvbuf, int root=0)

非阻塞收集操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Gather杀捻,返回 MPI.Request 對(duì)象井厌。

MPI.Comm.Igatherv(self, sendbuf, recvbuf, int root=0)

非阻塞向量收集操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Gatherv致讥,返回 MPI.Request 對(duì)象仅仆。

MPI.Comm.Ireduce(self, sendbuf, recvbuf, Op op=SUM, int root=0)

非阻塞規(guī)約操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Reduce拄踪,返回 MPI.Request 對(duì)象蝇恶。

MPI.Comm.Iallgather(self, sendbuf, recvbuf)

非阻塞全收集操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Allgather惶桐,返回 MPI.Request 對(duì)象撮弧。

MPI.Comm.Iallgatherv(self, sendbuf, recvbuf)

非阻塞向量全收集操作潘懊。對(duì)應(yīng)阻塞版本的 MPI.Comm.Allgatherv,返回 MPI.Request 對(duì)象贿衍。

MPI.Comm.Iallreduce(self, sendbuf, recvbuf, Op op=SUM)

非阻塞全規(guī)約操作授舟。對(duì)應(yīng)阻塞版本的 MPI.Comm.Allreduce,返回 MPI.Request 對(duì)象贸辈。

MPI.Comm.Ireduce_scatter_block(self, sendbuf, recvbuf, Op op=SUM)

非阻塞非向量規(guī)約發(fā)散操作释树。對(duì)應(yīng)阻塞版本的 MPI.Comm.Reduce_scatter_block,返回 MPI.Request 對(duì)象擎淤。

MPI.Comm.Ireduce_scatter(self, sendbuf, recvbuf, recvcounts=None, Op op=SUM)

非阻塞向量規(guī)約發(fā)散操作奢啥。對(duì)應(yīng)阻塞版本的 MPI.Comm.Reduce_scatter,返回 MPI.Request 對(duì)象嘴拢。

MPI.Comm.Ialltoall(self, sendbuf, recvbuf)

非阻塞全發(fā)散操作桩盲。對(duì)應(yīng)阻塞版本的 MPI.Comm.Alltoall,返回 MPI.Request 對(duì)象席吴。

MPI.Comm.Ialltoallv(self, sendbuf, recvbuf)

非阻塞向量全發(fā)散操作赌结。對(duì)應(yīng)阻塞版本的 MPI.Comm.Alltoallv,返回 MPI.Request 對(duì)象孝冒。

MPI.Comm.Ialltoallw(self, sendbuf, recvbuf)

非阻塞向量全發(fā)散操作柬姚。對(duì)應(yīng)阻塞版本的 MPI.Comm.Alltoallw,返回 MPI.Request 對(duì)象庄涡。

MPI.Intracomm.Iscan(self, sendbuf, recvbuf, Op op=SUM)

非阻塞掃描操作量承。對(duì)應(yīng)阻塞版本的 MPI.Comm.Scan,返回 MPI.Request 對(duì)象穴店。注意:此方法只在組內(nèi)通信子上有定義宴合。

MPI.Intracomm.Iexscan(self, sendbuf, recvbuf, Op op=SUM)

非阻塞前綴掃描操作。對(duì)應(yīng)阻塞版本的 MPI.Comm.Exscan迹鹅,返回 MPI.Request 對(duì)象。注意:此方法只在組內(nèi)通信子上有定義贞言。

MPI.Comm.Ibarrier(self)

非阻塞柵障同步操作斜棚。對(duì)應(yīng)阻塞版本的 MPI.Comm.Barrier,返回 MPI.Request 對(duì)象该窗。

例程

下面給出部分非阻塞集合操作的使用例程弟蚀。

# nbc.py

"""
Demonstrates nonblocking collective communication.

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

import numpy as np
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.Get_rank()

# ------------------------------------------------------------------------
# broadcast a numpy array by using Ibcast
if rank == 0:
    ary = np.arange(10, dtype='i')
else:
    ary = np.empty(10, dtype='i')

req = comm.Ibcast(ary, root=0)
req.Wait()
print 'Ibcast: rank %d has %s' % (rank, ary)


# ------------------------------------------------------------------------
# scatter a numpy array by using Iscatterv
if rank == 0:
    send_buf = np.arange(10, dtype='i')
    recv_buf = np.empty(4, dtype='i')
elif rank == 1:
    send_buf = None
    recv_buf = np.empty(3, dtype='i')
elif rank == 2:
    send_buf = None
    recv_buf = np.empty(2, dtype='i')
else:
    send_buf = None
    recv_buf = np.empty(1, dtype='i')
count = [4, 3, 2, 1]
displ = [0, 4, 7, 9]

req = comm.Iscatterv([send_buf, count, MPI.INT], recv_buf, root=0)
req.Wait()
print 'Iscatterv: rank %d has %s' % (rank, recv_buf)


# ------------------------------------------------------------------------
# Ialltoall
send_buf = np.arange(8, dtype='i')
recv_buf = np.empty(8, dtype='i')
req = comm.Ialltoall(send_buf, recv_buf)
req.Wait()
print 'Ialltoall: rank %d has %s' % (rank, recv_buf)

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

$ mpiexec -n 4 python nbc.py
Ibcast: rank 0 has [0 1 2 3 4 5 6 7 8 9]
Iscatterv: rank 0 has [0 1 2 3]
Ialltoall: rank 0 has [0 1 0 1 0 1 0 1]
Ibcast: rank 1 has [0 1 2 3 4 5 6 7 8 9]
Iscatterv: rank 1 has [4 5 6]
Ialltoall: rank 1 has [2 3 2 3 2 3 2 3]
Ibcast: rank 2 has [0 1 2 3 4 5 6 7 8 9]
Iscatterv: rank 2 has [7 8]
Ialltoall: rank 2 has [4 5 4 5 4 5 4 5]
Ibcast: rank 3 has [0 1 2 3 4 5 6 7 8 9]
Iscatterv: rank 3 has [9]
Ialltoall: rank 3 has [6 7 6 7 6 7 6 7]

非阻塞柵障同步——Ibarrier

非阻塞集合通信方法除 Ibarrier 外都比較容易理解,因?yàn)樗鼈兺鋵?duì)應(yīng)的阻塞版本有著同樣的語義酗失。但是非阻塞的柵障同步操作 Ibarrier 卻讓人感到有點(diǎn)匪夷所思义钉。因?yàn)?Ibarrier 是非阻塞的,并不會(huì)讓運(yùn)行快的進(jìn)程停在此等待其它進(jìn)程规肴,表面上看似乎起不到讓進(jìn)程同步的作用捶闸。實(shí)際上非阻塞的柵障同步 Ibarrier 是一個(gè)非常有用的操作夜畴,合適地使用它可以大大提高程序的計(jì)算效率。Ibarrier 雖然不會(huì)讓進(jìn)程阻塞下來等待删壮,但是到達(dá) Ibarrier 的進(jìn)程會(huì)宣告自己已經(jīng)到達(dá)了需要同步的執(zhí)行點(diǎn)贪绘,然后可以去做其它不依賴于此同步的工作,而不必像在阻塞同步中那樣在此白白等待央碟,其可以周期性地通過 Test 等方法來檢測(cè)是否所有的進(jìn)程都已經(jīng)到達(dá)需要同步的點(diǎn)税灌,只要還有進(jìn)程沒有到達(dá)該點(diǎn),Test 的結(jié)果就會(huì)為 False亿虽,一旦所有進(jìn)程都到達(dá)了同步點(diǎn)菱涤,Test 的結(jié)果就會(huì)為 True,表示完成了所需的同步工作洛勉,所有進(jìn)程可以進(jìn)行后續(xù)依賴于此同步的計(jì)算任務(wù)粘秆。

打個(gè)簡(jiǎn)單的比方,幾個(gè)人商量好 9 點(diǎn)在某會(huì)議室開會(huì)坯认,只有等所有人都到齊后才會(huì)舉行會(huì)議翻擒,有的人可能會(huì)早于 9 點(diǎn)到達(dá),有的人可能會(huì)遲到牛哺,在阻塞同步的情況下陋气,先到的人都會(huì)在會(huì)議室什么事都不做白白等著最后一個(gè)到的人,而在非阻塞同步情況下引润,先到的人可以在會(huì)議室簽個(gè)到或留張小紙條以表明自己已經(jīng)到了巩趁,然后可以到附近溜達(dá)溜達(dá),比如說喝杯咖啡或做點(diǎn)其它與會(huì)議無關(guān)的事情淳附,并每過一段時(shí)間回來看看簽到表或小紙條是否所有人都已到齊议慰,只要還有人沒到,就可以接著做點(diǎn)自己的事情奴曙,一旦所有人都已到齊别凹,會(huì)議就可以舉行了。

下面給出非阻塞柵障同步操作的簡(jiǎn)單示例洽糟。

# Ibarrier.py

"""
Demonstrates the usage of Ibarrier()

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

import time
import random
from mpi4py import MPI


comm = MPI.COMM_WORLD
rank = comm.Get_rank()

# synchronize here by blocking barrier
comm.Barrier()

# each process sleep for a random of time
time.sleep(random.random() / 100000)

# nonblocking barrier
req = comm.Ibarrier()

cnt = 0
while(not req.Test()):
    # do some work until all processes reach the Ibarrier
    print 'rank %d: %d' % (rank, cnt)
    cnt += 1

# do other things depend on this Ibarrier
# ...

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

$ mpiexec -n 4 python Ibarrier.py
rank 3: 0
rank 0: 0
rank 0: 1
rank 0: 2
rank 0: 3
rank 1: 0
rank 2: 0
rank 2: 1
rank 2: 2

在以上例程中炉菲,由于每個(gè)進(jìn)程 sleep 的時(shí)間不同,因此到達(dá) Ibarrier 的時(shí)間也不同坤溃,但是因?yàn)?Ibarrier 是非阻塞的拍霜,因此先到達(dá)的進(jìn)程并不會(huì)阻塞在此等待其它進(jìn)程,而是會(huì)立即返回一個(gè) MPI.Request 對(duì)象 req 并執(zhí)行后續(xù)的計(jì)算工作(此處進(jìn)入 while 循環(huán)輸出循環(huán)次數(shù))薪介,但是只要還有進(jìn)程沒有到達(dá)同步位置點(diǎn) Ibarrier祠饺,req.Test() 就會(huì)返回 False,只有當(dāng)所有進(jìn)程都執(zhí)行完 sleep 到達(dá) Ibarrier 位置汁政,req.Test() 的結(jié)果才會(huì)為 True道偷,所有進(jìn)程才會(huì)退出 while 循環(huán)缀旁。在非阻塞同步的過程中,運(yùn)行快的進(jìn)程(此處即 sleep 時(shí)間少的進(jìn)程)不會(huì)等待運(yùn)行慢的進(jìn)程试疙,而是會(huì)利用此時(shí)間做更多其它的計(jì)算任務(wù)(此處輸出更多的循環(huán)計(jì)數(shù))诵棵。可見非阻塞的柵障同步操作可以避免運(yùn)行快的進(jìn)程的不必要的等待時(shí)間以提高程序的計(jì)算效率祝旷。

以上我們介紹了 mpi4py 中的非阻塞集合通信方法履澳,在下一篇中我們將介紹 mpi4py 中的近鄰集合通信方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怀跛,一起剝皮案震驚了整個(gè)濱河市距贷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吻谋,老刑警劉巖忠蝗,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漓拾,居然都是意外死亡阁最,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門骇两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速种,“玉大人,你說我怎么就攤上這事低千∨湔螅” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵示血,是天一觀的道長(zhǎng)棋傍。 經(jīng)常有香客問我,道長(zhǎng)难审,這世上最難降的妖魔是什么瘫拣? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮告喊,結(jié)果婚禮上拂铡,老公的妹妹穿的比我還像新娘。我一直安慰自己葱绒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布斗锭。 她就那樣靜靜地躺著地淀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岖是。 梳的紋絲不亂的頭發(fā)上帮毁,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天实苞,我揣著相機(jī)與錄音,去河邊找鬼烈疚。 笑死黔牵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爷肝。 我是一名探鬼主播猾浦,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灯抛!你這毒婦竟也來了金赦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤对嚼,失蹤者是張志新(化名)和其女友劉穎夹抗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纵竖,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠烧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靡砌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已脓。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乏奥,靈堂內(nèi)的尸體忽然破棺而出摆舟,到底是詐尸還是另有隱情,我是刑警寧澤邓了,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布恨诱,位于F島的核電站,受9級(jí)特大地震影響骗炉,放射性物質(zhì)發(fā)生泄漏照宝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一句葵、第九天 我趴在偏房一處隱蔽的房頂上張望厕鹃。 院中可真熱鬧,春花似錦乍丈、人聲如沸剂碴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忆矛。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間催训,已是汗流浹背洽议。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漫拭,地道東北人亚兄。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像采驻,于是被迫代替她去往敵國(guó)和親审胚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 在上一篇中我們介紹了 SLURM 資源管理系統(tǒng)挑宠,下面將介紹 MPI-3 的新特性菲盾。 在前面我們介紹了 MPI 的基...
    自可樂閱讀 3,788評(píng)論 1 0
  • 前言 計(jì)算機(jī)編程語言很多,但是適合高性能數(shù)值計(jì)算的語言卻并不多各淀,在高性能計(jì)算的項(xiàng)目中通常會(huì)使用到的語言有 Fort...
    自可樂閱讀 19,709評(píng)論 3 22
  • 在上一篇中我們介紹了 mpi4py 中同步阻塞通信模式懒鉴,下面我們將進(jìn)入到對(duì)非阻塞通信模式的介紹。 非阻塞通信將通信...
    自可樂閱讀 2,453評(píng)論 0 2
  • 早已過了單純地喜歡一個(gè)人或不喜歡一個(gè)人的年紀(jì)了,世事浮沉總會(huì)讓人學(xué)會(huì)看人看事逐漸客觀奴璃。 再讀紅樓悉默,亦如是。 《紅樓...
    子魚ziyu閱讀 1,225評(píng)論 6 11
  • O 今天和部門負(fù)責(zé)客戶分支的領(lǐng)導(dǎo)還有客戶經(jīng)理一起去拜訪客戶公司苟穆。 R 這是一場(chǎng)生意場(chǎng)上的博弈抄课,從與客戶接觸過程中,...
    馮諾伊漫閱讀 157評(píng)論 3 5