




摘 要: 復雜應用領域中的一些具體計算任務不僅需要計算平臺具備高效的計算能力,而且也應具有與計算任務特點相匹配的計算模式。依據NVIDIA Kepler GK110架構中Hyper?Q特性與CUDA流的關系,提出單任務并行、多任務并行與多任務流式計算三種計算模式。采用空位標記的方法對計算模式進行構建與切換,結合數據緩沖機制和計算任務加載方式,設計了眾核多計算模式處理系統,實現了眾核處理機多模式計算的功能。
關鍵詞: 眾核處理機; Kepler GK110; 計算模式; CUDA流
中圖分類號: TN911?34; TP302 文獻標識碼: A 文章編號: 1004?373X(2013)22?0001?04
0 引 言
在航空航天、醫療服務、地質勘探等復雜應用領域,需要處理的數據量急劇增大,需要高性能的實時計算能力提供支撐。與多核處理器相比,眾核處理器計算資源密度更高、片上通信開銷顯著降低、性能/功耗比明顯提高,可為實時系統提供強大的計算能力。
在復雜應用領域當中,不同應用場景對計算的需求可能不同。例如,移動機器人在作業時,可能需要同時執行路徑規劃、目標識別等多個任務,這些任務需要同時執行;在對遙感圖像處理時,需要對圖像數據進行配準、融合、重構、特征提取等多個步驟,這些步驟間既需要同時執行,又存在前驅后繼的關系。因此,基于眾核處理器進行計算模式的動態構造,以適應不同的應用場景和應用任務成為一種新的研究方向。文獻[1]研究了具有邏輯核構造能力的眾核處理器體系結構,其基本思想是基于多個細粒度處理器核構建成粗粒度邏輯核,將不斷增加的處理器核轉化為單線程串行應用的性能提升。文獻[2]提出并驗證了一種基于類數據流驅動模型的可重構眾核處理器結構,實現了邏輯核處理器的運行時可重構機制。文獻[3] 提出了一種支持核資源動態分組的自適應調度算法,通過對任務簇的拆分與合并,動態構建可彈性分區的核邏輯組,實現核資源的隔離優化訪問。
GPGPU(General?Purpose Computing on Graphics Processing Units)作為一種典型的眾核處理器,有關研究多面向單任務并發執行[4?5]方面的優化以及應用算法[6?8]的加速。本文以GPGPU為平臺,通過研究和設計,構建了單任務并行、多任務并行和多任務流式處理的多計算模式處理系統。
1 眾核處理機
1.1 眾核處理機結構
眾核處理機是基于眾核控制單元(MPU)與眾核處理器(GPGPU)相結合的主、協處理方式構建而成,其邏輯結構如圖1所示。眾核處理機由眾核控制單元和眾核計算單元兩部分組成,其中眾核控制單元采用X86結構的MPU,與眾核計算單元之間通過PCI?E總線進行互連。
1.2 CUDA流與Hyper?Q
在統一計算設備架構(Compute Unified Device Architecture,CUDA)編程模型中,CUDA流(CUDA Stream)表示GPU的一個操作隊列,通過CUDA流來管理任務和并行[9]。CUDA流的使用分為兩種:一種是CUDA在創建上下文時會隱式地創建一個CUDA流,從而命令可以在設備中排隊等待執行;另一種是在編程時,在執行配置中顯式地指定CUDA流。不管以何種方式使用CUDA流,所有的操作在CUDA流中都是按照先后順序排隊執行,然后每個操作按其進入隊列的順序離開隊列。換言之,隊列充當了一個FIFO(先入先出)緩沖區,操作按照它們在設備中的出現順序離開隊列。
在GPU中,有一個CUDA工作調度器(CUDA Work Distributor,CWD)的硬件單元,專門負責將計算工作分發到不同的流處理器中。在Fermi架構[10]中,雖然支持16個內核的同時啟動,但由于只有一個硬件工作隊列用來連接主機端CPU和設備端GPU,造成并發的多個CUDA流中的任務在執行時必須復用同一硬件工作隊列,產生了虛假的流內依賴關系,必須等待同一CUDA流中相互依賴的kernel執行結束,另一CUDA流中的kernel才能開始執行。而在Kepler GK110架構[11]中,新具有的Hyper?Q特性消除了只有單一硬件工作隊列的限制,增加了硬件工作隊列的數量,因此,在CUDA流的數目不超過硬件工作隊列數目的前提下,允許每個CUDA流獨占一個硬件工作隊列,CUDA流內的操作不再阻塞其他CUDA流的操作,多個CUDA流能夠并行執行。
如圖2所示,當利用Hyper?Q和CUDA流一起工作時,虛線上方顯示為Fermi模式,流1、流2、流3復用一個硬件工作隊列,而虛線下方為Kepler Hyper?Q模式,允許每個流使用單獨的硬件工作隊列同時執行。
2 眾核多計算模式處理框架
為了充分發揮眾核處理器的計算能力,眾核處理系統面對不同的計算任務的特點,可構建三種計算模式,即單任務并行計算、多任務并行計算、多任務流式計算。
2.1 眾核多計算模式處理系統結構
眾核多計算模式處理系統結構如圖3所示。眾核處理系統包括數據通信、任務管理、形態管理、資源管理和控制監聽模塊。
數據通信模塊:提供接口給主控機,負責接收從主控機發送來的任務命令和任務計算所需的任務數據,并且最終將眾核處理機運算完成的計算結果通過該模塊返回給主控機。
控制監聽模塊:在眾核處理系統運行時,實時獲取主控機發送給眾核處理機的任務命令,將其傳送給任務管理模塊,并接收任務管理模塊返回的任務命令執行結果。
任務管理模塊:負責計算任務的加載過程,將控制監聽模塊發送來的任務命令存于任務隊列,當眾核計算單元需要加載任務進行計算時,從任務隊列中獲取任務命令,根據任務命令從任務配置文件中獲取任務計算所需的任務信息,該任務信息包含了計算任務運行時所需的存儲空間大小、適合于該任務的計算模式、執行函數(即CUDA中的kernel函數)等內容,在計算任務在被加載前,需要通知形態管理模塊把眾核計算單元切換到指定的計算模式下,并通知資源管理模塊分配存儲空間,通過數據通信模塊獲取任務數據,然后讀取任務計算庫,加載執行函數進行計算。
形態管理模塊:接收任務管理模塊發送來的目標計算模式,切換到該種計算模式。
資源管理模塊:根據任務管理模塊發送的參數分配存儲空間,包括眾核控制單元的存儲空間和眾核計算單元的存儲空間,眾核控制單元的存儲空間用于對任務數據進行緩存,然后通過數據傳輸的API接口把緩存在眾核控制單元的數據傳送到眾核計算單元的存儲空間,在計算時由從眾核計算單元存儲空間加載數據進行計算。
2.2 計算模式構建與切換
計算模式構建是形態管理模塊根據接收到的命令動態構建出被指定的目的計算模式的過程。眾核處理系統在初始化時,就已經創建了指定數目的CUDA流(CUDA流的最大數目取決于GPU中硬件工作隊列的數目),并采用空位標記法對創建的CUDA流進行管理,通過標記位的有效性描述CUDA流的可用性。當目的計算模式為單任務計算時,只需將首位的CUDA流標記設置為有效,其他全部標記為無效,在對計算任務加載時,將計算任務放入該CUDA流中進行計算;當目的計算模式為多任務計算時,需要將指定數目CUDA流的標記位設置為有效,在對計算任務加載時,通過輪詢的方式將計算任務放入到相應的CUDA流中,利用CUDA流的Hyper?Q特性,同時加載多個計算任務到眾核計算單元;當目的計算模式為多任務流式計算時,需要將指定CUDA流的標記設置為有效,從構建第一個計算步開始,將第一個計算步放入第一個CUDA流中進行計算,當第一個計算步首次完成計算后,利用二元信號量通知眾核控制單元中的任務管理模塊開始構建第二個計算步,并重新構建第一個計算步,以此類推,完成對多任務流式計算中每個計算步的動態構建過程。
計算模式的切換是當眾核計算單元的當前計算模式與計算任務執行需要的計算模式(即目的計算模式)不匹配時,需要對眾核計算單元的計算模式進行切換,以適應計算模式變化的需求。
在從任務配置文件中獲取適應于計算任務執行的目的計算模式后,首先與當前計算模式進行比較,若匹配成功則不需要進行計算模式的切換;若匹配失敗則進一步判斷眾核在當前計算模式下是否空閑,如處于忙碌狀態則需要等待,對于不同優先級的任務設有不同的等待時限,以保證對計算任務的及時響應,當大于這一時限時強制結束正在運行的任務以釋放計算資源,從而構建新的計算模式,完成計算模的切換過程,流程圖如圖4所示。
2.3 共享內存緩沖技術
眾核計算單元在對主控機請求的計算任務加載前,必須獲取來自主控機的任務數據,為了實現對任務數據的接收和發送,需要建立相應的數據緩沖區。傳統的方法是采用消息隊列和基于共享內存信號燈的方式來建立和管理數據緩沖區,但當數據的寫入和讀取速度差別較大時,容易造成數據緩沖區的阻塞。因此采用一種可滑動動態共享內存緩沖技術[12],如圖5所示。
在眾核控制單元的存儲空間中申請存儲空間作為存放數據的緩沖池,按需要建立指定數量的單向指針鏈表,每個指針鏈表代表一個數據緩沖區,在眾核處理系統的計算模式切換時,可根據并行任務數目的變化修改指針鏈表的節點數,使每個數據緩沖區占用的存儲空間按需滑動,以提高整個數據緩池數據的傳遞效率。
2.4 計算庫動態加載
在對計算任務的執行函數進行加載時,采用動態共享庫的方式,因為動態鏈接的共享庫具有動態加載、封裝實現、節省內存等優點,可以把眾核計算單元的執行函數與邏輯控制程序相隔離,降低了眾核計算與邏輯控制的耦合度,增加了可擴展性和靈活性。
在動態加載計算庫前,需要將執行函數編譯生成動態共享庫,進而在程序中進行顯示調用。當調用時使用動態加載API,該過程首先調用dlopen以打開指定名字的動態共享庫,并獲得共享對象的句柄;而后通過調用dlsym,根據動態共享庫操作句柄與符號獲取該符號對應的函數的執行代碼地址;在取得執行代碼地址后,就可以根據共享庫提供的接口調用與計算任務對應的執行函數,將執行函數發射到眾核計算單元,由眾核計算單元根據執行函數的配置參數組織計算資源進行計算;當不會再調用共享對象時調用dlclose關閉指定句柄的動態共享庫。
3 結 語
針對復雜應用領域計算任務對多種計算模式的需求,本文研究了眾核處理機結構,根據NVIDIA Kepler GK110架構中Hyper?Q與CUDA流的特性,構建了可單任務并行計算、多任務并行計算、多任務流式計算間動態切換的眾核多計算模式系統,能夠提高實時計算平臺的靈活性,以適應不同的任務計算需求。下一步的研究方向是挖掘GPU中硬件工作鏈路與SM(Streaming Multiprocessor)間的映射機制。
參考文獻
[1] 任永青.邏輯核動態可重構的眾核處理器體系結構[D].合肥:中國科學技術大學,2010.
[2] 許牧.可重構眾核流處理器體系結構關鍵技術研究[D].合肥:中國科學技術大學,2012.
[3] 曹仰杰,錢德沛,伍衛國,等.眾核處理器系統核資源動態分組的自適應調度算法[J].軟件學報,2012(2):240?252.
[4] 肖漢,肖波,馮娜,等.基于CUDA的細粒度并行計算模型研究[J].計算機與數字工程,2013(5):801?804.
[5] 宋曉麗,王慶.基于GPGPU的數字圖像并行化預處理[J].計算機測量與控制,2009(6):1169?1171.
[6] 鄧志權.基于GPGPU的實時高質量光線投射算法研究[D].廣州:華南理工大學,2012.
[7] 顧青,高能,包珍珍,等.基于GPGPU和CUDA的高速AES算法的實現和優化[J].中國科學院研究生院學報,2011(6):776?785.
[8] 李玉峰,吳蔚,王愷,等.基于GPGPU的JPEG2000圖像壓縮方法[J].電子器件,2013(2):163?168.
[9] FARBER Rob.高性能CUDA應用設計與開發:方法與最佳實踐[M].玉龍,唐堃,譯.北京:機械工業出版社,2013.
[10] NVIDIA Corparation. NVIDIA’s next generation CUDA compute architecture: fermi [R]. San Jose: NVIDIA Corparation, 2009.
[11] NVIDIA Corparation. NVIDIA’s next generation CUDA compute architecture: Kepler GK110 [R]. San Jose: NVIDIA Corparation, 2012.
[12] 余翔湛,殷麗華.動態共享內存緩沖池技術[J].哈爾濱工業大學學報,2004(3):380?383.
[13] 章劍,仰楓帆.一種基于異構系統的H.264/AVC運動估計算法[J].電子科技,2012(10):106?108.