胡新明,盛沖沖,李佳佳,吳百鋒
?
面向通用計算GPU集群的任務自動分配系統(tǒng)
胡新明,盛沖沖,李佳佳,吳百鋒
(復旦大學計算機科學技術學院,上海 201023)
當前GPU集群的主流編程模型是MPI與CUDA的松散耦合,采用這種編程模型進行編程,存在編程復雜度大、程序的可移植性差、執(zhí)行效率低等問題。為此,提出一種面向通用計算GPU集群的任務自動分配系統(tǒng)StreamMAP。對編譯器進行改造,以編譯制導的方式提供集群任務的計算資源需求,通過運行時系統(tǒng)動態(tài)地發(fā)現(xiàn)、建立并維護系統(tǒng)資源拓撲,設計一種較為契合GPU集群應用特征的任務分配策略。實驗結果表明,StreamMAP系統(tǒng)能降低集群應用程序的編程復雜度,使之較為高效地利用GPU集群的計算資源,且程序的可移植性和可擴展性也得到了保證。
GPU集群;異構;編程模型;任務分配;可移植性;可擴展性
采用具有大規(guī)模并行計算能力的GPU作為異構加速設備的GPU集群在科學計算領域得到了廣泛的研究和應用。文獻[1]采用GPU集群作為底層運行平臺來加速流計算應用。文獻[2]將分子生物學中蛋白質(zhì)分子場的計算程序并行化,使之能夠在GPU集群上加速執(zhí)行。此外,GPU集群在仿真學[3]和分子動力學[4]等領域也有大量應用實現(xiàn)。研究結果表明,對于具有數(shù)據(jù)密集型計算的應用,相比較于傳統(tǒng)的計算平臺,GPU集群能夠提供充分的計算能力,并帶來可觀的性能加速比。
GPU的加入使得GPU集群呈現(xiàn)節(jié)點內(nèi)部資源的異構化,單個節(jié)點內(nèi)部不僅可以包含單核CPU、多核CPU,甚至GPU計算資源,而且包含了單GPU或者多GPU。GPU作為面向大規(guī)模數(shù)據(jù)并行計算的計算資源使得GPU集群的并行計算能力呈現(xiàn)多層次化。GPU集群不僅能夠支持常規(guī)粒度的單程序多數(shù)據(jù)(Single Program Multiple Date, SPMD)和多程序多數(shù)據(jù)(Multiple Program Multiple Date, MPMD)計算能力,而且可以支持更細粒度的面向大規(guī)模數(shù)據(jù)的SPMD和單指令多數(shù)據(jù)(Single Instruction Multiple Data, SIMD)計算能力。GPU集群這種異構計算資源和多層次并行計算能力給并行程序設計帶來了巨大的困難。
為了更好地對GPU集群這種異構計算平臺[5]進行編程,學術界在編程模型方面進行了大量的研究。文獻[6]和文獻[7]對基于SMP體系結構的并行編程模型MPI+openMP進行了初步的探索。文獻[8]對現(xiàn)有的消息傳遞系統(tǒng)進行了擴充,以使其能夠更好地適應GPU加入集群帶來的通信要求。當前主流的GPU集群編程模型是MPI+CUDA[9],這種編程模給程序員提供了一種使用異構計算資源和發(fā)揮GPU集群多層次并行的能力,但是它不能充分地契合GPU集群系統(tǒng)體系結構,并將由此帶來編程復雜度大、程序可移植性差、執(zhí)行效率低等問題。為此,本文設計并實現(xiàn)了面向節(jié)點異構GPU集群的任務自動分配系統(tǒng)StreamMAP,StreamMAP系統(tǒng)包含語言擴展(編譯器前端)和運行時系統(tǒng)2個部分,以在自動且高效地將集群任務映射到計算節(jié)點的同時,降低編程復雜度并提高程序的可移植性。
在科學計算領域,GPU已經(jīng)成為主流加速部件,各種不同規(guī)模的GPU集群應運而生。例如NCSA部署的2套基于Tesla s1070系列的GPU集群Lincoln[10]和AC[11]。 Lincoln有192個節(jié)點,每個節(jié)點包含2個四核CPU。每 2個節(jié)點共享1個Tesla s1070 GPU,節(jié)點之間通過SDR INFINIBAND總線進行互連。AC包含32個節(jié)點,每個節(jié)點包含2個雙核CPU和1個Tesla s1070系列GPU。上述GPU集群至部署以來已經(jīng)成功地完成了大量的科學計算工作,其性能、穩(wěn)定性、可靠性都得到了良好的證實。
上述GPU集群計算資源不僅包含CPU還包含GPU,這樣集群系統(tǒng)本身就是系統(tǒng)層面異構的。但因為每個節(jié)點的資源配置完全一致,所以集群系統(tǒng)在節(jié)點層面仍然是同構的。然而出于很多原因,在現(xiàn)實系統(tǒng)中的很多GPU集群都是節(jié)點異構的。
典型的GPU集群系統(tǒng)體系結構如圖1所示。在節(jié)點異構GPU系統(tǒng)中,每個節(jié)點可以有一個或多個GPU,也可以沒有GPU。隨著CPU和GPU的發(fā)展以及集群節(jié)點擴展,新的高性能CPU和GPU加入到GPU集群中,集群的異構程度進一步加強。可以預見,在未來,節(jié)點異構GPU集群將成為高性能計算領域的主流系統(tǒng)。

