方 鈴,雷詠梅
(上海大學 計算機工程與科學學院,上海 200072)
一種高效MPI設備層擴展庫的設計與實現
方 鈴,雷詠梅
(上海大學 計算機工程與科學學院,上海 200072)
PCI Express作為新一代的總線接口,能支持各個設備之間并發的數據傳輸。每個設備在要求傳輸數據時各自建立專用的傳輸通道,這樣的操作使得數據能夠高效傳輸,因此PCI Express互聯結構已被廣泛地應用到高性能領域。用PCI Express總線代替以太網,不僅能實現不同設備之間高速的數據傳輸,而且能夠縮減結構規模,并很好地應用于工業等領域。但基于這種互聯結構來實現并行程序運行,需要設計和實現相應的MPI設備層擴展庫,以實現不同板卡系統的進程間通信。結合PCI Express互聯結構特點,基于MPICH的PMI KVS空間的功能,提出控制和數據雙通道的通信模式。控制信息依靠可靠傳輸協議TCP進行傳輸,數據信息通過高速的PCI Express總線進行傳輸,以實現異構系統之間高效的數據傳輸,并通過模擬實驗證明了設備層擴展庫的可行性。
高性能;PCI Express互聯結構;MPI設備層擴展庫;雙通道
近年來,隨著高效能技術的發展,各種高性能總線互聯技術層出不窮,包括嵌入式領域的RapidIO技術[1]、針對PC機的PCI Express技術[2]以及面向服務機群的InfiniBand技術[3]。其中,PCI Express作為新一代的總線接口,能夠通過交換器實現多臺設備之間通信的串行、點對點類型的互聯,而PCI Express的高速數據傳輸使其廣泛地應用于高性能計算等領域[4-6]。
同時還有基于FPGA的PCI Express接口的設計[7-8]。目前已提出的PCI Express總線互聯結構中,通過母板PCI Express的插槽連接不同的帶有FPGA和ARM混合異構的嵌入式子板,這些子板上運行MPI[9]應用進程,而不同子板的應用進程之間通過PCI Express把數據傳輸給PC host,然后再由PC host把數據傳輸給目的板卡上的應用進程。用PCI Express代替以太網來傳輸數據,能很好地解決網絡帶寬限制的問題,而且該結構規模較小,能很好應用在工業等領域。然而基于這種互聯結構實現并行程序運行,需要設計和實現相應的MPI設備層擴展庫,實現不同板卡系統的進程間通信,軟件架構如圖1所示。

圖1 系統軟件架構
通過對MPI各個層次結構的分析,文中提出一種構建MPI設備層擴展庫的實現方法。利用MPICH3的PMI KVS空間的功能[10],每個進程通過PMI put操作保存本地節點端口等信息到本地KVS中,同時同步到遠程服務端KVS,而其他節點通過PMI get操作獲取各節點所在端口等信息,從而建立通信關系。同時結合PCI Express互聯結構的特點,提出控制和數據雙通道的通信模式。一方面通過以太網傳輸必需的控制信息,另一方面使用高速的PCI Express傳輸數據信息,以實現這種嵌入式混合異構系統運算節點之間高效的數據傳輸。
MPICH[11]作為MPI實現之一,也是目前主流的并行函數庫,主要包括兩個工作:實現進程管理;實現MPI庫接口。第一部分主要通過Hydra[12]的作業加載程序在每個節點創建一個進程管理代理PMP,并通過PMP在本地節點創建和管理應用進程。第二部分是通過分層、模塊化等方法實現,層次結構圖如圖2所示。

