高勝寒 熊庭剛
(武漢數字工程研究所 武漢 430205)
近年來,GPU進行通用計算的潛力引起了研究者的注意。由于GPU具有極強的浮點運算能力,通過將GPU引入異構計算系統,可以大幅提高計算系統性能[1]。OpenCL是面向異構系統的并行編程標準和編程環境,它的出現為異構計算提供了一種通用和開放的解決方案[2]。據2018年中國高性能計算機發展現狀分析與展望指出,近年我國采用異構加速體系架構的系統數量逐年增加,但是所用GPU硬件仍然為國外主流廠商所壟斷[3]。所以,在國產GPU硬件上實現OpenCL異構計算編程框架的實現具有相當的研究意義。
在異構計算領域,國外廠商在軟硬件方面均處于領先地位。硬件層面上,圖形處理器(GPU)市場基本上為國外公司所壟斷,AMD、NVIDIA占有了桌面級GPU市場,在嵌入式市場則主要由ARM、Imagination、VIVANTE等占據[4]。在軟件層面,上述國外公司也對如CUDA和OpenCL等一系列異構計算標準提供了支持[5~6]。
當前,盡管已有國內廠商推出了一系列國產GPU,但是其研發重點仍然集中于提高GPU的圖形渲染能力上,在通用計算方向研究較少[7-8]。從目前所知的報道看,大部分國產GPU尚未對OpenCL標準提供支持,異構計算在國產GPU上的研究尚有很大空間。
OpenCL標準中定義了四個抽象模型,即平臺模型、執行模型、內存模型和編程模型[9]。在國產GPU上進行OpenCL的設計和實現,其關鍵在于實現隔離,即操作系統無關性和平臺無關性[10]。本節結合國產GPU的系統結構,定義和設計了兩個隔離層并設計了API解析程序,從而將OpenCL標準的四個模型映射到了國產GPU架構上,實現了模型的匹配。由于國產GPU設計的通用性,OpenCL的各模型都較為便利地在GP201上得到了實現。
3.1.1 國產GPU計算架構
國產GPU采用可拓展的統一渲染架構(Scalable Universal Shader Architecture,SUSA),以流處理器為基本計算單元。其渲染架構如圖1所示。

圖1 GP201的可拓展的統一渲染架構
OpenCL的平臺模型定義了其異構計算平臺的組織方式。OpenCL平臺由兩部分組成,即宿主機(Host)和 OpenCL 設備(compute device)[11]。Open-CL設備內部的計算資源由多個計算單元(compute unit)組成,每個計算單元內部則有處理單元(processing element)。
國產GPU在OpenCL平臺模型中作為OpenCL設備存在,其內部具有多個Cluster即對應模型中的處理單元,每個處理單元內部則以流處理器作為基本處理單元。基于此,國產GPU計算架構實現了與OpenCL的抽象平臺模型的匹配。
方位意義是“東西”的初始意義,隨著時間的推移,整個語言系統的變化,“東西”也衍生出了其他的意義。“東西”可泛指各種具體的或者抽象的事物,也可指代人。我們常說“買東西”、“賣東西”,對于“東西”的“貨物”這一意義的起源,或源于東漢時期,初時只表示貨賣的物品。彼時洛陽為“東京”,長安為“西京”,到洛陽購貨為“買東”,到長安購貨為“買西”,在《木蘭詩》中亦有“東市買駿馬,西市買鞍韉”,于是“東西”逐漸用來指代貨物。再后來,其指代的范圍擴大,不再局限于貨賣的物品,而是用來指代各種具體的和抽閑的事物。不過,“東西”用來指代各種具體或抽象的事物的現象,宋時始見,直到明清時期才尤為廣泛。
如圖2所示,在執行任務時,主機將各命令塊以多指令多數據流(MIMD)模式分別下發至設備,命令在設備中以單指令多數據流模式(SIMD)分配到流處理器中,流處理器作為最小的運算單元采用單指令多線程模式(SIMT)對數據執行操作。
國產GPU采用多核多線程調度與管理機制,即使用多指令多數據流(MIMD)、單指令多數據流(SIMD)、單指令多線程(SIMT)三模式相結合,實現了軟硬件協調的動態負載均衡、數據阻塞檢測與控制等技術。其指令處理流程如圖2所示。

