王磊
(安徽理工大學(xué)計(jì)算機(jī)與工程學(xué)院 計(jì)算機(jī)應(yīng)用技術(shù)專業(yè),安徽 淮南 232001)
對(duì)于MPI的定義是多種多樣的,但不外乎下面三個(gè)方面,它們限定了MPI的內(nèi)涵和外延。(1)MPI是一個(gè)庫而不是一門語言。因此對(duì)MPI的使用必須和特定的語言結(jié)合起來進(jìn)行MPI庫可以被多種語言調(diào)用,從語法上說,它遵守所有對(duì)庫函數(shù)/過程的調(diào)用規(guī)則和一般的函數(shù)/過程沒有什么區(qū)別。(2)MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表而不特指某一個(gè)對(duì)它的具體實(shí)現(xiàn)。(3)MPI是一種消息傳遞編程模型并成為這種編程模型的代表和事實(shí)上的標(biāo)準(zhǔn)。MPI雖然很龐大但是它的最終目的是服務(wù)于進(jìn)程間通信這一目標(biāo)的。
MPI(Message Passing Interface)是消息傳遞并行程序設(shè)計(jì)的標(biāo)準(zhǔn)之一,由MPI論壇開發(fā),當(dāng)前通用的是MPI 1.1規(guī)范。正在制定的MPI 2.O規(guī)范除支持消息傳遞外,還支持MPI的L/O規(guī)范和進(jìn)程管理規(guī)范。MPI正成為并行程序設(shè)計(jì)事實(shí)上的工業(yè)標(biāo)準(zhǔn)。
MPI的目標(biāo)總結(jié)概括起來,它包括幾個(gè)在實(shí)際使用中都十分重要但有時(shí)又是相互矛盾的三個(gè)方面:1.較高的通信性能;2.較好的程序可移植性;3.強(qiáng)大的功能。
目前主要MPI的實(shí)現(xiàn)有:(1)MPICH是一種最重要的MPI實(shí)現(xiàn),更為重要的是MPICH是一個(gè)與MPI-1規(guī)范同步發(fā)展的版本每當(dāng)MPI推出新的版本就會(huì)有相應(yīng)的MPICH的實(shí)現(xiàn)版本。目前MPICH的最新版本是MPICH-1.2.1它支持部分的MPI-2的特征。(2)CHIMP是Edinburgh開發(fā)的另一個(gè)免費(fèi)MPI實(shí)現(xiàn)是在EPCC Edinburgh ParallelComputingCentre的支持下進(jìn)行的。(3)LAM(Local Area Multicomputer)也是免費(fèi)的MPI實(shí)現(xiàn),它目前最新的版本是LAM/MPI 6.3.2,它主要用于異構(gòu)的計(jì)算機(jī)網(wǎng)絡(luò)計(jì)算系統(tǒng)。
MPI庫作為可移植的消息傳遞函數(shù)庫,具有以下一些特點(diǎn):(1)MPI提供緩沖區(qū)管理的函數(shù),用戶可以決定由系統(tǒng)對(duì)發(fā)送、接受緩沖區(qū)的管理,還是用戶參與其管理,以便控制系統(tǒng)緩沖區(qū)空間,提高系統(tǒng)的安全性;(2)MPI不但支持語言本身所提供的各種結(jié)構(gòu),而且允許用戶構(gòu)造自己的復(fù)雜結(jié)構(gòu)體和數(shù)據(jù)類型,使得進(jìn)程間的通信更加便捷易用;(3)MPI為任務(wù)間的通信提供多種方式,大量的通信接口能夠滿足科學(xué)與工程的需要;(4)MPI提供可靠的數(shù)據(jù)傳輸機(jī)制,發(fā)送的消息能夠保證被對(duì)方正確接受,用戶不必自行檢查傳輸錯(cuò)誤、傳輸超時(shí)等。也就是說MPI的通信對(duì)用戶而言是透明的;(5)MPI通過通信域保證通信的安全性,不同通信域內(nèi)的并行任務(wù)之間的通信不會(huì)相互干擾和混淆;(6)MPI具有高度的可重構(gòu)性,允許多個(gè)用戶同時(shí)使用并行處理設(shè)備。
打包(Pack)和解包(Upack)操作是為了發(fā)送不連續(xù)的數(shù)據(jù),在發(fā)送前顯示地把數(shù)據(jù)包裝到一個(gè)連續(xù)的緩沖區(qū),在接收之后從連續(xù)的緩沖區(qū)中解包。
MPI_PACK把由inbuf,incount,datatype指定的發(fā)送緩沖區(qū)中的incount個(gè)datatype類型的消息放到起始為outbuf的連續(xù)空間。該空間共有outcount個(gè)字節(jié),輸入緩沖區(qū)可以是MPI_SEND允許的任何通信緩沖區(qū)。入口參數(shù)position的值是輸出緩沖區(qū)中用于打包的起始地址。打包后它的值根據(jù)打包消息的大小來增加。出口參數(shù)position的值是被打包的消息占用的輸出緩沖區(qū)后面的第一個(gè)地址,通過連續(xù)幾次對(duì)不同位置的消息調(diào)用打包操作就將不連續(xù)的消息放到了一個(gè)連續(xù)的空間。comm參數(shù)是將在后面用于發(fā)送打包的消息時(shí)用的通信域。
MPI_UNPACK和MPI_PACK對(duì)應(yīng)它,從inbuf和insize指定的緩沖區(qū)空間將不連續(xù)的消息解開放到outbuf,outcount,datatype指定的緩沖區(qū)中,輸出緩沖區(qū)可以是MPI_RECV允許的任何通信緩沖區(qū)。輸入緩沖區(qū)是一個(gè)連續(xù)的存儲(chǔ)空間,大小為insize字節(jié),開始地址為inbuf。入口參數(shù)position的初始值是輸出緩沖區(qū)中被打包消息占用的起始地址,解包后它的值根據(jù)打包消息的大小來增加,因此出口參數(shù)position的值是輸出緩沖區(qū)中被解包的消息占用空間后面的第一個(gè)地址。通過連續(xù)幾次對(duì)已打包的消息調(diào)用與打包時(shí)相應(yīng)的解包操作,就可以將連續(xù)的消息解開放到一個(gè)不連續(xù)的空間。comm參數(shù)是用于接收消息的通信域。
一個(gè)打包單元可以用MPI_PACKED作為類型發(fā)送。發(fā)送類型可以是任何點(diǎn)到點(diǎn)通信或者組通信調(diào)用。用MPI_PACKED發(fā)送的數(shù)據(jù)可以用任意數(shù)據(jù)類型來接收,只要它和實(shí)際接收到的消息的數(shù)據(jù)類型相匹配。以任何類型發(fā)送的消息 (包括MPI_PACKED類型)都可以用MPI_PACKED類型接收。這樣的消息于是就可以被調(diào)用MPI_UNPACK來解包。
接收到的打包消息可以被解包成幾個(gè)不連續(xù)的消息,這是通過幾個(gè)連續(xù)的對(duì)MPI_UNPACK調(diào)用來實(shí)現(xiàn)的,第一個(gè)調(diào)用提供position=0,對(duì)于后續(xù)的調(diào)用,是以前一個(gè)調(diào)用輸出的position的值作為輸入,而使用和前一個(gè)調(diào)用相同的inbuf insize和comm值。
為了看清它的用法,我們把求定積分Get_data函數(shù)用這種方法實(shí)現(xiàn):
當(dāng)需要把一些不同類型的數(shù)據(jù)發(fā)送一次或者少數(shù)幾次時(shí),用MPI_Pack/MPI_Unpack打包發(fā)送通信開銷最小。
結(jié)語。MPI的一個(gè)最重要的特點(diǎn)就是免費(fèi)和源代碼開放。MPI可以被迅速接受,和它為自己定下的:高效率、方便移植和功能強(qiáng)大三個(gè)主要目標(biāo)密不可分。由于MPI并行程序是在原來串行程序基礎(chǔ)上的擴(kuò)展,在許多地方和串行程序是相同的。串行程序設(shè)計(jì)的許多經(jīng)驗(yàn)是可以應(yīng)用到并行程序設(shè)計(jì)中的,但是同時(shí)我們必須注意在設(shè)計(jì)MPI程序的時(shí)候頭腦中必須有程序并行執(zhí)行的概念而不是原來有序的串行執(zhí)行這才是串行和并行最主要的區(qū)別。當(dāng)然要想設(shè)計(jì)出高級(jí)的MPI并行程序,除了要掌握更多的MPI庫函數(shù)及MPI不同的并行程序模式外,適應(yīng)的并行算法的研究也是應(yīng)必須掌握的技術(shù)。
[1]都志輝.高性能計(jì)算之并行編程技術(shù)——MPI并行程序設(shè)計(jì).清華大學(xué)出版社,2001年
[2]許麗華,劉淼.MPI并行程序環(huán)境的研究[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2003年4期
[3]蔣英,雷永梅.MPI中的3種數(shù)據(jù)打包發(fā)送方式及其性能分析[J].計(jì)算機(jī)工程,2002年8月
[4]張樂君.基于網(wǎng)格的MPI并行程序運(yùn)行框架的設(shè)計(jì)與實(shí)現(xiàn)[J],2008年
[5]張建文,徐瓊,王強(qiáng).基于MPI環(huán)境的并行程序設(shè)計(jì)[J],2007年3月