MPI應用程序接口MPIR動態運行庫ADI抽象設備接口CH3通道接口Nemesis層接口特定通信設備接口
圖2 MPICH3層次結構圖
從分層結構中可看出,要實現設備層擴展庫,需有MPI最后一層——特定通信設備接口層的相關實現。
2.1 數據結構
MPICH3工程設計中體現出了面向對象思想。MPICH3中有許多重要的數據結構,比如:ADI層的進程(MPID_PerProcess)、虛連接(MPIDI_VC)結構和收發請求(MPID_Request)結構等。
設備層有兩個重要的結構體:
(1)struct MPID_nem_netmod_funcs,該結構中定義了需要實現的初始化、發送、接收等回調函數,在CH3層初始化時,需要將實現好的MPID_nem_netmod_funcs_t指針傳遞到上層。而對于設備層已有實現的網絡設備,用戶要通過填寫Makefile參數去選擇需要的設備層。
(2)struct MPIDI_Comm_ops,包含主要的通信函數,ADI層對函數指針進行判斷,而且程序優先調用struct MPIDI_Comm_ops內函數,主要函數有發送函數send、接收函數recv_posted、標準通信模式isend、同步通信模式irsend等。
由于雙通道設計實現需要有初始化的過程,所以文中選擇只實現帶有初始化函數的結構體MPID_nem_netmod_funcs中的函數。
2.2 虛連接與請求管理
虛連接是MPICH3 ADI層的一個重要結構體,MPI的每一個應用進程都會維護一張自己的虛連接表,在ADI層初始化的時候,會為虛連接表分配空間,也就是初始化虛連接的每一個表項,主要是根據進程所在節點,為各個進程之間建立通信方式,并且虛連接表是以數組方式進行存儲的。例如,現在0號進程中要初始化VC數組的第二個下標對應的VC,也就是VC[1],這個VC[1]就是0號進程和1號進程間的虛連接。
虛連接內部包含了一個重要的結構體struct MPIDI_CH3I_VC,該結構體包含兩個重要的函數,同時還包括虛連接自身的一個函數,分別是iStartContigMsg、iSendContig、sendNoncontig_fn。它們都和發送相關。當應用程序調用MPI_Send時,MPICH根據rank號取到對應的VC,按照參數選擇調用以上三個VC中的函數。這三個函數需要在設備層擴展庫進行具體實現,當虛連接初始化時根據進程是節點間還是節點內選擇是否對VC的函數指針進行賦值。
由于MPI存在非阻塞通信,而且在實際數據發送過程中可能出現信道阻塞,所以需要有緩存。MPICH3設備層緩存和CH3層對接收請求的組織方式相同,都是以請求隊列[13]的形式存在的。當出現阻塞時,將消息封裝成請求并入隊,等待出隊發送,所以設備層需要在虛連接內維護一個請求隊列。對一個進程來說,對應所有其他進程都有一個虛連接就有一個請求隊列,設備層擴展庫的發送接口實現時需要利用請求隊列作為緩存。
設備層擴展庫主要包括虛連接初始化和通過MPICH PMI KVS方法實現對控制數據傳輸雙通道的支持以及系統功能設計。
3.1 虛連接初始化和自定義結構體
虛連接初始化接口,主要包括兩個步驟:第一是在作業初始化階段為進程初始化與其他進程之間調用過程;第二是初始化設備層相關數據結構并保存到虛連接內。結構體MPIDI_CH3I_VC中有一個很重要的成員,該成員變量描述如下:
union
{
char padding[MPID_NEM_VC_NETMOD_AREA_LEN];
void*align_helper;
}netmod_area;
netmod_area中的char padding[]用來保存設備層重要的數據結構到虛連接,文中需要保存的自定義結構體如下:
typedef struct{
fileopt_t*fo; //設備文件描述符
reqq_t send_queue; //發送隊列
}MPID_nem_file_vc_area;
typedef struct{
int fd; //每一個進程獲得的文件描述符
MPIDI_VC_t*vc; //本進程和目的進程的虛連接
int endpoint; //端口號
}fileopt_t;
通過這兩個結構體可以保存需要操作的設備文件描述符和發送隊列以及端口號等。
VC初始化的具體流程如下:
(1)初始化iStartContigMsg、iSendContig、sendNoncontig_fn三個函數指針。
(2)初始化發送隊列send_queue。
(3)將文件描述符保存到對應的虛連接結構體。
(4)得到各個目的進程的business card,通過查詢server端得到端口號保存在相應的虛連接結構體中。
3.2 控制和數據傳輸雙通道模式
由于總線互聯結構支撐軟件提供的操作設備方法無法像傳統TCP一樣,以IP地址作為主機標識進行數據傳輸,而它一般以端口作為主機標識,如PCI Express,而在進程管理部分通過SSH等進行遠程控制訪問。另一方面,數據傳輸是通過PCI Express總線,所以整體數據的流通是以控制和數據相分離的,控制信息主要是進程管理相關的信息通過TCP進行傳輸,而數據信息主要是發送、接收等通過PCI Express總線傳輸。
但是發送數據時,發送進程需要知道接收進程所在運行板卡的端口,才能將數據準確地發送給接收進程。文中采用將端口號等信息和設定的key,如字符串“endpoint”,通過PMI_KVS_Put方法寫入本地KVS中,再從整個樹形結構中層層提交到遠程的Launch node端KVS中,其他進程按照這個key值在對應的進程KVS中去查找需要的端口號等信息。因為每一塊板卡有一個唯一的IP地址,也對應一個唯一的端口,本地初始化時可以通過kernel提供的方法獲得端口號,然后通過上面的方法進行保存,在每個進程虛連接初始化時通過PMI_KVS_Get方法查詢每個進程rank值對應的端口號等信息,并保存到虛連接中,流程如圖3所示。

