田立國,杜君
TIAN Li-guo1,DU Jun2
(1.漢中職業技術學院,漢中 723000;2.北京裝甲兵工程學院 裝備指揮與管理學院,北京 100072)
最近幾年來,受游戲市場和視景仿真需求的牽引,GPU(Graphic Process Unit圖形處理單元)得到了迅速的發展,主流GPU的單精度浮點處理能力和外部存儲器帶寬都遠遠高于同期的CPU,而且GPU已經從以往的固定流水線操作模式發展成可編程流水線模式;另一方面,受工藝、材料和功耗的物理限制,處理器的頻率不會在短時期內有飛躍式的提高,新的摩爾定律已經演化為“未來的計算機硬件不會更快,只會更寬”,相應的現代CPU也采用了多核的架構用來提高CPU的并行處理能力。但GPU與生俱來就是一種眾核并行處理器,在處理單元的數量上還要遠遠超過CPU,因此GPU在未來的高性能計算中將發揮越來越大的作用。
1.1 GPU通用計算
[1]從系統架構上看,GPU是針對向量計算進行了優化的高度并行的數據流處理器,其中包括兩種流處理單元:頂點處理流水線(Vertex Shader)和像素處理流水線(Pixel Shader),其中頂點流水線是多指令多數據流(MIMD)的處理單元,而像素處理流水線(Pixel Shader)是單指令多數據流(SIMD)的處理單元。這種以數據流作為處理單元的處理器,在對數據流的處理上可以獲取較高的效率,因此最近幾年,很多研究人員開創了一個新的研究領域:基于GPU的通用計算(GPGPU:General-Purpose Computation on Graphics Process),其主要研究內容是除了在圖形處理方面外,如何利用GPU來進行更為廣泛的應用計算。GPGPU計算通常采用CPU+GPU異構模式,由CPU負責執行復雜邏輯處理和事務管理等不適合數據并行的計算,由GPU負責計算密集型的大規模數據并行計算。這種利用GPU強大處理能力和高帶寬彌補CPU性能不足的計算方式在發掘計算機潛在的性能,在成本和性價比方面有顯著的優勢。
1.2 GPU通用計算的特點
在GPU上運行的圖形應用程序的算法存在如下幾個特征:算法密集、高度并行、控制簡單、分多個階段執行以及前饋(Feed Forward)流水線等,因此,符合這些條件或者是可以改寫成類似特征的應用程序,就能夠在GPU上獲取較高的性能。
1.3 GPU通用計算平臺
GPU從其誕生之日起就是專門為圖形處理設計的處理器,它具有自己的存儲單元,在數據存取方式上也存在一定的特殊性,而且通常對GPU進行開發的是一些游戲廠商,他們幾乎都使非標準編程模式,如果要實現通用計算需要花費很大的程序開發能力,為了便于開發人員使用GPU的通用計算能力,世界上一些知名的軟硬件廠商先后推出了一些開發平臺和工具,極大地推動了GPU通用計算的發展和進步。目前使用比較廣泛的是NVIDIA的CUDA,主要有以下兩個原因:
1)硬件方面,支持CUDA的GPU在構架上有了顯著的改進,一是采用了統一的處理架構,可以更加有效地利用過去分布在頂點渲染器和像素渲染器的計算資源;二是引入了片內共享存儲器,支持隨機寫入和線程間通信。這兩項改進使得CUDA架構更加適用于GPU通用計算。
2)軟件方面,CUDA不需要借助于圖形API,并采用了比較容易掌握的類C語言進行開發。開發人員能夠從熟悉的C語言比較平穩地從CPU編程模式過渡到GPU編程模式,而不需要去學習特定的顯示芯片指令或者特殊的結構。CUDA的最大優勢在于它極大降低了利用GPU進行編程的入門門檻。只要編程人員掌握C語言,就可以利用CUDA所提供的編程環境和SDK基于GPU進行軟件開發。
2.1 GPU與CPU硬件架構比較
從硬件架構上看,CPU和GPU是按照不同的設計思路設計的:如圖1所示。

