常俊勝,熊澤宇,徐金波
(國防科技大學 計算機學院, 湖南 長沙 410073)
計算機技術的快速發展,越發突顯高性能計算在各學科領域研究中的重要性,高性能計算機技術是計算機技術乃至整個信息技術發展的制高點。目前,高性能計算在情報處理、原子核建模、天氣預報、天體物理、遙感圖像處理和生物系統等科學和工程計算中都發揮著舉足輕重的作用。但隨著大數據和人工智能等在各領域的應用與發展,迫切需要高性能計算機提高性能,提供更強大的計算能力。為滿足需求,高性能計算機通過增加處理器數量和高速并行工作模式相配合,峰值計算速度和持續速度得到不斷提升。2022年6月發布的TOP500高性能計算機排行榜中,排名第一的“前沿”(Frontier)高性能計算機系統的峰值性能已經達到E級,即計算性能可達到每秒百萬萬億次浮點計算[1]。
高性能計算(high performance computing,HPC)的快速發展,使得系統規模越來越大,在提高性能的同時,也帶來一些問題。大規模的并行應用程序中,節點間的通信受網絡鏈路影響,存在一定的通信延遲,而且每次通信,通信消息都要頻繁進出內存,這將帶來一定的啟動和接收延遲,且這些延遲會隨著系統規模的增大而成倍增加[2]。從應用的角度來看,在科學和工程計算中,高性能計算機的性能主要體現在應用程序的執行時間上。高性能計算中,許多并行程序的執行都是計算和通信交替進行,在計算階段,各個進程在處理節點上獨立運行,通信階段進程則在互連網絡中執行同步和數據交換;在通信階段,處理節點實際上是處于等待狀態,不進行任何計算操作,這極大地降低了高性能計算機的效率,并行程序難以獲得理想的運算速度和并行效率[3]。
消息傳遞并行編程模型[4](message passing interface,MPI),是目前解決并行應用主要的編程模型,在高性能計算機系統中被廣泛采用。聚合通信是MPI中的重要組成部分,在并行系統中,聚合通信通常是應用程序中一組進程間的互相協作,通過進程間的消息傳遞來實現任務控制、數據交換和數據計算。有數據統計表明,在大規模的科學和工程計算中,聚合通信開銷占據很大比例,有時甚至可達到全部消息傳遞開銷的80%[5]。與此同時,聚合通信可以高效管理消息緩沖區,避免緩存占用大及其管理開銷過大的問題。因此,聚合通信的使用及其優化對提升高性能計算機性能,提高并行應用程序的執行效率具有重要意義。
在高性能計算機中,通信系統的異構性會導致系統內不同層級的通信性能存在一定程度的差異,這給聚合通信的優化帶來了更加艱難的挑戰[6]。目前,針對具體應用程序中的同步、廣播和歸約等聚合通信操作,有很多研究在算法領域或硬件上提供了較為有效的優化方案。但受制于基礎環境和特定聚合通信操作的內在因素影響,不存在某一種優化方案在各種場景都能取得良好的優化效果。因此,在大規模的聚合通信場景下,面對高性能計算機內存在不同層級的通信性能變化,找到合理且有針對性的優化方案變得尤為重要。
本文主要針對聚合通信中的歸約操作進行優化,提出了一種軟硬件結合的支持歸約計算網卡卸載機制,通過在網卡(network interface card,NIC)上嵌入歸約操作邏輯部件,包括觸發邏輯部件和浮點計算單元。方法中將原來由CPU執行的計算卸載到NIC上執行,實現了數據在傳輸過程中的計算,減輕了CPU的負擔,降低了通信延遲。
聚合通信的實現方式可以根據硬件的支持程度劃分為三類:基于軟件方式、基于硬件方式和軟硬件結合的方式。最理想的情況是純硬件方式實現,但硬件實現的復雜度高,經濟投入巨大,因此本文不做詳細討論。
軟件聚合通信是在點對點通信的基礎上結合算法實現的,是當前應用較為廣泛的一種方式。軟件算法實現具有良好的普適性,可以在不改變原語的情況下,在各平臺實現。
最早的軟件聚合通信算法于1988年被提出,是基于傳播算法來實現的同步操作[7],至今仍被大量使用。此后,Watts和Geijn[8]提出一種廣播算法,該算法將進程要發送的消息分成若干小消息,然后將這些小消息發散給不同的進程,接著各進程使用組收集操作使得每個進程都得到所有的小消息,以此完成某一進程向其他進程廣播消息的目的。由于此種算法會頻繁使用各進程的緩沖區,在互連網絡中容易形成擁塞。Rabenseifner[9]在廣播算法的基礎上提出了對組歸約操作的新算法,算法中將組歸約操作分成兩步,步驟一中做散發操作,步驟二中進行一次組收集操作。該算法的目的是將集中到根進程的計算分散到其他子進程中完成,從而改變根進程是組歸約操作中的瓶頸問題。Thaur等[10]對MPICH庫的實現進行優化,大大提高了同步、廣播、歸約和組歸約等的操作性能,為軟件聚合通信操作的使用與優化提供了一種重要方法。
通過軟件實現聚合通信方法較簡單,但由于是基于點對點通信實現,所以通信消息會頻繁進出系統內存,使通信過程中存在延遲,并且當進行歸約操作時,計算與通信操作不能同時進行,當消息在網絡中傳遞時,處理器將處于空閑狀態,使得效率低下。
通過軟硬件結合實現聚合通信操作的方式包含了軟件與硬件分別實現的優點,使得高性能計算機在執行聚合通信操作時可以兼顧編程簡便、延遲降低以及計算與通信重疊,大大提高聚合通信的性能。
最早的軟硬件結合方法由Buntinas等[11]提出,在Myrinet上實現了基于網卡卸載的同步、廣播和歸約等聚合通信操作,與軟件聚合通信相比,性能有很大的提升。受此啟發,Moody等[12]在QsNet上提出基于網卡卸載的歸約算法,該方法在網卡端集成了浮點計算單元,將本該由CPU進行的計算卸載到網卡端執行,從而提高計算與通信的重疊率以及歸約性能。實驗證明,卸載到網卡端執行的歸約操作,整數歸約性能提高了121%,浮點數歸約性能提高了40%。之后,IBM公司也在其Blue Gene系列系統上提出軟硬件結合的聚合通信方法,該方法通過直接存儲器訪問(direct memory access, DMA)和浮點計算單元等部件實現卸載操作,并在通信不滿足專用網絡拓撲時設置有專用的聚合通信網絡。經驗證,Blue Gene系列系統上聚合通信操作性能相比MPI軟件實現得到很大提升[13-14]。CM-5系統同樣采用了專用的聚合通信網絡,專用網絡為兩套二叉樹,其中一套實現歸約操作,一套實現廣播操作。Portals網絡上,通過在網卡端集成Portals單元和DMA部件來實現聚合通信操作的卸載執行[15]。Portals單元中包含與處理器計算速度相當的浮點計算單元,大大降低系統在執行歸約操作時的各種時間延遲。實驗證明,在多節點樹形算法的情況下,利用此種方法實現的歸約操作性能比軟件聚合通信提高了1.8倍左右。
此外,一些公司也通過交換機來實現聚合通信操作[16],如Voltaire公司的FCA(fabric channel accelerator)和Nvidia公司的交換機中實現SHARP協議。Voltaire公司產品通過在MPI庫中集成FCA技術[17],使得聚合通信操作在執行時能夠獲取物理拓撲網絡的信息,并根據拓撲網絡構建聚合通信樹。在聚合通信樹中,一旦父節點得知計算結果,利用FCA就可以通過交換機進行廣播操作,將結果通知其他節點。FCA技術還可以將聚合通信消息與交換機中的其他消息隔離,從而消除競爭。SHARP是Mellanox公司推出的將聚合通信操作卸載到網絡中執行的技術,該技術實現了消息在傳輸過程中就進行計算,使得交換機成為協處理器,降低處理器的負擔,加速歸約計算速度,提高系統性能[18-19]。SHARP同時適用于深度學習、大數據計算等領域,并有良好的應用性能。
通過軟硬件結合實現聚合通信操作的方法,能夠大大提高系統在進行聚合通信操作時的性能,降低通信延遲,提高計算與通信的重疊率[20]。但通過網卡或交換機實現硬件卸載,勢必增加硬件設計的復雜度,從而導致經濟投入增大。
高性能計算領域的不斷發展為軟硬件開發提供了更多便利,為提出更有效的聚合通信優化方案提供了基礎。針對“天河”超級計算機系統的需求,本文提出了一種軟硬件結合的支持歸約計算網卡卸載機制,將原來由CPU執行的計算卸載到NIC上執行,實現了數據在傳輸過程中的計算,降低了CPU的負擔以及通信延遲。
“天河”高速互連網絡在聚合通信優化方面的設計思想類似于Portals網絡,都是在網卡端加入特殊的硬件來卸載處理機端的事務,不同的是“天河高速互連網絡”的網卡端加入的硬件更加簡單,這樣,在無須大幅增加硬件復雜性和經濟成本的情況下仍能使聚合通信的操作性能有了很大的提升。相比Portals網絡,本文提出的方法經濟成本低,使用硬件程序產生的軟件額外開銷小。
硬件實現結構示意圖如圖1所示,主要包含請求發送模塊、請求接收與處理模塊、請求消息接收隊列和算術邏輯單元(arithmetic logic unit, ALU)。

