王磊
(安徽理工大學計算機與工程學院 計算機應用技術專業,安徽 淮南 232001)
對于MPI的定義是多種多樣的,但不外乎下面三個方面,它們限定了MPI的內涵和外延。(1)MPI是一個庫而不是一門語言。因此對MPI的使用必須和特定的語言結合起來進行MPI庫可以被多種語言調用,從語法上說,它遵守所有對庫函數/過程的調用規則和一般的函數/過程沒有什么區別。(2)MPI是一種標準或規范的代表而不特指某一個對它的具體實現。(3)MPI是一種消息傳遞編程模型并成為這種編程模型的代表和事實上的標準。MPI雖然很龐大但是它的最終目的是服務于進程間通信這一目標的。
MPI(Message Passing Interface)是消息傳遞并行程序設計的標準之一,由MPI論壇開發,當前通用的是MPI 1.1規范。正在制定的MPI 2.O規范除支持消息傳遞外,還支持MPI的L/O規范和進程管理規范。MPI正成為并行程序設計事實上的工業標準。
MPI的目標總結概括起來,它包括幾個在實際使用中都十分重要但有時又是相互矛盾的三個方面:1.較高的通信性能;2.較好的程序可移植性;3.強大的功能。
目前主要MPI的實現有:(1)MPICH是一種最重要的MPI實現,更為重要的是MPICH是一個與MPI-1規范同步發展的版本每當MPI推出新的版本就會有相應的MPICH的實現版本。目前MPICH的最新版本是MPICH-1.2.1它支持部分的MPI-2的特征。(2)CHIMP是Edinburgh開發的另一個免費MPI實現是在EPCC Edinburgh ParallelComputingCentre的支持下進行的。(3)LAM(Local Area Multicomputer)也是免費的MPI實現,它目前最新的版本是LAM/MPI 6.3.2,它主要用于異構的計算機網絡計算系統。
MPI庫作為可移植的消息傳遞函數庫,具有以下一些特點:(1)MPI提供緩沖區管理的函數,用戶可以決定由系統對發送、接受緩沖區的管理,還是用戶參與其管理,以便控制系統緩沖區空間,提高系統的安全性;(2)MPI不但支持語言本身所提供的各種結構,而且允許用戶構造自己的復雜結構體和數據類型,使得進程間的通信更加便捷易用;(3)MPI為任務間的通信提供多種方式,大量的通信接口能夠滿足科學與工程的需要;(4)MPI提供可靠的數據傳輸機制,發送的消息能夠保證被對方正確接受,用戶不必自行檢查傳輸錯誤、傳輸超時等。也就是說MPI的通信對用戶而言是透明的;(5)MPI通過通信域保證通信的安全性,不同通信域內的并行任務之間的通信不會相互干擾和混淆;(6)MPI具有高度的可重構性,允許多個用戶同時使用并行處理設備。
打包(Pack)和解包(Upack)操作是為了發送不連續的數據,在發送前顯示地把數據包裝到一個連續的緩沖區,在接收之后從連續的緩沖區中解包。
MPI_PACK把由inbuf,incount,datatype指定的發送緩沖區中的incount個datatype類型的消息放到起始為outbuf的連續空間。該空間共有outcount個字節,輸入緩沖區可以是MPI_SEND允許的任何通信緩沖區。入口參數position的值是輸出緩沖區中用于打包的起始地址。打包后它的值根據打包消息的大小來增加。出口參數position的值是被打包的消息占用的輸出緩沖區后面的第一個地址,通過連續幾次對不同位置的消息調用打包操作就將不連續的消息放到了一個連續的空間。comm參數是將在后面用于發送打包的消息時用的通信域。
MPI_UNPACK和MPI_PACK對應它,從inbuf和insize指定的緩沖區空間將不連續的消息解開放到outbuf,outcount,datatype指定的緩沖區中,輸出緩沖區可以是MPI_RECV允許的任何通信緩沖區。輸入緩沖區是一個連續的存儲空間,大小為insize字節,開始地址為inbuf。入口參數position的初始值是輸出緩沖區中被打包消息占用的起始地址,解包后它的值根據打包消息的大小來增加,因此出口參數position的值是輸出緩沖區中被解包的消息占用空間后面的第一個地址。通過連續幾次對已打包的消息調用與打包時相應的解包操作,就可以將連續的消息解開放到一個不連續的空間。comm參數是用于接收消息的通信域。
一個打包單元可以用MPI_PACKED作為類型發送。發送類型可以是任何點到點通信或者組通信調用。用MPI_PACKED發送的數據可以用任意數據類型來接收,只要它和實際接收到的消息的數據類型相匹配。以任何類型發送的消息 (包括MPI_PACKED類型)都可以用MPI_PACKED類型接收。這樣的消息于是就可以被調用MPI_UNPACK來解包。
接收到的打包消息可以被解包成幾個不連續的消息,這是通過幾個連續的對MPI_UNPACK調用來實現的,第一個調用提供position=0,對于后續的調用,是以前一個調用輸出的position的值作為輸入,而使用和前一個調用相同的inbuf insize和comm值。
為了看清它的用法,我們把求定積分Get_data函數用這種方法實現:


當需要把一些不同類型的數據發送一次或者少數幾次時,用MPI_Pack/MPI_Unpack打包發送通信開銷最小。
結語。MPI的一個最重要的特點就是免費和源代碼開放。MPI可以被迅速接受,和它為自己定下的:高效率、方便移植和功能強大三個主要目標密不可分。由于MPI并行程序是在原來串行程序基礎上的擴展,在許多地方和串行程序是相同的。串行程序設計的許多經驗是可以應用到并行程序設計中的,但是同時我們必須注意在設計MPI程序的時候頭腦中必須有程序并行執行的概念而不是原來有序的串行執行這才是串行和并行最主要的區別。當然要想設計出高級的MPI并行程序,除了要掌握更多的MPI庫函數及MPI不同的并行程序模式外,適應的并行算法的研究也是應必須掌握的技術。
[1]都志輝.高性能計算之并行編程技術——MPI并行程序設計.清華大學出版社,2001年
[2]許麗華,劉淼.MPI并行程序環境的研究[J].現代計算機(專業版),2003年4期
[3]蔣英,雷永梅.MPI中的3種數據打包發送方式及其性能分析[J].計算機工程,2002年8月
[4]張樂君.基于網格的MPI并行程序運行框架的設計與實現[J],2008年
[5]張建文,徐瓊,王強.基于MPI環境的并行程序設計[J],2007年3月