圖1 CPU和GPU硬件架構示意圖
CPU的架構是按照兼顧“指令并行執行”和“數據并行運算”的思路而設計,即兼顧程序執行和數據運算的并行性、通用性以及它們的平衡性。因而CPU是計算機中設計最復雜的芯片。和GPU相比,CPU核心的重復設計部分不多,這種復雜性來自于實現:如程序分支預測,推測執行,多重嵌套分支執行,并行執行時候的指令相關性和數據相關性,多核協同處理時候的數據一致性等等復雜邏輯。
GPU其實是由硬件實現的一組圖形函數的集合,這些函數主要用于繪制各種圖形所需要的運算。這些和像素,光影處理,3D 坐標變換等相關的運算由GPU硬件加速來實現。圖形運算的特點是大量同類型數據的密集運算—如圖形數據的矩陣運算,GPU的架構就是面向適合于矩陣類型的數值計算而設計的,大量重復設計的計算單元,這類計算可以分成眾多獨立的數值計算—大量數值運算的線程,而且數據之間沒有像程序執行的那種邏輯關聯性。
2.2 GPU與CPU計算能力分析
GPU擁有自己獨立的子存儲系統—顯存,它擁有比系統主存高得多的帶寬。GPU在工作時,工作負載經PCI-E總線從CPU傳入GPU顯存,按照體系架構的層次自頂向下分發。PCI-E 2.0規范中,每個通道上下行的數據傳輸速度達到了5.0Gbit/s,這樣PCI-E2.0×16插槽能夠為上下行數據各提供5.0×16Gbit/s=10GB/s的帶寬,有效帶寬為8GB/s,但是由于PCI-E數據封包的影響,實際可用的帶寬大約在5-6GB/s(PCI-E 2.0×16)。
CPU在浮點運算和并行計算方面的性能遠不如GPU強大,所以將GPU的作為CPU的浮點運算協處理器可以使普通PC的運算能力提高到一個全新的高度。如果從更深層面考慮,目前CPU的發展已經遇到了瓶頸,無論是核心架構的效率還是核心數量都很難獲得大幅提升,而GPU則是新的突破點,它的潛力很大。
2.3 GPU通用計算的應用領域
GPU通用計算的發展迅速,特別是“CPU+ GPU”模式的提出,使得GPU通用計算的應用領域逐步深入到科學計算的各個領域,如FFT(快速傅里葉變換)[2]、串匹配算法[3]、科學計算可視化[4]、實時紅外圖像生成[5]、遺傳算法加速[6]、數據庫操作[7]、等。隨著軟硬件技術的進一步發展,以及越來越多的研究人員和工程技術人員的參與,GPU通用計算的研究和應用領域將進一步拓寬。
GPU在處理大量的沒有邏輯關系的數值計算時,理論上具有明顯的加速效果,為了對GPU通用計算的加速性能進行原理性的分析和驗證,構建了以下的實驗環境:
硬件采用2.2GHz Intel Core2Duo處理器和GeForce G210M顯卡(娛樂級顯卡),軟件環境采用NVIDA的CUDA SDK 2.0及C語言編譯器。
3.1 海量浮點數求和運算
選取0~512*21056的浮點型數據,每個整型數據執行k次累加和運算。

試驗中,通過不斷增大k的值,來調浮點數的運算量,試驗的結果如圖2所示。其中GPU程序執行時間包括數據在顯存和主存之間的傳遞時間。

圖2 海量浮點數運算
從試驗結果可以看出,隨著計算量的增加,CPU和GPU執行時間都在增加,但到達一定的計算量后,CPU執行時間成線性增加,而GPU基本保持不變,原因是高密度計算隱藏了GPU訪存和數據傳輸帶來的延遲。
3.2 龍格-庫塔法解算彈道方程
龍格-庫塔算法是一種常用的微分方程的數值解法,具有較高的精度,相應地其運算量也相對較大。

實驗中通過改變解算彈道數,比較分析CPU和GPU的執行時間,如圖3所示。

圖3 龍格-庫塔解算彈道方程
由試驗數據可知,在彈道數小于1024的時候,GPU執行速度沒有CPU快,GPU的加速性能沒有充分發揮。當彈道數大于1024時,GPU加速優勢開始顯現,隨著彈道數增大,GPU加速優勢越來越明顯,主要原因是大規模高吞吐量的數據運算也可以隱藏GPU訪存和數據傳輸帶來的延遲。
隨著GPU 計算能力的飛速提高,以及相關軟件平臺的支持,高性能計算逐步進入桌面領域,對于普通的科研和技術人員而言,高性能計算(High Performance Computing,HPC)不再可望而不可及,在這種高性價比的計算資源的支持下,許多以往看起來無法解決的運算問題都可以迎刃而解。
[1]吳恩華.圖形處理器用于通用計算的技術、現狀及其挑戰[J].軟件學報.2004,15(10):1493-1504.
[2]馮煌.GPU圖像處理的FFT和卷積算法及性能分析[J].計算機工程與應用.2008,44(2).
[3]張慶丹,戴正華,馮圣中,孫凝暉.基于GPU的串匹配算法研究[J].計算機應用.2006,7(26):7.
[4]鄭杰.基于GPU的高質量交互式可視化技術研究[D].西安電子科技大學.2007.
[5]李勇.基于GPU的實時紅外圖像生成方法研究[D].西安電子科技大學,2007.
[6]楊正龍,金林,李蔚清.基與GPU的圖形電磁計算加速算法[J].電于學報.2007,6(35):6.
[7]楊正平.基于GPU計算的直接體視化和遺傳算法研究[D].中國地質大學文.2005.