圖3 控制與數據雙通道結構圖
3.3 系統功能實現
系統功能實現主要包括發送和接收功能。在上一節介紹的數據結構中已說明要實現struct MPID_nem_netmod_funcs中發送相關的函數,其中三個函數的不同點在于調用iStartContigMsg時,上層沒有創建request對象,而調用iSendContig和sendNoncontig_fn時已經創建好request對象。因為MPICH3考慮到request對象管理頻繁,造成資源的浪費,同時由于大量非阻塞通信的使用,需要對request對象進行出隊入隊耗時的操作,就區分了兩種發送數據的方式。iStartContigMsg、iSendContig都是發送連續數據,sendNoncontig_fn是發送非連續數據。和接收相關的需要在設備層擴展庫實現的是MPID_nem_poll函數。
當進程數據傳輸時發送進程得到目的進程的所在節點端口號,先將端口以及要發送的數據大小等信息發送給PC host,然后將需要發送的數據發給PC host,最后由PC host轉發給相應端口的節點,所以這種互聯結構的數據發送是通過PC host去中轉,并非點對點的數據傳輸。文中針對這種結構定義了相應的數據包格式以及數據的發送和接收方式。
3.3.1 數據包格式
發送方要向PC端發送的消息有兩種:一種是需要預先向PC發送接收方的端口號、進程號等控制信息;另一種是向接收方發送的用戶數據。所以通過消息頭的ID字段將兩種消息進行區分,同時定義兩種數據包的格式,如圖4所示。

圖4 數據包格式
ID字段:ID字段只有一位,當ID為0時,表示控制信息數據包,當ID為1時表示用戶數據包。
序列號:根據進程號為每個進程分配連續的且不同的序列號,保證同時一個端口不同進程向PC端發送數據時,可以以不同的序列號進行區分。
分片號:當數據以分片發送,分片號從1開始,以分片號標識每片數據,當數據不以分片發送,分片號字段為0。
3.3.2 數據的發送與接收
當發送方向接收方發送數據時,先為本次通信過程分配唯一的序列號,再填充源端口號和目的端口號,源進程號和目的進程號以及數據長度信息,將控制信息數據包發送給PC端;PC端接收到控制信息數據包,得到目的端號和序列號等信息,并等待發送方發送數據;發送方將數據發送給PC端;當PC端接收到所有數據時,將數據發送到目的端號。
由于一塊板卡上運行多個應用進程,而每一個進程會從同一個端口讀取數據,從而使得數據讀取混亂,所以文中采用為板卡上每一個進程預設內存緩沖池的方式存放PC端發送來的數據。當設備層擴展庫讀取數據時,按進程號讀取對應緩沖池上的數據,再拷貝到用戶數據區。發送與接收數據過程如圖5所示。
實驗對MPI設備層擴展庫的通信模式進行驗證。

圖5 發送與接收數據過程
實驗環境:處理器為Intel(R) Core(TM) i3-2130 CPU@3.4 GHz;內存為4GB;操作系統為Ubuntu 14.04.1。對用梯形積分法求面積的應用進行測試,應用實例并行計算過程的通信關系如圖6所示。