圖2 GP201指令處理流程
3.1.2 國產GPU指令處理流程
[7] Aileen San Pablo-Baviera, “Security Challenges of the Philippine Archipelago”, Southeast Asian Affairs, Institute of Southeast Asian Studies, Singapore, 1998, p. 219.
OpenCL標準定義了兩種不同的編程模型:任務并行和數據并行。通過上述調度與管理機制,實現了國產GPU與OpenCL編程模型的匹配,充分利用了國產GPU的計算資源。
3.1.3 國產GPU存儲體系
5)Constant memory(常量存儲器):對應于常量內存。
GPU需要進行大量的數據搬移工作,這就對顯存的帶寬、數據讀取速度提出了更高的要求。因此,存儲管理單元已經成為現代GPU設計的關鍵之一。國產GPU設計了一套多級存儲系統,以此提高了系統中信息存儲和傳遞效率。
OpenCL標準定義了抽象的內存模型[12],國產GPU由驅動完成了具體向硬件上的映射。國產GPU多級存儲器模型和OpenCL存儲模型映射關系如下。
1.2.3 健康對照組納入標準 (1)年齡20~70歲,(2)最佳矯正視力≥1.0,(3)屈光度≤ ±6D、柱鏡≤±2D,(4)Goldmann壓平眼壓測量值小于21 mm Hg,(5)視乳頭及黃斑區結構正常(眼底鏡檢查),(6)無眼科疾病史,(8)無眼科手術史。
1)Register(寄存器);
國產GPU驅動程序為各主流圖形API提供了支持,目前實現了對OpenCL 1.2標準的支持。在國產GPU上,OpenCL應用通過調用OpenCL中間庫,向不同的操作系統提供了不同的底層庫調用接口,并在底層庫中實現了基于OpenCL執行模型的一系列API操作。未來,通過對OpenCL API解析函數的補充和更新,國產GPU對于更高版本的OpenCL標準的支持也是可以實現的。
3)Shared memory(共享存儲器):對應于局部內存;
4)Global memory(全局存儲器):對應于全局內存;
“我們把盆往床邊放來試試看好不好?”(我動手去幫忙移盆了,因為在對話過程中我發現他對“邊”還沒有概念,他對上下有概念了,在搭腳手架過程中我發現他對 “邊”沒有概念。)“好了,圖圖現在站上盆,看看能不能爬上床了?”(站上去,一下子就爬到床上了,特別開心。)
從圖1可以看出,鋰離子電池在離線后,其端電壓會經歷一個跳變,圖中A點到B點的變化,然后在脫離負載的情況下經過一段時間緩慢恢復至一個穩定的電壓值——開路電壓OCV。上述過程中B點的電壓值我們稱為回跳電壓,并記為Ut。
如前所述,我們可以把那個一般意義上的啟蒙看作是一個過程,是個體逐漸學會主動運用自身理性進行批判性思考的過程,這就從兩個層面決定了啟蒙要面對并接受種種反啟蒙,啟蒙要在種種反啟蒙的鞭撻下不斷地自我完善從而走向那個一般意義上的啟蒙。
OpenCL是一個完整的并行編程框架,為Open-CL開發人員提供了硬件抽象層API和面向內核的異構編程環境,便于開發者更方便地開發和優化他們的應用。國產GPU上的OpenCL框架如圖3所示。
如圖3所示,為了使得設計代碼具有良好的可移植性,國產GPU上的OpenCL實現采用了硬件適配層(HAL)、操作系統適配層(OSL)和庫函數實現層三層結構。