圖1 聚合通信硬件實現結構示意圖Fig.1 Schematic diagram of the implementation of collective communication hardware
1)請求發送模塊:請求發送模塊用于解析本節點提交的描述符序列,然后產生相應的請求消息發送到目的節點。針對聚合通信描述符,模塊內部實現了觸發執行的機制。描述符格式如圖2所示,描述符中設置有CP和CPCnt標志位;CP位域表示該序列中各描述符形成的報文到達目的節點時,將使對應虛端口的全局計數器CP_Counter加1;CPCnt表示觸發描述符執行需接收的CP報文數量的閾值,該值與CP_counter進行比較,當滿足CP_counter ≥ CPCnt時,觸發描述符序列執行。同時,根據描述符中的SwpFlag位域決定是否在本模塊中進行數據交換。
2)請求消息接收隊列:請求消息接收隊列用于接收并存儲來自其他節點的請求消息。消息是否寫入接收隊列,受主機提交描述符中的SwpMp標志控制。NIC硬件中設置有一定深度的緩沖區,采用動態分配多隊列方式管理;請求消息寫入緩沖區,即認為消息已到達目的節點。在執行歸約操作時,緩沖區可緩存最大歸約分支度個歸約請求消息。

圖2 聚合通信描述符格式Fig.2 Collective communication descriptor format
3)請求接收與處理模塊:請求接收與處理模塊基于本地描述符和接收到的請求消息進行計算操作,生成新的請求消息,并由請求發送模塊通過網絡發送到目的節點。請求接收與處理模塊檢查請求消息接收隊列是否收到其他節點發來的請求消息,如果有,則對消息進行解析,并根據解析結果和描述符中相關數據發送到ALU部件中進行計算操作。ALU部件完成相應的計算操作后,將計算結果返回給請求接收與處理模塊。對于歸約操作,新的請求消息通常由描述符和接收到的請求消息中的數據通過一定的計算操作來產生。
4)ALU:由于NIC本身不具備進行浮點運算的能力,因此,本方法在NIC中嵌入ALU模塊。該模塊可實現對32位和64位數據進行歸約計算。計算類型包括浮點加法、浮點求最大值或最小值且附加位置信息,有符號和無符號的整數加法、整數求最大值或最小值且附加位置信息,邏輯與、邏輯或、邏輯異或和位與、位或、位異或。
執行一次歸約操作,首先由并行程序的一次MPI歸約調用開始,進入MPI調用后,軟件構造歸約通信域,將參與線程與物理節點的映射關系發送給所有參與歸約的節點。
基于軟件線程號和通信域,構建歸約操作相關的描述符,包括用于計算的歸約描述符和用于通知的廣播描述符。由軟件按指定算法計算出歸約操作中的葉節點、中間節點和根節點。由于并行應用程序使用線程標號進行歸約操作,因此描述符以線程號作為源節點號和目的節點號。
基于各節點信息,完成線程號與節點號的映射,生成最終的歸約描述符和廣播描述符。生成的歸約描述符中,需要包含源節點號、目的節點號、參與歸約的數據個數、錯誤向量、歸約分支度、歸約類型、歸約數據位寬、歸約數據和位置信息等歸約信息,硬件在解析描述符后,按規定執行歸約操作。生成的廣播描述符需指定源節點號、目的節點號,描述符本身無須準備數據,而是提交后在NIC中等待觸發執行,并用歸約計算結果替換對應的數據位域,最終完成廣播操作。
用于歸約操作的描述符生成后,軟件向硬件提交描述符。所有NIC硬件收到歸約描述符后,除葉節點對應NIC外,其他NIC在收到描述符后等待觸發執行。葉節點NIC收到描述符后直接形成歸約報文發往父節點;父節點NIC收到子節點發來的歸約報文,并不會提交給節點,而是將歸約報文存儲于NIC中的請求消息接收隊列中。然后請求接收與處理模塊對請求消息進行解析,并按約定進行處理。首先將子節點發來的歸約類報文送入ALU中進行計算,并在計算結束后觸發父節點提交到NIC中的歸約描述符,所提描述符與之前的計算結果再次進行歸約計算,并在計算完畢后形成歸約報文按算法向上發送,具體處理過程如圖3所示。以此類推,直到根節點。根節點NIC中的歸約計算與上述父節點中類似,不同的是根節點提交的歸約描述符生成的歸約報文的目的節點為自身,且分支度為1,因此該歸約報文不會再進行歸約計算,而是觸發執行根節點提交的廣播描述符,將歸約計算結果通知給所有參與此次歸約操作的節點。
歸約描述符與廣播描述符都執行完成后,按照描述符中的規定,所有NIC硬件向各自對應節點中指定內存地址寫入完成值,完成值為計算結果。當軟件收到硬件返回的歸約結果后,則表示一次完整的歸約操作結束。
不過,廣東人對臘味的熱衷不只是在冬季。廣東素有“秋風起,食臘味”的說法,如今產業化的生產模式,更是讓全年臘味不斷。其中,最令老饕們偏愛的食物當屬臘味煲仔飯。臘味煲仔飯是臘味飯的集大成者,肉質肥美,青菜爽口,米飯彈力十足,連煲底那一層焦香的鍋巴,都讓人難以忘懷。
如圖3所示,當請求接收與處理模塊檢測到buffer中有報文,則將報文順序讀出,并對讀出的報文進行計數,計數由Rcnt1開始。同時,將Rcnt1報文中的Branch、Rtype和Data等信息存入中間結果寄存器中;讀出Rcnt2報文后,先后比較該報文與中間結果寄存器中的Branch和Rtype位域,如果一致,則將二者中的數據一起送入ALU中進行計算;ALU返回的計算結果直接更新到中間結果寄存器中;此時,比較Rcnt和Branch的值,如果不等,則繼續讀出報文進行計算,計算過程與前述一致;如果二者的值相等,則檢查請求發送模塊接收的第一個描述符,判斷描述符是否為歸約描述符(Rflag),繼而比較描述符與中間結果寄存器中的Rtype,當描述符與Rtype一致時,將描述符與中間結果寄存器中的數據送入ALU中進行計算,并將計算結果再次更新到中間結果寄存器;當歸約計算結束時,將中間結果寄存器中的數據替換到前述描述符中;如果請求發送模塊接收的第一個描述符不是歸約描述符,那么直接用中間結果寄存器中的數據替換此描述符中的數據位域。