圖6 進程通信關系和調用過程
采用普通文件的方式進行模擬實驗,測試功能包括MPI應用程序接口中初始化、發送、接收功能的正確調用,以驗證MPI設備層擴展庫支持多進程并行程序的正確運行。
梯形積分法求面積思想是將整個面積區域劃分成多個近似矩形區域,然后求解所有矩形面積之和。實驗中計算y=x2與x=0,x=3圍成的區域面積。算法中預先將整個區域分成1 024小塊,再將這些小塊按照進程數均等劃分。
選取8、64、128個進程分別進行測試,運行結果如下:
root@node1:/home/fangling/github# /usr/fl1/mpi/bin/mpirun-np8 ./compute
usetime:0.000 653,processsize:8,ourestimation=
9.000 004 291 534 424e+00
root@node1:/home/fangling/github# /usr/fl1/mpi/bin/mpirun-np64 ./compute
usetime:0.043 264,processsize:64,ourestimation=
9.000 004 291 534 424e+00
root@node1:/home/fangling/github# /usr/fl1/mpi/bin/mpirun-np128 ./compute
usetime:0.057 931,processsize:128,ourestimation=
9.000 004 291 534 424e+00
程序中以0號進程作為master進程,其他進程作為slave進程,每一個slave進程計算自己的矩形面積,然后把結果發給master進程。分別以3組進程數啟動MPI并行程序,過程中控制命令和數據傳輸運行正確,并行程序運行結果證明數據傳輸正確,程序結果運行正確。
上述實驗驗證了文中所設計的數據通信模式、數據包格式及數據的發送和接收方式準確可行,所構建的MPI通信庫,可以有效實現基于PCIExpress的嵌入式混合異構系統之間的數據傳輸。
文中利用PCIExpress結構的特點和MPICH的PMIKVS空間,提出數據和控制雙通道的通信模式,并通過模擬實驗驗證了設備層擴展庫接口的正確使用。下一步將開發和移植典型應用,并且進行完善的性能測試以及性能優化。
[1]RapidIOTradeAssociation.RapidIOtechnologyoverviewandapplication[EB/OL].2008.http://www.rapidio.org/.
[2]RaviBudrukR,AndersonD,ShanT.PCIExpress系統體系結構標準教材[M].北京:電子工業出版社,2005.
[3]InfiniBandTradeAssociation.AnInfiniBandtechnologyoverview[EB/OL].2008.http://www.infinibandta.org/.
[4] 張偉達,黃芝平,唐貴林.基于PCIExpress的高速數據傳輸系統研究與開發[J].計算機測量與控制,2009,17(12):2555-2557.
[5] 馬 萍,唐衛華,李緒志.基于PCIExpress總線高速數采卡的設計與實現[J].微計算機信息,2008,24(25):116-118.
[6] 王 偉,傅其祥.基于PCIe總線的超高速信號采集卡的設計[J].電子設計工程,2010,18(5):43-45.
[7] 李木國,黃 影,劉于之.基于FPGA的PCIe總線接口的DMA傳輸設計[J].計算機測量與控制,2013,21(1):233-235.
[8]KavianipourH,MuschterS,BohmC.HighperformanceFPGA-basedDMAinterfaceforPCIe[J].IEEETransactionsonNuclearScience,2012,61(2):1-3.
[9]MessagePassingInterfaceForum.MPI:amessage-passinginterfacestandardversion3.1[EB/OL].2015.http://www.mpi-forum.org/docs.
[10]GrahmL,ShipmanM,BarrenW,etal.OpenMPI:ahigh-performanceheterogeneousMPI[C]//Proceedingsof2006IEEEinternationalconferenceonclustercomputing.Piscataway,NJ:IEEE,2006:1-9.
[11]GroppW,LuskE,DossN,etal.MPICH:ahigh-performance,portableimplementationfortheMPImessage-passinginterface[J].ParallelComputing,1998,22(6):789-828.
[12]ArgonneNationalLaboratory.Hydraprocessmanagementframework[EB/OL].2009.http://wiki.mpich.org/mpich/in-dex.php/Hydra_Process_Management_Framework.
[13]KellerR,GrahamRL.CharacteristicsoftheunexpectedmessagequeueofMPIapplications[C]//Recentadvancesinthemessagepassinginterface-EuropeanMpiusersgroupmeeting.Stuttgart,Germany:[s.n.],2010:179-188.
Design and Implementation of an Efficient MPI Device Layer Extension Libraries
FANG Ling,LEI Yong-mei
(School of Computer Engineering and Science,Shanghai University,Shanghai 200072,China)
As a new generation of bus interface,PCI Express can support the concurrent data transmission between all kinds of devices,and each of these devices can establish their own transmission channel what is proprietary when it requires transmitting data,which makes the transmission of data more efficient.So PCI Express interconnect structure has also been applied to high performance areas.When Ethernet replaced by PCI Express,high speed transfer between different devices can be achieved,and the scale of the structure is effectively reduced,which can be well applied to the industry and other fields.But in order to run parallel programs based on this interconnect structure,it is necessary to design and implement the corresponding MPI device layer extension libraries,achieving that the process communication of different boards.The communication mode of control and data dual channel is presented taking advantage of the features of PCI Express interconnect structure and based on the function of MPICH PMI KVS space.Control information depends on reliable TCP to transmit and data information transmits via a high-speed PCI Express bus,so that efficient data transmission between heterogeneous systems can be implemented.The feasibility of device layer extension libraries is proved through the simulation experiment.
high performance;PCI Express interconnect structure;MPI device layer extension libraries;dual channel
2016-04-13
2016-08-02
時間:2017-01-10
國家“863”高技術發展計劃項目(2009AA012201);上海市科研計劃重大項目(08dz501600)
方 鈴(1989-),男,碩士研究生,研究方向為高性能計算;雷詠梅,博士,教授,研究方向為高性能計算。
http://www.cnki.net/kcms/detail/61.1450.TP.20170110.1028.072.html
TP302.1
A
1673-629X(2017)02-0006-05
10.3969/j.issn.1673-629X.2017.02.002