高勝寒 熊庭剛
(武漢數(shù)字工程研究所 武漢 430205)
近年來,GPU進行通用計算的潛力引起了研究者的注意。由于GPU具有極強的浮點運算能力,通過將GPU引入異構(gòu)計算系統(tǒng),可以大幅提高計算系統(tǒng)性能[1]。OpenCL是面向異構(gòu)系統(tǒng)的并行編程標準和編程環(huán)境,它的出現(xiàn)為異構(gòu)計算提供了一種通用和開放的解決方案[2]。據(jù)2018年中國高性能計算機發(fā)展現(xiàn)狀分析與展望指出,近年我國采用異構(gòu)加速體系架構(gòu)的系統(tǒng)數(shù)量逐年增加,但是所用GPU硬件仍然為國外主流廠商所壟斷[3]。所以,在國產(chǎn)GPU硬件上實現(xiàn)OpenCL異構(gòu)計算編程框架的實現(xiàn)具有相當?shù)难芯恳饬x。
在異構(gòu)計算領(lǐng)域,國外廠商在軟硬件方面均處于領(lǐng)先地位。硬件層面上,圖形處理器(GPU)市場基本上為國外公司所壟斷,AMD、NVIDIA占有了桌面級GPU市場,在嵌入式市場則主要由ARM、Imagination、VIVANTE等占據(jù)[4]。在軟件層面,上述國外公司也對如CUDA和OpenCL等一系列異構(gòu)計算標準提供了支持[5~6]。
當前,盡管已有國內(nèi)廠商推出了一系列國產(chǎn)GPU,但是其研發(fā)重點仍然集中于提高GPU的圖形渲染能力上,在通用計算方向研究較少[7-8]。從目前所知的報道看,大部分國產(chǎn)GPU尚未對OpenCL標準提供支持,異構(gòu)計算在國產(chǎn)GPU上的研究尚有很大空間。
OpenCL標準中定義了四個抽象模型,即平臺模型、執(zhí)行模型、內(nèi)存模型和編程模型[9]。在國產(chǎn)GPU上進行OpenCL的設(shè)計和實現(xiàn),其關(guān)鍵在于實現(xiàn)隔離,即操作系統(tǒng)無關(guān)性和平臺無關(guān)性[10]。本節(jié)結(jié)合國產(chǎn)GPU的系統(tǒng)結(jié)構(gòu),定義和設(shè)計了兩個隔離層并設(shè)計了API解析程序,從而將OpenCL標準的四個模型映射到了國產(chǎn)GPU架構(gòu)上,實現(xiàn)了模型的匹配。由于國產(chǎn)GPU設(shè)計的通用性,OpenCL的各模型都較為便利地在GP201上得到了實現(xiàn)。
3.1.1 國產(chǎn)GPU計算架構(gòu)
國產(chǎn)GPU采用可拓展的統(tǒng)一渲染架構(gòu)(Scalable Universal Shader Architecture,SUSA),以流處理器為基本計算單元。其渲染架構(gòu)如圖1所示。
圖1 GP201的可拓展的統(tǒng)一渲染架構(gòu)
OpenCL的平臺模型定義了其異構(gòu)計算平臺的組織方式。OpenCL平臺由兩部分組成,即宿主機(Host)和 OpenCL 設(shè)備(compute device)[11]。Open-CL設(shè)備內(nèi)部的計算資源由多個計算單元(compute unit)組成,每個計算單元內(nèi)部則有處理單元(processing element)。
國產(chǎn)GPU在OpenCL平臺模型中作為OpenCL設(shè)備存在,其內(nèi)部具有多個Cluster即對應(yīng)模型中的處理單元,每個處理單元內(nèi)部則以流處理器作為基本處理單元?;诖?,國產(chǎn)GPU計算架構(gòu)實現(xiàn)了與OpenCL的抽象平臺模型的匹配。
方位意義是“東西”的初始意義,隨著時間的推移,整個語言系統(tǒng)的變化,“東西”也衍生出了其他的意義?!皷|西”可泛指各種具體的或者抽象的事物,也可指代人。我們常說“買東西”、“賣東西”,對于“東西”的“貨物”這一意義的起源,或源于東漢時期,初時只表示貨賣的物品。彼時洛陽為“東京”,長安為“西京”,到洛陽購貨為“買東”,到長安購貨為“買西”,在《木蘭詩》中亦有“東市買駿馬,西市買鞍韉”,于是“東西”逐漸用來指代貨物。再后來,其指代的范圍擴大,不再局限于貨賣的物品,而是用來指代各種具體的和抽閑的事物。不過,“東西”用來指代各種具體或抽象的事物的現(xiàn)象,宋時始見,直到明清時期才尤為廣泛。
如圖2所示,在執(zhí)行任務(wù)時,主機將各命令塊以多指令多數(shù)據(jù)流(MIMD)模式分別下發(fā)至設(shè)備,命令在設(shè)備中以單指令多數(shù)據(jù)流模式(SIMD)分配到流處理器中,流處理器作為最小的運算單元采用單指令多線程模式(SIMT)對數(shù)據(jù)執(zhí)行操作。
國產(chǎn)GPU采用多核多線程調(diào)度與管理機制,即使用多指令多數(shù)據(jù)流(MIMD)、單指令多數(shù)據(jù)流(SIMD)、單指令多線程(SIMT)三模式相結(jié)合,實現(xiàn)了軟硬件協(xié)調(diào)的動態(tài)負載均衡、數(shù)據(jù)阻塞檢測與控制等技術(shù)。其指令處理流程如圖2所示。
圖2 GP201指令處理流程
3.1.2 國產(chǎn)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標準定義了兩種不同的編程模型:任務(wù)并行和數(shù)據(jù)并行。通過上述調(diào)度與管理機制,實現(xiàn)了國產(chǎn)GPU與OpenCL編程模型的匹配,充分利用了國產(chǎn)GPU的計算資源。
3.1.3 國產(chǎn)GPU存儲體系
5)Constant memory(常量存儲器):對應(yīng)于常量內(nèi)存。
GPU需要進行大量的數(shù)據(jù)搬移工作,這就對顯存的帶寬、數(shù)據(jù)讀取速度提出了更高的要求。因此,存儲管理單元已經(jīng)成為現(xiàn)代GPU設(shè)計的關(guān)鍵之一。國產(chǎn)GPU設(shè)計了一套多級存儲系統(tǒng),以此提高了系統(tǒng)中信息存儲和傳遞效率。
OpenCL標準定義了抽象的內(nèi)存模型[12],國產(chǎn)GPU由驅(qū)動完成了具體向硬件上的映射。國產(chǎn)GPU多級存儲器模型和OpenCL存儲模型映射關(guān)系如下。
1.2.3 健康對照組納入標準 (1)年齡20~70歲,(2)最佳矯正視力≥1.0,(3)屈光度≤ ±6D、柱鏡≤±2D,(4)Goldmann壓平眼壓測量值小于21 mm Hg,(5)視乳頭及黃斑區(qū)結(jié)構(gòu)正常(眼底鏡檢查),(6)無眼科疾病史,(8)無眼科手術(shù)史。
1)Register(寄存器);
國產(chǎn)GPU驅(qū)動程序為各主流圖形API提供了支持,目前實現(xiàn)了對OpenCL 1.2標準的支持。在國產(chǎn)GPU上,OpenCL應(yīng)用通過調(diào)用OpenCL中間庫,向不同的操作系統(tǒng)提供了不同的底層庫調(diào)用接口,并在底層庫中實現(xiàn)了基于OpenCL執(zhí)行模型的一系列API操作。未來,通過對OpenCL API解析函數(shù)的補充和更新,國產(chǎn)GPU對于更高版本的OpenCL標準的支持也是可以實現(xiàn)的。
3)Shared memory(共享存儲器):對應(yīng)于局部內(nèi)存;
4)Global memory(全局存儲器):對應(yīng)于全局內(nèi)存;
“我們把盆往床邊放來試試看好不好?”(我動手去幫忙移盆了,因為在對話過程中我發(fā)現(xiàn)他對“邊”還沒有概念,他對上下有概念了,在搭腳手架過程中我發(fā)現(xiàn)他對 “邊”沒有概念。)“好了,圖圖現(xiàn)在站上盆,看看能不能爬上床了?”(站上去,一下子就爬到床上了,特別開心。)
從圖1可以看出,鋰離子電池在離線后,其端電壓會經(jīng)歷一個跳變,圖中A點到B點的變化,然后在脫離負載的情況下經(jīng)過一段時間緩慢恢復(fù)至一個穩(wěn)定的電壓值——開路電壓OCV。上述過程中B點的電壓值我們稱為回跳電壓,并記為Ut。
如前所述,我們可以把那個一般意義上的啟蒙看作是一個過程,是個體逐漸學(xué)會主動運用自身理性進行批判性思考的過程,這就從兩個層面決定了啟蒙要面對并接受種種反啟蒙,啟蒙要在種種反啟蒙的鞭撻下不斷地自我完善從而走向那個一般意義上的啟蒙。
OpenCL是一個完整的并行編程框架,為Open-CL開發(fā)人員提供了硬件抽象層API和面向內(nèi)核的異構(gòu)編程環(huán)境,便于開發(fā)者更方便地開發(fā)和優(yōu)化他們的應(yīng)用。國產(chǎn)GPU上的OpenCL框架如圖3所示。
如圖3所示,為了使得設(shè)計代碼具有良好的可移植性,國產(chǎn)GPU上的OpenCL實現(xiàn)采用了硬件適配層(HAL)、操作系統(tǒng)適配層(OSL)和庫函數(shù)實現(xiàn)層三層結(jié)構(gòu)。
圖3 基于國產(chǎn)GPU的OpenCL框架
作為OpenCL設(shè)計與實現(xiàn)的重要組成部分,驅(qū)動程序中的HAL層和OSL層分別實現(xiàn)了硬件和操作系統(tǒng)的隔離。在具體應(yīng)用實現(xiàn)過程中,OpenCL API的解析程序并不直接與硬件和操作系統(tǒng)交互,而是通過HAL層和OSL層實現(xiàn)該操作,從而屏蔽了不同硬件和操作系統(tǒng)的差異,實現(xiàn)了硬件和操作系統(tǒng)的無關(guān)性。
2)Local memory(本地存儲器):對應(yīng)于私有內(nèi)存;
由于快速傅里葉變換需要進行大量的并行運算操作,使其較為適合評估設(shè)備運算性能。為測試并展示GP201的計算性能及在其之上設(shè)計與實現(xiàn)的OpenCL執(zhí)行效率,本文基于快速傅里葉算法,以O(shè)penCL編程語言設(shè)計了快速傅里葉變換程序[13]。本文基于蝶形算法進行了序列長度為16~65536的多組測試,比較了該應(yīng)用程序在GP201原型和商用顯卡上的運算表現(xiàn),對國產(chǎn)GPU上OpenCL設(shè)計效果進行了評估。
改進后的DEA模型結(jié)果表明鄭州市創(chuàng)新型城市的效率變動呈現(xiàn)下降趨勢,其效率評價指數(shù)從2011年的0.75降至2016年的0.44,期間在2014年效率水平略有回升。可見,盡管鄭州市在樣本期間整體處于最優(yōu)規(guī)模階段且實現(xiàn)了DEA有效,但其核心創(chuàng)新能力的輕微弱化現(xiàn)象必須予以高度關(guān)注。
Cooley-Tukey算法也稱為蝶形算法[14],于1965年由J.W.庫利和T.W.圖基最先提出,是各快速傅里葉變換算法中最常見的一種,也是通常所說的FFT算法所指的算法。一個N點序列的離散傅里葉變換公式如下式所示。
(2)將“無障礙網(wǎng)絡(luò)課程”打造成特色。目前國內(nèi)所有殘障人士幾乎都是在專門的學(xué)校接受教育。但是這種教育并不是終身的,而無障礙網(wǎng)絡(luò)課程則使他們能夠繼續(xù)學(xué)習(xí)。因此,應(yīng)該將無障礙網(wǎng)絡(luò)課程打造成特色,一方面可以滿足障礙人士終身學(xué)習(xí)的需求,另一方面還可以利用網(wǎng)絡(luò)課程給他們頒發(fā)相應(yīng)的證書。
“南海核心利益說”距其提出已經(jīng)整整8年。追根溯源,引發(fā)該說的是《中國軍隊尋求拓展海軍實力》這篇文章。此后,關(guān)于該說的研究及其影響大體都在該文的框架之內(nèi)。就這篇文章而言,“南海核心利益說”不過是一個具體的論據(jù);但就此后該說的影響而言,該文不過是為該說提供的一個國際趨勢分析框架。因此,對該說的思考宜以這篇文章的框架為基礎(chǔ),以前后事實發(fā)展為依據(jù),同時就該話題的“政治性”以及同國際關(guān)系理論的關(guān)系進行探討。
在國產(chǎn)GP201上運行的快速傅里葉變換程序的程序流程如下。
OpenCL模型中的宿主機內(nèi)存不在國產(chǎn)GPU內(nèi)部,該內(nèi)存取決于組成異構(gòu)計算體系時的主機設(shè)備。通過上述映射關(guān)系,國產(chǎn)GPU完成了對Open-CL標準中內(nèi)存模型的匹配。
1)查詢平臺上OpenCL設(shè)備數(shù)量,并儲存設(shè)備信息,若找不到則結(jié)束程序。
2)由設(shè)備類型創(chuàng)建一個上下文,獲取設(shè)備信息并選擇運算所使用的具體設(shè)備。打印設(shè)備相關(guān)信息,主要是其compute units數(shù)量。
3)創(chuàng)建命令隊列,然后開始進行主要的設(shè)備運算階段。
實習(xí)基地單位老師負責考評學(xué)生的出勤率、實習(xí)態(tài)度、溝通能力和業(yè)務(wù)能力。校方指導(dǎo)老師負責考評學(xué)生的實習(xí)記錄和實習(xí)報告。雙方評分權(quán)重各占一半,最后得分為綜合得分。
4)統(tǒng)計程序運行時間以便后續(xù)分析。清理內(nèi)存空間,結(jié)束程序。
異構(gòu)計算平臺由主機端和設(shè)備端構(gòu)成,本文中主機端為基于X86架構(gòu)的CPU電腦主機,設(shè)備端為搭載了GP201原型的FPGA加速板卡,該原型為GP201的1∕64裁剪子集,核心頻率為0.5MHz。本文采用的商用顯卡為AMD公司生產(chǎn)的AMD Radeon HD7450M,其核心頻率為700MHz。本文使用的主機端的操作系統(tǒng)是Linux操作系統(tǒng),版本為Ubuntu 12.04,主機程序使用的編譯軟件是Linux系統(tǒng)下的GNU編譯器套件GCC4.8.2。
在GP201原型上和商用顯卡上分別執(zhí)行應(yīng)用程序,測試結(jié)果如表1所示。
表1 原型快速傅里葉變換運算用時
本文采用的FPGA上搭載的邏輯為GP201的1∕64裁剪子集,運算單元數(shù)較少,且其核心運算頻率較低,約為0.5MHz。盡管如此,該裁剪子集仍然表現(xiàn)出來不俗的計算速度。依據(jù)當前設(shè)計,GP201目標產(chǎn)品的主頻將達到1GHz以上,運算單元個數(shù)為原型64倍。為便于計算比對,本文取GP201頻率為1000MHz。依據(jù)上述參數(shù),結(jié)合GP201原型系統(tǒng)運行時間數(shù)據(jù),本文對GP201運算速度進行了預(yù)測,并將其與商用顯卡運行時間進行比較,數(shù)據(jù)如表2所示。
表2 GP201快速傅里葉變換運算用時
從表中我們可以看出,本文中所實現(xiàn)基于GP201原型的加速方案運算速度相當優(yōu)秀。在FFT序列較短時尤其明顯,在序列較長的運算中依然優(yōu)于商用顯卡。以此可以預(yù)見,GP201的實際產(chǎn)品性能將可達到更高水準。相應(yīng)地也表明所設(shè)計與實現(xiàn)的基于國產(chǎn)GPU的OpenCL異構(gòu)計算架構(gòu)具有較高的性能。
如今,GPU已經(jīng)被廣泛運用于異構(gòu)計算體系之中。在國產(chǎn)GPU上實現(xiàn)OpenCL異構(gòu)計算標準的應(yīng)用,可以充分發(fā)揮其運算能力,拓寬國產(chǎn)GPU的應(yīng)用面。本文通過實驗,驗證了國產(chǎn)GPU上Open-CL的設(shè)計與實現(xiàn)的效果。通過數(shù)學(xué)計算,將GP201的運算結(jié)果與商用顯卡的運算結(jié)果進行比較。結(jié)果表明,基于國產(chǎn)GPU的OpenCL異構(gòu)計算應(yīng)用運行正常,OpenCL各結(jié)構(gòu)層次運行正常,國產(chǎn)GPU作為異構(gòu)計算組件性能良好,較好地發(fā)揮出了硬件的能力,基于國產(chǎn)GPU的OpenCL的設(shè)計與實現(xiàn)是較為成功的,國產(chǎn)GPU在異構(gòu)計算領(lǐng)域前景十分光明。