圖3 基于國產GPU的OpenCL框架
作為OpenCL設計與實現的重要組成部分,驅動程序中的HAL層和OSL層分別實現了硬件和操作系統的隔離。在具體應用實現過程中,OpenCL API的解析程序并不直接與硬件和操作系統交互,而是通過HAL層和OSL層實現該操作,從而屏蔽了不同硬件和操作系統的差異,實現了硬件和操作系統的無關性。
2)Local memory(本地存儲器):對應于私有內存;
由于快速傅里葉變換需要進行大量的并行運算操作,使其較為適合評估設備運算性能。為測試并展示GP201的計算性能及在其之上設計與實現的OpenCL執行效率,本文基于快速傅里葉算法,以OpenCL編程語言設計了快速傅里葉變換程序[13]。本文基于蝶形算法進行了序列長度為16~65536的多組測試,比較了該應用程序在GP201原型和商用顯卡上的運算表現,對國產GPU上OpenCL設計效果進行了評估。
改進后的DEA模型結果表明鄭州市創新型城市的效率變動呈現下降趨勢,其效率評價指數從2011年的0.75降至2016年的0.44,期間在2014年效率水平略有回升。可見,盡管鄭州市在樣本期間整體處于最優規模階段且實現了DEA有效,但其核心創新能力的輕微弱化現象必須予以高度關注。
Cooley-Tukey算法也稱為蝶形算法[14],于1965年由J.W.庫利和T.W.圖基最先提出,是各快速傅里葉變換算法中最常見的一種,也是通常所說的FFT算法所指的算法。一個N點序列的離散傅里葉變換公式如下式所示。
(2)將“無障礙網絡課程”打造成特色。目前國內所有殘障人士幾乎都是在專門的學校接受教育。但是這種教育并不是終身的,而無障礙網絡課程則使他們能夠繼續學習。因此,應該將無障礙網絡課程打造成特色,一方面可以滿足障礙人士終身學習的需求,另一方面還可以利用網絡課程給他們頒發相應的證書。
“南海核心利益說”距其提出已經整整8年。追根溯源,引發該說的是《中國軍隊尋求拓展海軍實力》這篇文章。此后,關于該說的研究及其影響大體都在該文的框架之內。就這篇文章而言,“南海核心利益說”不過是一個具體的論據;但就此后該說的影響而言,該文不過是為該說提供的一個國際趨勢分析框架。因此,對該說的思考宜以這篇文章的框架為基礎,以前后事實發展為依據,同時就該話題的“政治性”以及同國際關系理論的關系進行探討。

在國產GP201上運行的快速傅里葉變換程序的程序流程如下。
OpenCL模型中的宿主機內存不在國產GPU內部,該內存取決于組成異構計算體系時的主機設備。通過上述映射關系,國產GPU完成了對Open-CL標準中內存模型的匹配。
1)查詢平臺上OpenCL設備數量,并儲存設備信息,若找不到則結束程序。
2)由設備類型創建一個上下文,獲取設備信息并選擇運算所使用的具體設備。打印設備相關信息,主要是其compute units數量。
3)創建命令隊列,然后開始進行主要的設備運算階段。
實習基地單位老師負責考評學生的出勤率、實習態度、溝通能力和業務能力。校方指導老師負責考評學生的實習記錄和實習報告。雙方評分權重各占一半,最后得分為綜合得分。
4)統計程序運行時間以便后續分析。清理內存空間,結束程序。
異構計算平臺由主機端和設備端構成,本文中主機端為基于X86架構的CPU電腦主機,設備端為搭載了GP201原型的FPGA加速板卡,該原型為GP201的1∕64裁剪子集,核心頻率為0.5MHz。本文采用的商用顯卡為AMD公司生產的AMD Radeon HD7450M,其核心頻率為700MHz。本文使用的主機端的操作系統是Linux操作系統,版本為Ubuntu 12.04,主機程序使用的編譯軟件是Linux系統下的GNU編譯器套件GCC4.8.2。
在GP201原型上和商用顯卡上分別執行應用程序,測試結果如表1所示。

表1 原型快速傅里葉變換運算用時
本文采用的FPGA上搭載的邏輯為GP201的1∕64裁剪子集,運算單元數較少,且其核心運算頻率較低,約為0.5MHz。盡管如此,該裁剪子集仍然表現出來不俗的計算速度。依據當前設計,GP201目標產品的主頻將達到1GHz以上,運算單元個數為原型64倍。為便于計算比對,本文取GP201頻率為1000MHz。依據上述參數,結合GP201原型系統運行時間數據,本文對GP201運算速度進行了預測,并將其與商用顯卡運行時間進行比較,數據如表2所示。

表2 GP201快速傅里葉變換運算用時
從表中我們可以看出,本文中所實現基于GP201原型的加速方案運算速度相當優秀。在FFT序列較短時尤其明顯,在序列較長的運算中依然優于商用顯卡。以此可以預見,GP201的實際產品性能將可達到更高水準。相應地也表明所設計與實現的基于國產GPU的OpenCL異構計算架構具有較高的性能。
如今,GPU已經被廣泛運用于異構計算體系之中。在國產GPU上實現OpenCL異構計算標準的應用,可以充分發揮其運算能力,拓寬國產GPU的應用面。本文通過實驗,驗證了國產GPU上Open-CL的設計與實現的效果。通過數學計算,將GP201的運算結果與商用顯卡的運算結果進行比較。結果表明,基于國產GPU的OpenCL異構計算應用運行正常,OpenCL各結構層次運行正常,國產GPU作為異構計算組件性能良好,較好地發揮出了硬件的能力,基于國產GPU的OpenCL的設計與實現是較為成功的,國產GPU在異構計算領域前景十分光明。