MPI(Message Passing Interface)
高性能計(jì)算中標(biāo)準(zhǔn)的并行編程模型,他是通用的,通用也是一把雙刃劍官卡,它可以用來(lái)解決大部分的并行問(wèn)題,但是因?yàn)橥ㄓ盟軓?fù)雜醋虏。
并行編程模型
§共享內(nèi)存地址空間
- 主要用于編程SMP /多核機(jī)器寻咒,多個(gè)線程直接共同訪問(wèn)內(nèi)存數(shù)據(jù)。
§關(guān)鍵屬性 - 共享地址空間 - 隱式并行化
§進(jìn)程/線程通信 - 內(nèi)存讀取/存儲(chǔ)
§POSIX線程API(Pthread)/ OpenMP - 創(chuàng)建/刪除線程
- 同步(互斥颈嚼,信號(hào)量)
- 線程管理
§分布式內(nèi)存地址空間
- 最廣泛用于編程并行計(jì)算機(jī)/超級(jí)計(jì)算機(jī)
§關(guān)鍵屬性: - 分區(qū)地址空間
- 顯式并行化
§消息傳遞編程模型 - 每個(gè)處理單元都有自己的私有內(nèi)存
- 交換用于傳遞數(shù)據(jù)的消息
- API:消息傳遞接口(MPI)毛秘,MapReduce等。
消息傳遞模型
§過(guò)程(傳統(tǒng)上)是程序計(jì)數(shù)器和地址空間阻课。
§進(jìn)程可能有多個(gè)線程(程序計(jì)數(shù)器和相關(guān)堆棧)共享一個(gè)地址空間熔脂。
§消息傳遞模型用于進(jìn)程之間的通信,這些進(jìn)程具有單獨(dú)的地址空間柑肴。
§進(jìn)程間通信包括
- 同步
- 將數(shù)據(jù)從一個(gè)進(jìn)程的地址空間移動(dòng)到另一個(gè)進(jìn)程的地址空間
什么是MPI?
§消息傳遞接口(MPI)
§消息傳遞庫(kù)規(guī)范
- 不是語(yǔ)言或編譯器
- 不是具體的實(shí)施或產(chǎn)品, MPI本身是一個(gè)標(biāo)準(zhǔn)旬薯,OpenMP晰骑,MPICH才是具體的實(shí)現(xiàn),是一個(gè)庫(kù)绊序,有C語(yǔ)言的庫(kù)有java的庫(kù)
§適用于并行計(jì)算機(jī)硕舆,集群和異構(gòu)網(wǎng)絡(luò)
§功能齊全,通用庫(kù)
§旨在提供對(duì)高級(jí)并行硬件的訪問(wèn) - 終端用戶
- 庫(kù)作者骤公,可以寫(xiě)一些通用的類庫(kù)
- 工具開(kāi)發(fā)人員抚官,并行工具
MPI來(lái)自哪里?
§早期的供應(yīng)商有自己的系統(tǒng)(英特爾的NX阶捆,IBM的EUI)不可移植不兼容沒(méi)有固定的標(biāo)準(zhǔn)(或非常強(qiáng)大)凌节。
§早期的便攜式系統(tǒng)(PVM钦听,p4,Chameleon)主要是研究工作倍奢。
- 沒(méi)有解決所有的消息傳遞問(wèn)題
- 缺乏供應(yīng)商支持
- 沒(méi)有以最有效的水平實(shí)施
§MPI論壇于1992年組織朴上,廣泛參與: - 供應(yīng)商:IBM,Intel卒煞,TMC痪宰,SGI,Convex畔裕,Meiko
- 可移植性庫(kù)編寫(xiě)者:PVM衣撬,p4
- 用戶:應(yīng)用科學(xué)家和圖書(shū)館作家
- MPI-1在18個(gè)月內(nèi)完成
什么是MPI-1
§通信的基本功能(100多個(gè)功能API)
§阻止發(fā)送,接收
§非阻塞發(fā)送和接收
§上述變更
§豐富的集體溝通功能
- 廣播扮饶,分散具练,聚集等
- 對(duì)性能非常重要; 廣泛使用
§描述數(shù)據(jù)布局的數(shù)據(jù)類型
§過(guò)程拓?fù)?br> §C和Fortran綁定
§錯(cuò)誤代碼和類
什么是MPI-2 / MPI-3
§MPI-2增加了功能,包括
- 并行I / O.
- 遠(yuǎn)程內(nèi)存訪問(wèn)贴届,單向通信靠粪,put和get 不是send/receive
- 動(dòng)態(tài)流程管理
§MPI-3增加了功能,包括 - 容錯(cuò)毫蚓,很弱占键,需要使用checkpoint機(jī)制
- 異步集體溝通
§MPI-4正在進(jìn)行中 - 更好地支持混合編程,容錯(cuò)元潘,新的分析界面
使用MPI的原因
§標(biāo)準(zhǔn)化 - MPI是唯一可以被視為標(biāo)準(zhǔn)的消息傳遞庫(kù)畔乙。 幾乎所有并行平臺(tái)都支持它。 實(shí)際上翩概,它已經(jīng)替換了所有以前的消息傳遞庫(kù)牲距。
§可移植性 - 將應(yīng)用程序移植到支持(并符合)MPI標(biāo)準(zhǔn)的其他平臺(tái)時(shí),無(wú)需修改源代碼钥庇。
§性能 - 供應(yīng)商實(shí)現(xiàn)應(yīng)該能夠利用本機(jī)硬件功能來(lái)優(yōu)化性能牍鞠。選擇正確的API
§功能 - 豐富的功能集
§可用性 - 提供各種實(shí)現(xiàn),包括供應(yīng)商和
公共區(qū)域评姨。
使用MPI時(shí)的重要注意事項(xiàng)
§所有并行性都是顯式的:程序員負(fù)責(zé)正確識(shí)別并行性并使用MPI構(gòu)造實(shí)現(xiàn)并行算法难述。
§MapReduce被認(rèn)為是“簡(jiǎn)化”的編程模型,但有一個(gè)限制吐句,即問(wèn)題必須具有“MAP”和“Reduce”表達(dá)的操作
§MPI是一種通用的并行編程模型胁后,但很復(fù)雜
MPI基本發(fā)送/接收
§我們需要填寫(xiě)詳細(xì)代碼
§需要指定的事項(xiàng):
- 如何描述“數(shù)據(jù)”?什么樣的數(shù)據(jù)嗦枢,那些數(shù)據(jù)送攀芯,那些數(shù)據(jù)收
- 如何識(shí)別流程?
- 接收器如何識(shí)別/屏蔽消息文虏?
- 完成這些操作意味著什么侣诺?
一些基本概念
§進(jìn)程可以收集到組中殖演,COMM_WORLD。
§每條消息都在上下文中發(fā)送紧武,并且必須在相同的上下文中接收剃氧。
§組和上下文一起形成一個(gè)communicator。
§進(jìn)程由與communicator關(guān)聯(lián)的組中的rank來(lái)標(biāo)識(shí)阻星。
§有一個(gè)默認(rèn)的communicator朋鞍,其組包含所有初始進(jìn)程,稱為MPI_COMM_WORLD妥箕。
MPI標(biāo)簽
§如何知道send和receive匹配滥酥,消息與附帶的用戶定義的整數(shù)標(biāo)記一起發(fā)送,以幫助接收過(guò)程識(shí)別消息畦幢。
§可以通過(guò)指定特定標(biāo)記在接收端篩選消息坎吻,或者不通過(guò)默認(rèn)MPI_ANY_TAG消息接收中的標(biāo)記。
§一些非MPI消息傳遞系統(tǒng)稱為“消息類型”標(biāo)簽宇葱。 MPI將它們稱為標(biāo)記以避免與數(shù)據(jù)類型混淆瘦真。
MPI Basic(阻止)發(fā)送
MPI_SEND(地址,計(jì)數(shù)黍瞧,數(shù)據(jù)類型诸尽,dest,標(biāo)記印颤,comm)
§消息緩沖區(qū)由(地址您机,計(jì)數(shù),數(shù)據(jù)類型)年局。
§目標(biāo)進(jìn)程指定為dest它抱,它等級(jí)comm指定的communicator中的目標(biāo)進(jìn)程法牲。
§當(dāng)此函數(shù)返回時(shí)听想,數(shù)據(jù)已傳送到系統(tǒng)眼虱,緩沖區(qū)可以重復(fù)使用。 目標(biāo)進(jìn)程可能尚未收到該消息僵朗。
MPI Basic(阻止)接收
MPI_RECV(地址赖欣,計(jì)數(shù),數(shù)據(jù)類型衣迷,來(lái)源,標(biāo)簽酱酬,通訊壶谒,狀態(tài))
§等待直到從系統(tǒng)接收到匹配(源和標(biāo)記)消息,并且可以使用緩沖區(qū)膳沽。
§任意來(lái)源是comm或MPI_ANY_SOURCE指定的通信器中的等級(jí)汗菜。
§多出的參數(shù)是让禀,狀態(tài),包含更多信息陨界⊙沧幔可以查看收到了多少數(shù)據(jù)的信息,接受量動(dòng)態(tài)變化菌瘪,status方便查詢腮敌。
§接收數(shù)量少于計(jì)數(shù)的數(shù)據(jù)類型是可以的,但是
收到更多是一個(gè)錯(cuò)誤俏扩。
狀態(tài)對(duì)象
§在完成接收后使用狀態(tài)對(duì)象來(lái)查找消息的實(shí)際長(zhǎng)度糜工,來(lái)源和標(biāo)記
§狀態(tài)對(duì)象是MPI定義的類型,并提供以下信息: - 消息的源進(jìn)程(status.source)
- 消息標(biāo)簽(status.tag)
§收到的要素?cái)?shù)量由下式給出:
int MPI_Get_count(MPI_Status * status录淡,MPI_Datatype數(shù)據(jù)類型捌木,int * count)
狀態(tài)返回狀態(tài)接收操作(狀態(tài))
每個(gè)接收緩沖區(qū)元素的數(shù)據(jù)類型數(shù)據(jù)類型(句柄)計(jì)數(shù)接收元素的數(shù)量(整數(shù))(OUT)
MPI在某種意義上很簡(jiǎn)單......
§許多并行程序只能使用這六個(gè)函數(shù)編寫(xiě):
- MPI_INIT - 初始化MPI庫(kù)(必須是第一個(gè)調(diào)用的例程)
- MPI_COMM_SIZE - 獲取通信器的大小
- MPI_COMM_RANK - 獲取調(diào)用進(jìn)程的等級(jí)
在溝通者中 - MPI_SEND - 向另一個(gè)進(jìn)程發(fā)送消息
- MPI_RECV - 向另一個(gè)進(jìn)程發(fā)送消息
- MPI_FINALIZE - 清理所有MPI狀態(tài)(必須是進(jìn)程調(diào)用的最后一個(gè)MPI函數(shù))
§但是,為了提高性能嫉戚,您需要使用其他MPI功能
MPI數(shù)據(jù)類型
使用MPI定義的數(shù)據(jù)格式方便不同平臺(tái)的遷移性
§要發(fā)送或接收的消息中的數(shù)據(jù)由三元組(地址刨裆,計(jì)數(shù),數(shù)據(jù)類型)描述彬檀,其中
§MPI數(shù)據(jù)類型以遞歸方式定義為:
- 預(yù)定義的帆啃,對(duì)應(yīng)于來(lái)自語(yǔ)言的數(shù)據(jù)類型(例如,
MPI_INT凤覆,MPI_DOUBLE_PRECISION) - 連續(xù)的MPI數(shù)據(jù)類型數(shù)組
- 數(shù)據(jù)類型的跨步塊
- 數(shù)據(jù)類型的索引數(shù)組塊
- 數(shù)據(jù)類型的任意結(jié)構(gòu)
§MPI數(shù)據(jù)類型有兩個(gè)目的: - 異構(gòu)性
- 不連續(xù)的數(shù)據(jù)链瓦,一個(gè)send可以送很多不連續(xù)的數(shù)據(jù),如果只使用C語(yǔ)言需要使用很多Send
MPI中的typeMap
§不連續(xù)數(shù)據(jù)可以定義一個(gè)新數(shù)據(jù)類型盯桦,在MPI中慈俯,數(shù)據(jù)類型表示為typemap typemap =(type0,disp0)拥峦,...贴膘,(typen-1,dispn-1)
§數(shù)據(jù)類型的范圍
數(shù)據(jù)類型范圍指定的內(nèi)存位置
§可以使用MPI_UB和MPI_LB設(shè)置人工范圍
CONTIGUOUS數(shù)據(jù)類型
MPI_Type_contiguous(count略号,oldtype刑峡,&newtype)MPI_Type_commit(&newtype)
§假設(shè)原始數(shù)據(jù)類型oldtype具有typemap(double,0)玄柠,double是8個(gè)字節(jié)(char突梦,8),然后重復(fù)三遍就是一個(gè)新的數(shù)據(jù)格式羽利。
MPI_Type_contiguous(3宫患,OLDTYPE,&NEWTYPE);
§要實(shí)際發(fā)送此類數(shù)據(jù)这弧,請(qǐng)使用以下調(diào)用順序:
MPI_Type_contiguous(計(jì)數(shù)娃闲,數(shù)據(jù)類型虚汛,及NEWTYPE);MPI_Type_commit(&NEWTYPE);MPI_SEND(緩沖液,1皇帮,NEWTYPE卷哩,DEST,標(biāo)簽属拾,COMM);MPI_Type_free(&NEWTYPE);
向量數(shù)據(jù)類型
索引數(shù)據(jù)類型
結(jié)構(gòu)數(shù)據(jù)類型
Non-Blocking非阻塞通信
非阻塞(異步)操作返回(立即)可以等待和查詢的“請(qǐng)求handle”(用來(lái)check有沒(méi)有完成)
- MPI_ISEND(start将谊,count,datatype捌年,dest瓢娜,tag,comm礼预,request)
- MPI_IRECV(start眠砾,count,datatype托酸,src褒颈,tag,comm励堡,request)
- MPI_WAIT(請(qǐng)求谷丸,狀態(tài)) 阻塞式
非阻塞操作允許重疊計(jì)算和通信。 也可以在不等待使用MPI_TEST的情況下進(jìn)行測(cè)試应结,就是去檢查請(qǐng)求 - MPI_TEST(請(qǐng)求刨疼,標(biāo)志,狀態(tài))
在任何使用MPI_Send或MPI_Recv的地方鹅龄,您都可以使用這對(duì)
MPI_Isend / MPI_Wait或MPI_Irecv / MPI_Wait揩慕。
多次完成
§有時(shí)需要等待多個(gè)請(qǐng)求:MPI_Waitall(count,array_of_requests扮休,
array_of_statuses)MPI_Waitany(count迎卤,array_of_requests,
&index玷坠,&status)MPI_Waitsome(count蜗搔,array_of_requests,
array_of indices八堡,array_of_statuses)
§每個(gè)都有相應(yīng)的測(cè)試版本樟凄。
MPI中的集體通信
大部分可以用send/receive完成,如果想要更好的性能需要使用Collective機(jī)制兄渺,適合用廣播的模式缝龄。
§集體操作由communicator中的所有進(jìn)程調(diào)用
§沒(méi)有使用消息標(biāo)簽
§在許多應(yīng)用中,點(diǎn)對(duì)點(diǎn)可以被集體通信所取代,從而提高了簡(jiǎn)單性和效率
- 讓內(nèi)部實(shí)施為您優(yōu)化溝通
§三大類: - 同步:障礙
- 數(shù)據(jù)移動(dòng)例程:廣播二拐,收集,分散
- 全局計(jì)算程序:減少(多個(gè)進(jìn)程合并)凳兵,掃描
Barrier障礙同步
處理依賴關(guān)系百新。需要同步一下
§用于同步一組進(jìn)程的執(zhí)行:
int MPI_Barrier(MPI_Comm comm);
§障礙是分離兩個(gè)計(jì)算階段的簡(jiǎn)單方法,以確保兩個(gè)階段的消息不會(huì)相互作用
Movement數(shù)據(jù)移動(dòng)例程
§廣播例程實(shí)現(xiàn)一對(duì)一廣播庐扫,其中單個(gè)命名進(jìn)程(根)將相同數(shù)據(jù)發(fā)送到所有其他進(jìn)程
int MPI_Bcast(void * buffer饭望,int count,MPI_Datatype datatype形庭,int root铅辞,MPI_Comm comm)
單純的挪動(dòng),不做計(jì)算萨醒。
Gather是四個(gè)進(jìn)程的數(shù)據(jù)移動(dòng)匯聚成一個(gè)進(jìn)程的數(shù)據(jù)斟珊,
Scatter是一個(gè)進(jìn)程的數(shù)據(jù)移動(dòng)分離成四個(gè)進(jìn)程的數(shù)據(jù)
Reduction操作
§Reduce操作使用指定的操作OP組合每個(gè)進(jìn)程的輸入緩沖區(qū)中提供的值,并將組合值返回到單個(gè)根進(jìn)程的輸出緩沖區(qū)或所有進(jìn)程的輸出緩沖區(qū)
不但要挪動(dòng)數(shù)據(jù)富纸,還要計(jì)算囤踩。
More on Collective
還有很多的Collective用來(lái)提升性能,很多相似的功能非常容易混淆
MPI-IO
§從用戶的角度來(lái)看:
- 訪問(wèn)數(shù)據(jù)的并行程序的多個(gè)進(jìn)程或線程晓褪,同時(shí)讀寫(xiě)一個(gè)公共文件(共享)
§在單個(gè)文件中生成結(jié)果堵漱,您可以獲得良好的性能
為什么MPI是并行I / O的良好設(shè)置
§寫(xiě)數(shù)據(jù)就像從內(nèi)存發(fā)送和磁盤(pán)接收一樣,讀取就是磁盤(pán)發(fā)送和內(nèi)存接收涣仿。所以IO實(shí)際上就會(huì)死MPI的communication
§任何并行I / O系統(tǒng)都需要:
- Collective來(lái)提升性能
- 用戶定義的數(shù)據(jù)類型勤庐,用于描述內(nèi)存和文件布局
- 用于分隔應(yīng)用程序級(jí)消息傳遞的communicator與I / O相關(guān)的消息傳遞
- 非阻塞操作
§即很多類似MPI的機(jī)器
MPI-IO術(shù)語(yǔ)
§文件指針:隱式指定讀/寫(xiě)的位置
- 個(gè)人:本地文件指針
- 共享:全局文件指針
§偏移:從文件開(kāi)頭的位移 - 明確指定讀/寫(xiě)位置
§文件handle - 標(biāo)識(shí)文件的不透明對(duì)象
- 指向由庫(kù)例程管理的數(shù)據(jù)結(jié)構(gòu)的指針
§訪問(wèn)模式 - 定義文件如何用于讀/寫(xiě)
- 打開(kāi)文件時(shí)指定
- 例如 MPI_MODE_RDONLY,MPI_MODE_RDWR(位標(biāo)志)
并行I / O例程(API)
讀寫(xiě)文件的具體實(shí)現(xiàn)
File View
多個(gè)進(jìn)程讀取一個(gè)文件怎么表達(dá)這個(gè)信息好港,使用文件視圖
§處理對(duì)共享文件的讀/寫(xiě)操作
§每個(gè)進(jìn)程都會(huì)看到文件的一部分
§文件視圖:定義文件的區(qū)域以分隔進(jìn)程
§由三元組指定(位移愉镰,etype和文件類型)
- displacement:從文件開(kāi)頭跳過(guò)的字節(jié)數(shù)
- etype:數(shù)據(jù)訪問(wèn)的基本單位(可以是任何基本或派生數(shù)據(jù)類型)
- filetype:指定文件的哪個(gè)部分對(duì)進(jìn)程可見(jiàn)
用于處理不連續(xù)IO
§連續(xù)的I / O將數(shù)據(jù)從內(nèi)存中的連續(xù)塊移動(dòng)到單個(gè)存儲(chǔ)區(qū)域
§非連續(xù)I / O有三種形式:
- 在內(nèi)存中不連續(xù)
- 文件中不連續(xù)
- 兩者都不相鄰
Ways to Read/Write to a Shared File
從文件的指定的位置去讀和寫(xiě),并且shared媚狰,每個(gè)進(jìn)程去讀寫(xiě)文件都會(huì)有自己的file pointer岛杀,shared可以是多個(gè)進(jìn)程使用相同的file pointer,
Collective IO
多個(gè)進(jìn)程讀寫(xiě)文件如何優(yōu)化崭孤。內(nèi)存和文件系統(tǒng)的send和receive也需要使用collective去優(yōu)化类嗤。
許多應(yīng)用程序都有計(jì)算和I / O階段§在I / O階段,所有進(jìn)程都讀/寫(xiě)數(shù)據(jù)
- 我們可以說(shuō)他們共同訪問(wèn)存儲(chǔ)
§集體I / O由一組進(jìn)程協(xié)調(diào)訪問(wèn)存儲(chǔ) - 參與I / O的所有進(jìn)程必須調(diào)用集合I / O函數(shù)
- 允許MPI-IO中間件層知道完整的優(yōu)化訪問(wèn)權(quán)限
- §獨(dú)立I / O不是以這種方式組織的
- 訪問(wèn)沒(méi)有明顯的順序或結(jié)構(gòu)
Two-Phase Collective IO
最常用的Collective IO
§將不同進(jìn)程的不連續(xù)數(shù)據(jù)合并為更大的連續(xù)數(shù)據(jù)
§將請(qǐng)求合并為連續(xù)的請(qǐng)求
§共享公共塊
§兩階段
- I / O階段辨宠,三個(gè)進(jìn)程先讀到內(nèi)存里面去
- 通信(交換)階段遗锣,然后在內(nèi)存里面進(jìn)行數(shù)據(jù)交換變?yōu)檫B續(xù)的數(shù)據(jù)
Collective IO with Aggregation
比如有100個(gè)進(jìn)程,只選其中4個(gè)進(jìn)程去跟文件系統(tǒng)讀寫(xiě)嗤形,把數(shù)據(jù)劃分為Aggregation精偿,讀出來(lái)的數(shù)據(jù)再去進(jìn)行交互。這四個(gè)進(jìn)程叫中間節(jié)點(diǎn)。
§聚合是指通過(guò)中間節(jié)點(diǎn)移動(dòng)數(shù)據(jù)的概念
- 執(zhí)行I / O的不同節(jié)點(diǎn)數(shù)
- 也可以應(yīng)用于獨(dú)立的I / O.
Nonblocking I/O
IO也有非阻塞式的
實(shí)現(xiàn)高I / O性能的一般指南
§擁有足夠的I / O硬件
§使用并行/分布式文件系統(tǒng)笔咽,而不是NFS安裝的home目錄
§不要僅從一個(gè)進(jìn)程執(zhí)行I / O.
§盡可能提出大量請(qǐng)求
§對(duì)于非連續(xù)請(qǐng)求搔预,請(qǐng)使用派生數(shù)據(jù)類型和單個(gè)集合I / O調(diào)用
§任何應(yīng)用程序都根據(jù)其I / O需求具有特定的“I / O訪問(wèn)模式”,并選擇正確的API以及向I / O系統(tǒng)表達(dá)I / O訪問(wèn)模式的正確方式