圖3 NIC中歸約操作流程示意圖Fig.3 Schematic diagram of protocol operation in NIC
具體的操作流程如下:
1)請求接收與處理模塊檢測buffer中的報文,當有報文則按順序讀出執行。
2)對讀出的報文進行計數,由Rcnt1開始,并將Rcnt1報文中的Branch、Rtype和data等位域存入中間結果寄存器中。
3)檢測Rcnt2報文與中間結果寄存器中報文(Rcnt1報文)的Branch和Rtype位域是否一致,如果一致則將二者報文中的數據送入ALU中進行計算。
4)ALU中計算結束后將計算結果更新到中間結果寄存器。
5)檢查Rcnt是否等于Branch,如果不等于,則繼續讀出報文進行計算;如果相等,則檢查本節點提交的第一個描述符是否為歸約類型。
6)重復步驟3)、步驟4),直到步驟5)滿足條件。
8)使用中間結果寄存器中的數據替換本地提交的描述符中的數據位域。
綜上所述,“天河”高速互連網絡基于觸發實現歸約操作的優化有以下優勢:
1)硬件實現簡單,沒有大幅增加硬件復雜性和經濟成本:由于“天河”高速互連網絡只在網卡端加入了觸發邏輯,而且觸發邏輯只需實現簡單的功能,從而“天河”高速互連網絡的網卡較一般的網卡并沒有增加太多的硬件,因此經濟成本較之前的互連網絡并沒有太大的增加。
2)網卡端進行數據自動復制和自動觸發發送,加快消息的傳遞速率,大大減少了節點端消息的停留時間,使得聚合通信對規模的敏感性降低,使得快速、大規模的歸約操作成為可能。
3)網卡端自動處理數據而不需要處理機的參與,減小了系統噪聲對歸約操作的影響,增加了歸約操作的性能和可靠性。
4)在進行聚合通信時網卡端進行消息處理的同時處理機端可以進行其他的計算工作,增加了計算與通信的重疊率。
基于本文提出的支持歸約計算的網卡卸載機制,在FPGA平臺搭建了16節點規模的測試環境;基于xNetSimPlus模擬器[21]模擬實現了32、64、128、256節點的測試。在軟件層面,將實現集成到“天河”超級計算系統的通信庫MPICH_GLEX中,軟硬件接口的整體結構如圖4所示,MPICH_GLEX運行在用戶層,調用用戶層函數Libglex和內核層設備驅動接口gdev來進行網卡端軟硬件資源的使用。具體實驗步驟如下:

圖4 軟硬件接口整體結構Fig.4 Overall structure of software and hardware interface
1)配置節點規模、拓撲結構等參數。
2)root節點與leaf節點進行同步,root節點給leaf節點分配leaf id,交換內存地址等信息。
3)root節點進入循環,提交歸約描述符與集合描述符,其中歸約描述符設置coll_counter=num_of_leafs,接受節點發來的mp報文后觸發,向自身發送mp報文;集合描述符coll_counter=1,受自身歸約mp報文觸發,得出歸約計算結果并校驗。
4)leaf節點進入循環,提交歸約描述符,向root節點立即發送mp報文;等待接收root節點發來的集合報文。
5)統計結果并記錄。
為了評價改進后聚合通信操作的性能,本文將使用k-aryn-tree 胖樹拓撲來測試有無硬件卸載機制對聚合通信性能的影響。胖樹拓撲是一種典型的多層次樹形拓撲,在高性能計算機及數據中心中廣泛使用,節點之間的通路自葉向根逐漸變寬,適應了通信帶寬自葉向根逐漸變大的實際要求,實現了網絡帶寬的平滑擴展,胖樹拓樸結構如圖5所示。模擬時,默認每個節點上只運行一個進程,測試的節點規模選定為 16、32、64、128和256。

圖5 胖樹拓撲結構Fig.5 Fat tree topology
要準確評價聚合通信的性能,必須考慮整個聚合通信過程對并行應用的影響,在此基礎上選取合適的評價指標。聚合通信由一組節點共同參與完成,其中某個節點進行聚合通信的時間并不能反映聚合通信的性能。Nupairoj和Ni[22]提出了以聚合通信操作的完成時間為評價指標來評測聚合通信的性能,聚合通信操作完成時間定義:讓所有進程在t0時刻調用聚合通信操作,從t0開始直到所有節點都完成該操作為止的這段時間被定義為聚合通信操作的完成時間tc。
圖6給出了消息大小為8 Byte,節點數量為16、32、64、128、256時不同數據類型Reduce操作的完成時間對比圖。不同消息大小下歸約操作的完成時間如圖7所示。