圖1 GPU集群體系結構
消息傳遞接口MPI[12]是一種標準化可移植的消息傳遞系統(tǒng),主要用于基于分布式內(nèi)存的并行計算機或集群系統(tǒng)。MPI是為了編寫消息傳遞程序而開發(fā)的廣泛使用的標準。通過編寫配置文件可以自定義地將邏輯進程分配到具體的物理執(zhí)行節(jié)點去運行。
計算統(tǒng)一設備架構CUDA是NVIDIA公司研發(fā)的一種針對面向通用計算GPU的并行計算架構。通過對C語言進行的擴展和限制,CUDA為GPU異構計算環(huán)境提供了一種抽象的編程模型。在這種編程模型中,GPU和CPU分別被稱為device和host。CUDA程序包括2個部分,一部分在CUDA設備上執(zhí)行,稱之為內(nèi)核(kernel),另一部分在CPU上運行,稱之為主機進程(host process),兩者通過GPU全局內(nèi)存共享和交換數(shù)據(jù)。
當前HPC領域GPU集群的主流編程模型是MPI與CUDA的松散耦合,構成一個可行的GPU集群系統(tǒng)并行編程模型MPI+CUDA。
圖2為MPI+CUDA編程模型系統(tǒng)框圖,MPI主要負責進程的顯示劃分和進程間的通信,CUDA負責GPU面向數(shù)據(jù)級并行程序的設計和實現(xiàn)。

圖2 MPI+CUDA編程模型
采用MPI編程模型之所以會有編程難度大、可移植性差、程序執(zhí)行低效等缺點,是因為盡管每個任務都有可能是一個CUDA并行程序,需要在GPU上執(zhí)行,但MPI系統(tǒng)以一種平坦的視角對待每一個進程,即無論是純CPU任務還是CPU-GPU任務,MPI系統(tǒng)并不關心每個任務的細節(jié)信息和其對于資源的需求。同樣在MPI集群系統(tǒng),系統(tǒng)中的每個節(jié)點對于MPI系統(tǒng)來說也是透明的,MPI并不關心這個節(jié)點的資源狀況。無論是集群任務對于資源的需求還是每個節(jié)點的資源情況,對于MPI運行時系統(tǒng)都是透明的,即無法進行自動高效的任務分配。
通過提供編譯制導指令和運行時系統(tǒng),StreamMAP系統(tǒng)很好地解決了MPI系統(tǒng)的這2個盲點。StreamMAP系統(tǒng)模型如圖3所示。

