摘? 要: GM是Myrinet專用的系統(tǒng)軟件,,由于采用了用戶層通信,、在LANai上運行MCP等機制,,故具有占用系統(tǒng)開銷小,、延遲短,、帶寬大等優(yōu)點,,在國外已廣泛應用于并行計算領域,。
關鍵詞: Myrinet? GM? 用戶層通信? LANai
?
1 GM簡述
GM是美國MyriCom公司為其高性能網(wǎng)絡產(chǎn)品Myrinet而推出的系統(tǒng)軟件,,專門用于網(wǎng)絡并行計算,,在國外已廣泛應用于大規(guī)模并行計算領域。
GM的設計思想就是要實現(xiàn)一種高帶寬低延遲,,主機開銷極少的通信方式,。GM的高效率,除了采用用戶層通信機制等以外,,關鍵在于充分配合Myrinet在硬件架構上的特性,。GM在Myrinet網(wǎng)卡的LANai芯片上運行MCP,承擔了大部分的通信處理工作,,大大減輕了主機的通信開銷,。總的來說,,GM具有如下特性:
·支持超過1000個節(jié)點;
·可在不可靠網(wǎng)絡環(huán)境中提供可靠,、有序的數(shù)據(jù)傳輸服務;
·低開銷,每個數(shù)據(jù)包只耗費主機大約1μs的處理時間;
·通過提供高低兩個優(yōu)先級,,可實現(xiàn)高效的防死鎖算法;
· 對多個用戶層程序直接訪問網(wǎng)絡接口提供存儲保護;
· 理論上支持的消息長度可達231-1字節(jié),,實際則受限于主機DMA內(nèi)存大小;
· 自動對Myrinet進行映射,解決路由問題。
GM的不足之處在于編程模式不靈活和不支持多線程,。
2 GM的結(jié)構
GM由MCP,,DRIVER,LIBGM三部分構成,。這三部分之間的關系可以用圖1來描述,。
LIBGM為用戶程序提供編程接口,其中最重要的是發(fā)送和接收函數(shù),。此外,,還提供一整套通用函數(shù),,如初始化,、DMA內(nèi)存管理、令牌管理,、哈希管理,、CRC校驗等。
LIBGM 所實現(xiàn)的功能可分成三類:第一類是通用函數(shù),,如哈希管理;第二類是通過DRIVER實現(xiàn)的功能,,如內(nèi)存映射功能;第三類是和MCP協(xié)同完成的功能,如發(fā)送和接收操作,。其中第三類是完成數(shù)據(jù)通信功能的核心,。為提高整個系統(tǒng)的性能,LIBGM和MCP之間的交互都繞開了操作系統(tǒng),,避免了包括在用戶態(tài)和核心態(tài)之間的切換,,從用戶空間到核心空間數(shù)據(jù)拷貝等在內(nèi)的各種開銷。因此,,從發(fā)送和接收操作的路徑上看,,GM采用的是用戶層通信。
DRIVER是GM中的一個重要部分,。其最主要的功能是完成MCP的初始化,,其次是提供一些輔助性的功能。以Linux + x86平臺為例,,DRIVER以Module的形式實現(xiàn),,當被加載到內(nèi)核的時候,DRIVER同時完成一系列初始化工作,,包括:查找并自動配置PCI網(wǎng)卡設備,,把MCP從主機加載到LANai的EPROM上,并且對LANai進行初始化,,對LANai發(fā)出reset指令,,驅(qū)動MCP運行。LIBGM通過調(diào)用DRIVER的ioctl功能來完成各種輔助功能。
MCP 是GM最關鍵的部分,,GM的其他功能都是在MCP的基礎上構架起來的,。MCP運行在Myrinet的網(wǎng)卡的LANai芯片上,它由DRIVER加載到LANai上,。MCP借助LANai上的CPU和SRAM承擔了大部分的通信處理工作,,包括:在主機內(nèi)存和LANai SRAM之間的數(shù)據(jù)DMA傳送、數(shù)據(jù)包的拆分和組裝,、CRC校驗,、通信的應答管理、端口和令牌資源的分配,、調(diào)度管理等,。因此,主機方面的通信開銷幾乎為零,。
網(wǎng)卡上的SRAM主要用作發(fā)送和接收數(shù)據(jù)的緩沖,。MCP采取端口(port)、優(yōu)先級(Priority)和發(fā)送/接收令牌(Token)等手段來實現(xiàn)資源的控制,、分配和利用,。對用戶程序而言,網(wǎng)卡上只有固定數(shù)目的端口,,每個端口有高低兩個優(yōu)先級,,而每個端口有固定數(shù)目的發(fā)送和接收令牌。在發(fā)送或接收前,,必須首先要打開端口,,并申請發(fā)送或接收令牌,然后才能以某個優(yōu)先級發(fā)送或者接收數(shù)據(jù),。與此機制相適應,,采用了MCP的如圖2所示的數(shù)據(jù)結(jié)構方式。
?
如圖2,,MCP的數(shù)據(jù)是以多級鏈表的方式組織的,。第一級是表示各個主機之間的互連關系的雙向鏈表;在該雙向鏈表的每個節(jié)點處掛上一條表示通過該連接進行傳輸?shù)牡诙壸佣丝陔p向鏈表SP;而在子端口雙向鏈表的每個節(jié)點處,還掛接一條要通過該子端口進行數(shù)據(jù)發(fā)送的第三級發(fā)送令牌ST鏈表,。用戶程序發(fā)送數(shù)據(jù)時,,只需要在這個多級鏈表結(jié)構中掛上發(fā)送令牌,因此開銷很小,,大概只需要1μs的處理時間,。
3 GM的工作原理和編程模型
下面介紹GM的數(shù)據(jù)發(fā)送和接收的工作過程。實際程序中,,通信前需要進行一系列預備工作:
· 選定一個通信端口,,調(diào)用gm_open()打開該端口,。gm_open()進行初始化工作,主要是打開設備文件(在Linux下一個GM端口對應一個設備文件),,將LANai上的EPPROM和SRAM映射到主機的內(nèi)存中去,,以便用戶程序的訪問。
· 申請DMA存儲區(qū),。GM使用LANai上的DMA引擎來實現(xiàn)主機內(nèi)存與LANai SRAM之間的數(shù)據(jù)傳輸,,所以主機方面的數(shù)據(jù)必須存放在DMA存儲區(qū)中。
· 申請發(fā)送令牌,。令牌是LANai的資源管理手段,,每個端口都只有有限數(shù)量的發(fā)送令牌和接收令牌。獲得令牌是使用LANai資源的保證,,因此發(fā)送操作完成后,,須馬上釋放令牌以保證后面的發(fā)送操作可以獲得必要的LANai資源。
現(xiàn)在假設上述預備工作已經(jīng)完成,,一臺主機調(diào)用gm_send()發(fā)送數(shù)據(jù),。gm_send()僅僅根據(jù)發(fā)送參數(shù)填寫Send Token數(shù)據(jù)結(jié)構,并將其掛接到MCP的多級鏈表上,。
MCP以輪詢的方式不斷檢測多級鏈表,當發(fā)現(xiàn)有發(fā)送請求,,就啟動發(fā)送事件處理句柄來完成實際的發(fā)送操作,。這個過程包括數(shù)據(jù)從主機到LANai SRAM的數(shù)據(jù)DMA傳送、數(shù)據(jù)拆分,、組包,、CRC校驗、發(fā)送到網(wǎng)絡上,。當一個發(fā)送請求被處理后,,就會被轉(zhuǎn)到另外的一個鏈表中,該鏈表維護所有已經(jīng)處理但是尚未收到對方應答的發(fā)送請求,。只有收到了對方的應答后,,數(shù)據(jù)發(fā)送才算真正完成。
在接收方,,當網(wǎng)卡采集到數(shù)據(jù)以后,,會啟動處理句柄對其處理,包括數(shù)據(jù)校驗,、重組,、數(shù)據(jù)應答等,然后存放在SRAM緩存中等待以DMA的方式傳送到主機內(nèi)存中,。這需要主機方面預先準備DMA內(nèi)存和接收令牌,,如果主機長時間不提供接收資源,,那么這些數(shù)據(jù)將被丟棄。
4 GM的編程模型和API
GM用戶程序一般都是用輪詢的方式執(zhí)行的,。程序在進行了打開端口,、申請內(nèi)存等預備工作以后,就進入一個循環(huán),,在這個循環(huán)里,,通過不斷地調(diào)用gm_receive()來獲取當前發(fā)生的事件,比如發(fā)送完成,、有數(shù)據(jù)到達,、系統(tǒng)出錯等來決定相應的動作。下面是GM用戶程序的通用模式:
?
事實上這種編程模式不太靈活,,這也是GM的高性能運作模式所決定的,。
LIBGM為GM用戶程序提供了一整套的API接口。這套API提供了以下的功能:
· 系統(tǒng)初始化和釋構;
· 數(shù)據(jù)發(fā)送,,接收;
· DMA內(nèi)存的申請,,釋放,映射;
· Token管理;
· 哈希存儲管理;
· 獲取和定制系統(tǒng)參數(shù),,比如獲取節(jié)點ID,,設定可接收數(shù)據(jù)包的最少長度。
?
參考文獻
1 GM-1.1.3 source code,,http://www.myri.com/
2 Nanette J.Boden,,et al,. Myrinet: a gigabit-per-second?local area network.[J]1999,,29~36.