(a) 雙精度浮點型(a) Double float

圖7 不同消息大小下,歸約操作的完成時間Fig.7 Completion time of All-reduce operation under different message sizes
通過調整實驗中消息大小,得到了表1至表5中的實驗結果。橫向表頭為操作數類型;“無”表示無聚合通信卸載,“有”表示NIC聚合通信卸載;縱向表頭為節點數量;數據單位為μs。

表1 消息大小為16 Byte時不同節點規模通信時間

表2 消息大小為24 Byte時不同節點規模通信時間

表3 消息大小為32 Byte時不同節點規模通信時間

表4 消息大小為40 Byte時不同節點規模通信時間

表5 消息大小為48 Byte時不同節點規模通信時間
從圖6可以看出,本文提出的支持歸約計算的網卡卸載機制優勢明顯。從圖7可以看出,在節點規模增大以及傳輸數據量變大時,卸載方案優勢依然穩定,但當消息大小由48 Byte增大至56 Byte時,通信時間存在較大波動,這是由于聚合通信描述符在設計時最大只能攜帶48 Byte的Reducedata,當消息大小大于48 Byte時,傳輸一條消息時會生成更多的描述符用于數據傳輸,導致系統整體性能下降。
對比不同節點規模Reduce操作的實驗結果,可以看出在256節點規模下,相比于無聚合通信卸載,NIC卸載方法最高能獲得271%的加速效果,而利用Portals網卡進行卸載的同規模Reduce操作最高能獲得180%的加速效果[23]。
基于硬件卸載的聚合通信實現機制是提升高性能網絡通信性能的重要途徑。本文提出了一種基于網卡的歸約計算硬件卸載機制,通過在網卡上嵌入歸約操作邏輯部件,在數據傳輸過程中完成計算功能,減輕了CPU的負擔,降低了通信延遲。實驗表明,本文所提出的基于NIC的硬件卸載機制能有效減少聚合通信中歸約操作的時間,提升通信性能。
后續的研究中,將考慮優化現有的歸約實現機制,通過保證規約計算的順序性,實現多次規約計算具有相同的結果。此外,考慮融合多核架構和網絡功能,把更大規模數據通信相關的計算功能卸載在網絡上進行實現,提升系統性能。