圖3 StreamMAP系統(tǒng)模型
StreamMAP對于傳統(tǒng)的并行編程模型進行了2個層面的擴展:
(1)通過對C語言編譯器進行擴展,向應用程序員提供編譯制導指令。通過編譯制導的方式,程序員可以在程序中顯示地表達任務的計算資源需求。StreamMAP系統(tǒng)提供一個編譯器前端對編譯制導指令進行解析。使用編譯制導的好處在于,即使在原始編譯器環(huán)境下,程序仍然可以正確地編譯執(zhí)行。
(2)StreamMAP運行時系統(tǒng)完成系統(tǒng)資源的自動發(fā)現(xiàn),建立并維護系統(tǒng)資源數(shù)據(jù)庫,并根據(jù)集群任務的資源需求,進行有效的任務分配,最終通過生成MPI執(zhí)行配置文件,完成集群任務到計算節(jié)點的映射。
StreamMAP的目的是為各種不同的GPU集群體系結構提供一個通用的、高效的編程環(huán)境。系統(tǒng)的設計與實現(xiàn)主要考慮了如下方面:
(1)可編程性:應用程序員只需要設計邏輯上任務劃 分和進程間通信的關系,而任務的具體運行位置則由StreamMAP系統(tǒng)自動完成。這樣應用程序員無需了解底層的體系結構細節(jié),就實現(xiàn)了邏輯設計與物理運行的分離。這種系統(tǒng)結構層面的抽象簡化了程序員編程的難度。
(2)可移植性:StreamMAP系統(tǒng)自動完成集群系統(tǒng)資源的發(fā)現(xiàn)與分配,應用程序員無需了解底層節(jié)點資源狀況。當集群節(jié)點資源拓撲結構發(fā)生變化時,應用程序無需做任何修改即可在新的環(huán)境中正確、高效地運行。
(3)高效性:StreamMAP系統(tǒng)采用有效的任務分配策略,使得對于計算資源需求不同的邏輯進程能夠高效地映射到異構的物理節(jié)點上,保證了集群系統(tǒng)計算能力得到最大程度的利用。
(4)可擴展性:集群平臺環(huán)境對于程序員來說是透明的,系統(tǒng)資源的發(fā)現(xiàn)和任務的分配都由StreamMAP系統(tǒng)自動完成,這使得其在應用程序是高度可擴展的。
如圖3的系統(tǒng)模型所示,StreamMAP包含任務分析模塊、系統(tǒng)監(jiān)控模塊和任務自動分配模塊3個部分。
(1)編譯制導是一種通過對編譯器進行改造,提供對某些自定義編譯指令的支持以實現(xiàn)某種自定義條件編譯的技術。在正式編譯開始之前,編譯指令指示編譯器完成某項工作(通常是預處理工作)。編譯指令的解析需要編譯器的支持,但如果采用原始的編譯器進行編譯,將會忽略編譯偽指令,也可以完成編譯工作。openMP、openACC[13]等并行編程技術都采用編譯制導的方式對傳統(tǒng)的串行程序語言進行了相應的擴展,使之能夠支持并行程序的設計與實現(xiàn)。StreamMAP任務分析模塊通過提供編譯器前端解析程序員提供的編譯制導信息,分析并存儲所有集群任務的計算資源需求狀況。StreamMAP系統(tǒng)編譯制導指令格式為:#pragma streamap directive [clause[[,]clause]…] new-line。當前實現(xiàn)的資源指令語法格式為:#pragma streamap resource [tasknum:res[[,]tasknum:res]…] new-line。資源指令表達了集群任務對于資源的需求狀況,其中,tasknum為任務編號,對應于MPI+CUDA編程模型中的進程編號;res可以是 C/c,表示任務為純CPU任務(不需要GPU加速設備的支持),也可以是G/g,表示任務中含有大規(guī)模并行的cuda kernel程序,需要在GPU設備上運行。為便于使用,任務分析指令的解析支持正則表達式實現(xiàn)。
(2)StreamMAP系統(tǒng)監(jiān)控模塊包含一個控制節(jié)點和多個計算節(jié)點,控制節(jié)點本身也可以是計算節(jié)點,并作為進行任務分配的單位。在StreamMAP系統(tǒng)啟動和更新期間,控制節(jié)點向所有計算節(jié)點發(fā)送資源發(fā)現(xiàn)請求消息,每個計算節(jié)點中運行StreamMAP的資源發(fā)現(xiàn)模塊,通過相關操作系統(tǒng)調(diào)用和一系列GPU設備查詢例程獲取本節(jié)點資源信息并反饋給控制節(jié)點,由控制節(jié)點存儲并更新所有集群節(jié)點的各種資源信息。StreamMAP運行時系統(tǒng)基于MPI消息傳遞系統(tǒng),完成對所有集群節(jié)點的輪詢,記錄并維護所有節(jié)點反饋的系統(tǒng)資源信息,包括CPU資源、GPU資源、系統(tǒng)通信拓撲等。
圖4為基于StreamMAP系統(tǒng)的邏輯結構和軟硬件層次模型。其中,控制節(jié)點基于MPI scatter模式向各個計算節(jié)點發(fā)送資源的發(fā)現(xiàn)請求消息,在每個計算節(jié)點的內(nèi)部StreamMAP運行時系統(tǒng)完成CPU、GPU、通信拓撲等系統(tǒng)資源的發(fā)現(xiàn)。然后所有的這些資源信息以MPI reduce模式聚集到控制節(jié)點,控制節(jié)點以此建立并維護系統(tǒng)資源數(shù) 據(jù)庫。

