在上一篇中我們簡要總結(jié)了 mpi4py 中的點(diǎn)到點(diǎn)通信,下面我們將介紹組與通信子的基本概念嵌施。
為了理解 MPI 中的組與通信子的概念饲化,我們先來了解以下一些術(shù)語的含義。
- 組(group)
所謂組吗伤,在 MPI 環(huán)境里就是指一組進(jìn)程標(biāo)識(shí)所組成的有序集合吃靠。組中的每個(gè)進(jìn)程都有一個(gè)唯一的 rank 加以標(biāo)識(shí)。組對(duì)象存在于通信子環(huán)境內(nèi)足淆,為通信子定義和描述通信參與者(進(jìn)程)巢块,并提供表示和管理進(jìn)程的若干功能。組內(nèi)的每個(gè)進(jìn)程與一個(gè)整數(shù) rank 相聯(lián)系巧号,rank 的序列號(hào)是連續(xù)的并從 0 開始族奢。mpi4py 有一個(gè)特殊的預(yù)定義組 MPI_GROUP_EMPTY,這是一個(gè)沒有成員的組丹鸿。預(yù)定義的常數(shù) MPI_GROUP_NULL 是為無效組句柄使用的值越走。
注意:不要將 MPI_GROUP_EMPTY 與 MPI_GROUP_NULL 混淆,前者是一個(gè)空組的有效句柄,而后者則是一個(gè)無效句柄廊敌。前者可以在組操作中作為一個(gè)參數(shù)使用铜跑;后者在組釋放時(shí)被返回,不能存在于一個(gè)有效參數(shù)中骡澈。
- 上下文(context)
上下文是通信子所具有的一個(gè)屬性锅纺,它允許對(duì)通信空間進(jìn)行劃分。一個(gè)上下文所發(fā)送的消息不能被另一個(gè)上下文所接收秧廉。不同的庫可使用彼此獨(dú)立的上下文伞广,彼此互不干擾。上下文不是顯式的 MPI 對(duì)象疼电;它們僅作為通信子實(shí)現(xiàn)的一部分而出現(xiàn)嚼锄。
同一進(jìn)程內(nèi)的不同通信子有不同的上下文。上下文實(shí)質(zhì)上是一個(gè)系統(tǒng)管理的標(biāo)志蔽豺,用于保證通信子在點(diǎn)對(duì)點(diǎn)和 MPI 定義的集合通信中的安全性区丑。安全意味著同一通信子內(nèi)的集合和點(diǎn)對(duì)點(diǎn)通信互不干擾,而且不同通信子上的通信也互不干擾修陡。
在組間通信中(嚴(yán)格的點(diǎn)對(duì)點(diǎn)通信〕沧侥,每個(gè)通信子中都存放這兩個(gè)上下文標(biāo)志,一個(gè)在組 A 中用于發(fā)送魄鸦,在組 B 中用于接收宴杀,第二個(gè)在組 B 中用于發(fā)送,在組 A 中用于接收拾因。
- 通信子(communicator)
通信子定義了封裝 MPI 通信的基本模型旺罢。通信子可分為兩類:組內(nèi)通信子(intra-communicator)和組間通信子(inter-communicator)。
- 通信子緩存(cache)
通信子提供了一種緩存機(jī)制绢记,使得用戶可為其關(guān)聯(lián)屬性扁达。
- 組內(nèi)通信子(intra-communicator)
組內(nèi)通信子將組的概念和上下文的概念結(jié)合到一起,其包含了一個(gè) group 實(shí)例蠢熄,作為點(diǎn)到點(diǎn)和/或集合通信的通信上下文跪解,并包含了虛擬進(jìn)程拓?fù)浜推渌鼘傩浴C總€(gè) MPI 通信函數(shù)都要通過通信子確定其通信環(huán)境签孔。每個(gè)通信子都包含了一組進(jìn)程叉讥,消息的源和目的進(jìn)程都由組內(nèi)保存的進(jìn)程 rank 加以區(qū)分。每個(gè)組都必然包含其宿主進(jìn)程本身饥追,即組內(nèi)必然包含本地進(jìn)程图仓。
對(duì)于集合通信,組內(nèi)通信子指明了一系列參加集合操作的進(jìn)程(及它們的次序——當(dāng)需要時(shí)〕判耕。這樣通信子就約束了通信的空間范圍透绩,而且通過 rank 提供了與機(jī)器無關(guān)的進(jìn)程訪問翘骂。
mpi4py 的 MPI 環(huán)境啟動(dòng)后壁熄,自動(dòng)創(chuàng)建兩個(gè)組內(nèi)通信子帚豪,MPI.COMM_WORLD 和 MPI.COMM_SELF,前者包含了啟動(dòng)時(shí)的所有進(jìn)程草丧,后者則僅包含進(jìn)程自身狸臣。另外,預(yù)定義的常數(shù) MPI.COMM_NULL 是為無效通信子使用的值昌执。
在 MPI 的靜態(tài)進(jìn)程模型中烛亦,所有參加計(jì)算的進(jìn)程在 MPI 被初始化后都可得到。對(duì)于這種情況懂拾,MPI.COMM_WORLD 是所有進(jìn)程在計(jì)算時(shí)都可獲得的通信子煤禽;該通信子在所有進(jìn)程具有同樣的值。在進(jìn)程可以動(dòng)態(tài)加入 MPI 執(zhí)行的 MPI 實(shí)現(xiàn)中岖赋,可能是這樣的情形:一個(gè)進(jìn)程開始一個(gè) MPI 計(jì)算無需訪問其它的進(jìn)程檬果。在這種情況下,MPI.COMM_WORLD 是合并所有進(jìn)程的通信子唐断,每一個(gè)加入的進(jìn)程都可立即與之通信选脊。因此 MPI.COMM_WORLD 可能在不同的進(jìn)程中同時(shí)具有不同的值。
所有的 MPI 實(shí)現(xiàn)都要求提供 MPI.COMM_WORLD 通信子脸甘。在進(jìn)程的生命期中不允許將其釋放恳啥。與該通信子對(duì)應(yīng)的組不是以預(yù)定義常數(shù)的形式出現(xiàn)的,但是可以使用 MPI.Comm.Get_group 來獲取和訪問它丹诀。MPI 不指明 MPI.COMM_WORLD 中進(jìn)程序列號(hào)間的對(duì)應(yīng)關(guān)系及其(與機(jī)器相關(guān)的〕絕對(duì)地址钝的,MPI 也不指明任何主進(jìn)程函數(shù)。
- 組間通信子(inter-communicator)
組間通信與組內(nèi)通信是兩個(gè)相對(duì)的概念忿墅,參與組內(nèi)通信的進(jìn)程扁藕,都屬于相同的進(jìn)程組,并在相同的組內(nèi)通信子對(duì)象上下文環(huán)境中執(zhí)行疚脐。相應(yīng)地亿柑,組間通信子把兩個(gè)組綁定在一起,共享通信上下文棍弄,用于管理兩者之間的通信望薄。組間通信常用于解決采取模塊化結(jié)構(gòu)設(shè)計(jì)的,在多個(gè)空間中運(yùn)行的復(fù)雜應(yīng)用中的通信問題呼畸。一個(gè)組內(nèi)的進(jìn)程要與另一個(gè)組的進(jìn)程進(jìn)行通信就要指定目標(biāo)組和目標(biāo)進(jìn)程在目標(biāo)組內(nèi)的 rank 兩個(gè)信息痕支。
MPI 的進(jìn)程總是屬于某些進(jìn)程組。我們稱發(fā)起通信的進(jìn)程所屬進(jìn)程組為本地組(local group)蛮原,而稱包含某次通信發(fā)起者所指定目標(biāo)進(jìn)程的組為遠(yuǎn)程組(remote group)卧须。所謂遠(yuǎn)程組和本地組只是在一次通信過程中形成的相對(duì)的、臨時(shí)的概念。
對(duì)點(diǎn)到點(diǎn)通信花嘶,通信雙方所需指定的消息“信封”仍是(通信子笋籽,rank,tag)椭员,與組內(nèi)通信不同的是车海,組間通信的 rank 總是遠(yuǎn)程組里的 rank。
以上介紹了 mpi4py 中組與通信子的基本概念隘击,要很好地使用組與通信子進(jìn)行組間和/或組內(nèi)的通信操作侍芝,我們需要知道怎么管理組與通信子,訪問組與通信子的相關(guān)信息和屬性埋同,這些都是通過 mpi4py 中提供的相應(yīng)函數(shù)方法來完成的州叠,在下一篇中我們將介紹組管理 API。