圖4 StreamMAP運行時系統(tǒng)
(3)在完成任務資源需求分析和系統(tǒng)資源發(fā)現(xiàn)的基礎上,StreamMAP運行時系統(tǒng)中的任務分配模塊自動地完成集群任務到物理計算節(jié)點的映射?,F(xiàn)實中大量的集群應用存在廣泛的差異性,一種單一的任務劃分方式或是任務分配算法很難保證具體的應用能夠最高效地在集群環(huán)境中運行。為了滿足集群任務的資源需求并兼顧系統(tǒng)的負載均衡狀況,同時保證系統(tǒng)的通用性,本文采用了較為簡單和典型的Round-Robin資源輪詢算法,并有差異性地區(qū)分GPU和CPU計算資源。即相比較于CPU能支持多任務并發(fā)和搶占執(zhí)行等機制,本文系統(tǒng)將GPU視為不可搶占資源,并因此在任務分配時優(yōu)先考慮分配CPU-GPU類任務,以滿足此類任務的資源需求。即在第1次分配中只考慮CPU-GPU類任務,選擇具有GPU加速器的計算節(jié)點并考慮這類節(jié)點的負載情況,并將任務分配到負載較小的節(jié)點。第2次分配時,所有需要在GPU設備上執(zhí)行的任務已經(jīng)分配完畢,這時僅需要考慮純CPU類任務和所有計算節(jié)點,具體分配算法和CPU-GPU類任務的分配相同。
在本文實驗中,現(xiàn)實系統(tǒng)是系統(tǒng)和節(jié)點層面異構的GPU集群DISPAR,集群平臺包括4個節(jié)點,系統(tǒng)拓撲結構如圖5所示,node0、node1主機為DELL T410服務器,分別包含XEON 5606四核CPU以及內(nèi)置的1個NVIDIA C2075 GPU。node2、node3是2臺DELL T5600工作站,內(nèi)置雙核CPU??紤]到設備成本較大,而且本文實驗重點驗證StreamMAP系統(tǒng)所實現(xiàn)的任務分析、系統(tǒng)監(jiān)控和任務自動分配等功能性目標,并不追求極致的計算和通信速度,DISPAR集群系統(tǒng)沒有采用相當于萬兆以太網(wǎng)的高速互聯(lián)設備INFINIBAND,而是采用1 000M以太網(wǎng)代替。

圖5 DISPAR集群拓撲結構
所有節(jié)點運行64位ubuntu 10.04 LTS操作系統(tǒng),MPI選擇支持多種體系結構的MPICH2開源實現(xiàn)。NVIDIA driver版本是285.05.33,CUDA Toolkt版本為4.1,CUDA SDK版本為4.1,用于開發(fā)的GCC的版本是4.4.3。
實驗采用的集群應用樣例程flowComput共包含12個任務,其中,task0~task7為純CPU任務;task8~task11為CPU-GPU任務。
圖6是通過StreamMAP系統(tǒng)最終生成的flowCompute執(zhí)行配置文件,配置文件的前2列是待執(zhí)行集群任務的數(shù)目,中間2列表示這些任務執(zhí)行的具體集群節(jié)點,最后 1列這是集群應用的執(zhí)行程序和數(shù)據(jù)映像。因為在配置文件格式中,任務的編號默認是按照行的順序進行遞增,所以這實際上是建立了集群任務到計算節(jié)點的一個映射。如圖6所示,第1列表示將task0分配在node0上執(zhí)行,第2列表示將task1在分配node1上執(zhí)行,以此類推。

圖6 MPI執(zhí)行配置文件
表1為本文實驗中MPI和StreamMAP這2種調(diào)度方案的任務分配結果,可見MPI采用了一種簡單的隨機分配方案,任務按照編號依次地分配到各個節(jié)點。其中,MPI運行時調(diào)度系統(tǒng)忽略了任務10、任務11對于GPU計算資源的需求,而將這2個具有大規(guī)模數(shù)據(jù)并行的任務分別分配到?jīng)]有配備GPU加速器的普通計算節(jié)點2和節(jié)點3。在采用MPI+CUDA,乃至其他包含異構GPU內(nèi)核程序的主流GPU集群編程模型中,這種分配方案使得集群應用無法在異構GPU集群平臺上正確地運行。而采用StreamMAP的分配方案中,4個CPU-GPU類任務task8~task11分別被分配到具有并行計算能力的GPU節(jié)點node0和node1,而純CPU任務task0~task7則被均勻地分配到集群中的各個節(jié)點。所有任務的計算資源需求都得到了滿足,因此相比之下,streamMAP更能夠契合GPU集群的體系結構特征。

表1 2種方案任務的分配結果
為了能夠?qū)PI運行時調(diào)度方案和StreamMAP調(diào)度方案進行性能比較,首先需要使得采用MPI運行時系統(tǒng)的集群應用程序能夠在GPU集群上正確運行,為此使用openACC跨平臺編譯制導指令對本文實驗中所用到的集群應用進行重寫。使用OpenACC編譯制導指令的好處在于,如果一個具有大規(guī)模數(shù)據(jù)并行性的CPU-GPU任務沒有獲得其執(zhí)行所需要的GPU計算資源,就會通過相應的回滾(fallback)操作在CPU處理器上執(zhí)行。
表2是上述2種調(diào)度方案的運行時間開銷。可以看出,在MPI運行時調(diào)度方案中,節(jié)點2和節(jié)點3因為沒有配備GPU計算資源,所以其上運行的task10、task11必須通過回滾操作在CPU上運行,這大大地增加了運行時間開銷。而采用StreamMAP調(diào)度方案的各個節(jié)點的負載更加均衡,沒有明顯的性能瓶頸。在本文實驗中,采用StreamMAP調(diào)度方案帶來了約26x的整體性能提升。

表2 2種方案運行時間開銷的對比 s
上述所有工作都是由StremMAP系統(tǒng)自動完成的,程序員無需了解底層GPU集群體系結構的細節(jié),降低了集群程序設計者的編程負擔,同時這樣的程序也具有廣泛的可移植性和可擴展性。
本文設計并實現(xiàn)了StreamMAP系統(tǒng),從預編譯和運行時2個層面對現(xiàn)有的集群編程模型hybrid MPI/CUDA進行了改進,使之能夠較好地契合GPU集群體系結構特征。與傳統(tǒng)的hybrid MPI/CUDA編程模型相比,StreamMAP系統(tǒng)有效地降低了集群應用程序的編程復雜度,并保證了程序的可移植性和可擴展性。此外,StreamMAP提供了一個系統(tǒng)性的框架,開發(fā)者可以在此基礎上設計針對于具體集群應用特征的任務劃分方式和分配算法,這也是后續(xù)工作的重點。
[1] Jacobsen D A, Thibault J C, Senocak I. An MPI-CUDA Implementation for Massively Parallel Incompressible Flow Computations on Multi-GPU Clusters[C]//Proc. of the 48th AIAA Aerospace Sciences Meeting and Exhibit. Orlando, USA: [s. n.], 2010: 1065-1072.
[2] 張 繁, 王章野, 姚 建, 等. 應用GPU集群加速計算蛋白質(zhì)分子場[J]. 計算機輔助設計與圖形學學報, 2010, 22(3): 412-419.
[3] 龍桂華, 趙宇波. 三維交錯網(wǎng)格有限差分地震波模擬的GPU集群實現(xiàn)[J]. 地球物理學進展, 2011, 26(6): 1938-1949.
[4] 蘇麗麗. 基于CPU-GPU集群的分子動力學并行計算研 究[D]. 大連: 大連理工大學, 2009.
[5] 朱曉敏, 陸配忠. 異構集群系統(tǒng)中安全關鍵實時應用調(diào)度研究[J]. 計算機學報, 2010, 33(12): 2364-2377.
[6] 陳 勇, 陳國良, 李春生, 等. SMP機群混合編程模型研究[J]. 小型微型計算機系統(tǒng), 2004, 25(10): 1763-1767.
[7] 王惠春, 朱定局, 曹學年, 等. 基于SMP集群的混合并行編程模型研究[J]. 計算機工程, 2009, 35(3): 271-273.
[8] Phillips J C, Stone J E, Schulten K. Adapting a Message- driven Parallel Application to GPU-accelerated Clusters[C]// Proc. of ACM/IEEE Conference on Supercomputing. Piscataway, USA: IEEE Press, 2008: 81-89.
[9] 許彥芹,陳慶奎. 基于SMP集群的MPI+CUDA模型的研究與實現(xiàn)[J]. 計算機工程與設計, 2010, 31(15): 3408-3412.
[10]University of Illinois at Urbana-Champaign. Accelerator Cluster Webpage[EB/OL]. [2013-03-12]. http://iacat.illinois. edu/resources/cluster/.
[11] National Center for Supercomputing Applications. Intel 64 Tesla Linux Cluster Lincoln Webpage[EB/OL]. [2013-03-18]. http://www.ncsa.illinois.edu/UserInfo/Resources/Hardware/Intel64TeslaCluster/.
[12] Message Passing Interface Forum. MPI: A Message-passing Interface Standard[EB/OL]. [2013-02-10]. http://www.mcs.anl. gov/rresearch/projects/mpi/.
[13] OpenACC Forum. OpenACC.1.0.pdf[EB/OL]. [2013-02-20]. http://openacc.org/Downloads.
編輯 任吉慧
Automatic Task Assignment System of General Computing Oriented GPU Cluster
HU Xin-ming, SHENG Chong-chong, LI Jia-jia, WU Bai-feng
(School of Computer Science,Fudan University, Shanghai 201203, China)
MPI+CUDA are the mainstream programming models of current GPU cluster architecture. However, by using such a low level programming model, programmers require detailed knowledge of the underlying architecture, which exerts a heavy burden. Besides, the program is less portability and inefficient. This paper proposes StreamMAP, an automatic task assignment system on GPU clusters. It provides powerful, yet concise language extension suitable to describe the compute resource demands of cluster tasks. It develops a run time system to maintain resource information, and supplies an automatic task assignment for GPU cluster. Experiments show that StreamMAP provides programmability, portability and scalability for GPU cluster application.
GPU cluster; heterogeneous; programming model; task assignment; portability; scalability
1000-3428(2014)03-0103-05
A
N945
胡新明(1989-),男,碩士研究生,主研方向:面向GPU的大規(guī)模并行計算;盛沖沖、李佳佳,碩士研究生;吳百鋒,教授。
2013-02-27
2013-04-18 E-mail:10210240001@fudan.edu.cn
10.3969/j.issn.1000-3428.2014.03.021