摘 要:針對GPU圖形處理的特點,分析其應用于通用計算的并行處理機制和數據映射,提出了一種GPU通用計算模式的映射機制和一般性設計方法,并針對GPU的吞吐量、數據流處理能力和基本數學運算能力等進行性能測試,為GPU通用計算的算法設計、實現和性能優化提供參考依據。
關鍵詞:圖形處理器; 通用計算; 圖形流水線
中圖分類號:TP311.52文獻標志碼:A
文章編號:1001-3695(2009)06-2356-03
doi:10.3969/j.issn.1001-3695.2009.06.107
Computing model of general-purpose computation on GPU
WANG Lei1, ZHANG Chun-yan2
(1.Institute of Information Engineering, PLA Information Engineering University, Zhengzhou 450002, China; 2.College of Information Science Engineering, Industry University of Henan ,Zhengzhou 450052, China)
Abstract:
In view of the GPU graph processing characteristic, this paper analyzed parallel processing mechanism and the data mapping to apply in the general computation, put forward mapping mechanisms and general design method of GPGPU computation model, and tested the throughput, data processing capacity and basic mathematics computing ability etc, provided reference for performance optimization of algorithm design and implementation.
Key words:graphics processor unit(GPU); general purpose computation; graphic pipeline
隨著科學計算可視化、醫療圖像、虛擬現實等學科的發展和娛樂產業的推動,高性能計算領域和計算機圖形領域應用越來越緊密地結合起來[1]。圖形處理器(GPU)是為圖像處理進行了高度優化的專用處理器。例如NVIDIA GeForce 7600 GT擁有超過1.7億個晶體管,具有控制電路簡單、片上緩存少等特點,且大量晶體管用于專用的圖形處理電路模塊和多條并行圖形處理流水線。GPU核心浮點運算性能與CPU相比有很大優勢,且發展速度已遠遠超過摩爾定律,平均每6個月性能翻一倍[2]。
GPU通用計算[3](general-purpose computation on GPU,GPGPU)主要涉及將圖形處理器用于圖形繪制以外的科學計算,如幾何計算、碰撞檢測、運動規劃、代數運算、優化計算、偏微分方程及數值求解等[4~6]。目前眾多研究成果表明,GPU在解決計算密集型問題上與CPU相比有很大優勢。
目前在GPU上實現通用計算仍存在諸多問題。首先,GPU專為圖像處理而設計,在針對GPU的算法設計與實現中存在CPU與GPU的操作映射,以及通用計算與圖形計算概念映射等問題。傳統的圖像應用編程接口將GPU抽象成一個包括紋理、三角形和像素在內的圖像繪制器[1]。在實際應用中,難以利用這些基本元素進行通用算法設計。其次,圖形應用程序具有數據密集、高度并行、控制簡單、多階段執行以及前饋流水線等特征,針對CPU的并行算法和編程模式難以直接在GPU上利用可編程硬件實現。最后,文獻[7,8]中指出GPU在復雜3D場景繪制等方面的性能指標并不能夠完全體現GPU通用計算的性能。因此,一方面需要針對算法在GPU上的實現進行數據重組織,并映射到基本的圖形處理元素中,同時利用GPU中并行流水線機制對算法進行設計與優化。另外,需要針對GPU在通用計算算法設計與實現方面提出相應的性能優化策略。
1 GPU通用計算模式
GPU的并行處理能力主要體現在三個方面:頂點處理器(vertex shader)、片段處理器(fragment shader)和RGBA四個顏色通道的并行處理[9]。圖形流水線分別對輸入場景的頂點數據和片段數據進行處理。前者對每一個輸入的頂點執行用戶定義程序,即頂點處理程序;后者則在每一個片段上執行用戶定義程序,即片段處理程序。
GPU的圖形處理過程可劃分為CPU控制部分和GPU控制部分,兩者之間通過系統總線和圖形硬件接口相連接,如圖1所示。圖形繪制過程首先在CPU控制部分進行,即CPU為點、直線、多邊形等幾何圖元數據建立幾何模型,同時初始化與幾何模型相對應的紋理數據。這些存儲在系統內存中的圖形數據通過系統總線傳輸到GPU控制部分的緩沖區中,同時由CPU發送指令激活GPU圖形流水線。而GPU控制部分的片段處理器可以將計算結果直接寫入幀緩沖,并通過系統總線發送到顯示設備進行輸出或發送到系統內存,也可以再次返回到緩沖區。在GPU控制的內部,各個圖形處理硬件采用流水并行的方式對圖形數據進行處理,每一個流水段的處理單元專用于執行特定的任務。
從非圖形應用的角度觀察GPU圖形流水線,其中主要包括兩個可編程的硬件模塊,即頂點處理器和片段處理器,分別作為數據預處理機和數據流處理機。兩者都支持32位浮點型的操作數,并能夠對紋理數據進行存取,且在執行大數據量的處理時兩者都有很高的效率[10]。由于每個輸入數據均被獨立處理,一個頂點或片段的計算通常不會影響另一個頂點或片段。采用這種方式能夠對大量的頂點和片段進行高效的并行處理。
與GPU圖形處理過程相比,可以將流水線中的主要階段映射為GPU通用計算的工作模式,如圖2所示。數據預處理機對輸入的數據進行預處理并發送到數據流發生器,對數據進行擴展和映射,形成數據流并發送到緩沖區,最后通過系統總線輸出到CPU控制部分。
在圖形流水線上構建通用計算程序的典型方法可以分為以下三個步驟:
a)通過向GPU傳入的輸入數據使數據預處理機產生特定的一個幾何體(如矩形或三角形),作為數據操作對象。
b)該幾何體覆蓋屏幕的主要部分,并通過數據流發生器產生大量數據元素。該幾何體產生的每個數據元素都可以由多個數據流處理機并行處理,因此,這些數據元素可以看作通用計算所需的數據來源。
c)數據流處理機針對每個數據元素進行同樣的計算操作,并將輸出數據作為最終或中間結果進行輸出。
通過上述GPU通用計算的基本模式可以看出,關鍵是需要對GPU圖形流水線的圖形繪制視圖和通用計算視圖的關系進行分析,即兩者之間的映射關系描述了如何將通用計算的思維方式轉換到GPU圖形繪制過程上,即如何把CPU解決問題的方式映射到GPU圖形流水線上。GPU通用計算模式的映射機制可以表述為四個級別的映射關系,即模式映射、概念映射、數據映射以及算法映射,如圖3所示。
四種映射關系反映了在GPU上解決通用計算問題的一般性設計方法:
a)圖形流水線是GPU固有的數據處理流程,在進行通用計算問題求解的過程中,首先必須考慮該問題是否適應于圖形流水線的處理模式。
b)如何面向通用計算問題的求解,理解圖形繪制中的概念,如三角形、矩形、紋理、頂點著色器、片段著色器等,這是充分利用圖形繪制的特點和優勢進行通用計算的必要前提。
c)在GPU上如何高效地對數據進行組織和存取。
d)CPU算法在GPU上如何進行設計、描述和實現。
2 GPU通用計算的性能測試
由于科學計算、數值計算對于GPU的計算能力和帶寬的需求,與傳統的GPU圖形繪制、實時渲染存在很大差異,因此對GPU在復雜3D場景繪制等方面的性能測試,并不能夠完全說明GPU通用計算模式在解決通用計算問題方面的性能。
本文參考GPUBench[11]、NVIDIA PerfKit[12]所依據的性能標準,著重針對GPU片段處理器吞吐量和GPU數據流處理能力進行性能測試。測試環境為:CPU為DualCore Intel Pentium D820 2.8 GHz,主存2 GB,GPU為NVIDIA GeForce 7600 GT,顯存256 MB,接口為PCI Express 1.0 x16。
2.1 GPU片段處理器吞吐量
GPU片段處理器的吞吐量主要是衡量GPU片段處理器上的數據流處理程序在單位時間內產生像素的數量。設throughPut為片段處理器的吞吐量;components為紋理元素中封裝的單精度浮點數,取值范圍為1、2、3或4;numIter為GPU繪制過程的迭代次數;N2為輸入數據的規模(即單精度浮點數的數量);msec為GPU繪制過程的總運行時間;σ為常數,與特定的測試環境(驅動程序、硬件接口等)相關,則
throughPut=σ×components×numIter×N2/m
如圖4所示,隨著紋理流數據規模的增大,片段處理器的吞吐量初始時穩定在7.75 GBps。當數據規模達到1 5362時,吞吐量降低了66.7%。
由實驗結果分析可知,由于將4個單精度浮點數封裝到一個紋理元素中,每個單精度浮點數占4 Byte。當到達吞吐量瓶頸時,共占用的紋理緩沖區空間為36 MB,而GPU分配的紋理緩沖區只有32 MB,因此片段處理器無法直接從紋理緩沖區獲得數據流。此時必須直接對紋理內存進行訪問,造成片段處理器的吞吐量下降。
若將數據規模固定為5122,分別對紋理元素的四種封裝形式進行測試。如圖5所示,采用紋理元素的不同封裝方式,對片段處理器的吞吐量有不同的影響。其中將一個單精度浮點數封裝到一個紋理元素能夠獲得最大的吞吐量。
對于1或4個單精度浮點數的封裝形式,前者盡管無法利用片段處理器的指令級并行性分別對RGBA四個分量進行并行處理,但節省了片段處理器在對紋理元素拆分和組裝上的開銷,這些開銷就目前的GPU來說,仍然是一個不可忽略的問題。而后者雖然能夠充分利用片段處理器的指令級并行性,但對紋理元素的拆分和組裝抵消了并行性帶來的優勢。對于2和3個單精度浮點數的封裝形式,由于GPU原生的紋理元素組織方式不對這兩種封裝形式提供硬件加速的支持,造成片段處理器的吞吐量比1和4個單精度浮點數的封裝形式性能更低。
由測試結果的分析可知,為了達到片段處理器的高吞吐量,要限制數據流不能超過紋理緩沖區容量范圍,盡可能避免直接訪問紋理內存的操作。同時,紋理元素的封裝形式,即數據流的組織方式也對性能有較大影響。在進行算法設計時必須在指令級并行和封裝代價上慎重選擇,但對于一般非紋理流的float4類型向量的處理,GPU能夠充分發揮指令級并行性的優勢而不會帶來任何額外的開銷。
2.2 GPU數據流訪問帶寬
GPU數據流的帶寬主要是衡量單位時間內從數據流能夠獲取數據量的能力。首先生成數據規模為5122的2D紋理流,通過數據流處理程序(頂點處理器和片段處理器)對紋理流進行訪問并執行數學運算,之后將結果發送到輸出紋理流中。
紋理流中的紋理元素采用常用的四分量方式組織,即一個紋理元素中包含四個單精度浮點數。數據流處理程序訪問紋理元素的方式可以分為三種:a)單元素重復訪問方式,是每一個數據流處理程序僅重復訪問紋理流中的第一個元素。b)順序訪問方式,是每一個數據流處理程序依次對紋理流中的紋理元素進行訪問。c)隨機訪問方式,將通過索引紋理隨機取得紋理元素坐標,對紋理元素進行訪問(該方式在索引紋理流上獲取隨機坐標而花費一定時間)。紋理流的繪制區域采用三角形。
如圖6所示,紋理流帶寬能力的發揮在很大程度上取決于紋理流的不同訪問方式。其中對紋理流的單元素訪問方式要比順序訪問方式和隨機訪問方式的帶寬分別提高了54.7%和70.0%。單元素重復訪問多個數據流處理程序時,由于只對一個元素進行同時訪問,因此能夠充分利用紋理緩沖區的優勢;而在順序訪問時,每一個紋理流對應到不同的數據流處理程序,需要分別進行訪問,此時多個數據流處理程序無法共享紋理緩沖區中的數據。隨機訪問同時要對索引流和紋理流進行訪問,紋理緩沖區對這種訪問方式同樣無效。因此,盡可能采用數據流處理程序對紋理流的單一元素訪問是提高訪問帶寬的有效方法。
2.3 GPU數據流處理能力
該測試主要是衡量GPU數據流處理程序在數據流上執行基本運算指令的能力。通過逐步加大數據流處理程序中對紋理流操作的MAD指令數目,利用復雜的相關紋理流(即一個紋理流中的數據與另一紋理流相關)模擬實際通用計算算法,并在不同的紋理流訪問次數下測試數據流處理程序的執行時間。如圖7所示,隨著數據流處理程序中指令條數的增加,計算所花費的時間呈線性增長。
由于前一次讀取的紋理數據值用于下一次讀取的索引,因紋理緩沖區將對上一次紋理數據進行緩沖,時間曲線呈階梯狀遞增。在設計和實現數據流處理程序時,必須對其指令數的數量進行衡量,將其計算時間控制在預期的范圍內;同時,充分利用紋理緩沖區也將大大提高執行效率。
2.4 GPU的基本數學運算能力
GPU片段處理器能夠執行基本的數學運算操作,這些操作通常大量運用在GPU通用計算程序中。因此,GPU在基本數學運算方面的執行性能在很大程度上會影響數據流處理程序的執行效率。
為了降低高層繪制語言造成的編譯開銷,測試的運算代碼直接用GPU底層繪制語言實現。GPU底層著色器支持的指令集可以根據輸入參數的數量、輸入是向量或標量以及結果是向量或標量來分類。其中向量包含四個分量,而標量只包含一個分量。
為了避免其他操作造成的影響,保證測試的有效性,在片段處理器的代碼中不包含任何對紋理的操作。在每個程序中包含的相同指令的指令數為500條,反復執行100次。繪制區域,即輸出幀緩沖大小固定為512,設置像素格式為四分量,對特定的指令測試其執行效率,即每秒鐘能夠執行的指令條數。
如表1所示,GPU針對加、減、乘、加乘、點積等操作進行了特別優化,這些指令的執行效率比其他指令高出49.4%。在應用GPU通用計算進行算法設計與實現的過程中,應當優先對GPU進行優化的指令進行選取,利用這些指令往往能夠由于獲得硬件支持而使代碼的總體效率得到提升。
3 結束語
隨著GPU的飛速發展,運用GPU中的多個可編程處理器在解決較大規模數據并行類問題上能夠獲得比傳統的CPU更高的效率。這對傳統計算模式的一種補充和完善:一方面CPU從MMX、SSE2,逐步發展到多核或眾核體系結構,同時GPU從固定流水線、可編程流水線,發展到NVIDIA 8系列的多流處理器體系結構。盡管GPU通用計算存在很多亟待解決的問題,如性能模型、編程模型等,但仍然可以預見,未來的GPU在科學計算方面的應用將越來越廣,CPU與GPU在特定應用領域的協作將會大大增強。本文針對GPU圖形流水線的特點,提出了一種GPU通用計算模式的映射機制和一般性設計方法,分析了GPU通用計算的基本模式,并針對GPU的吞吐量和數據流處理能力進行測試。后續的研究工作將綜合各種因素對GPU通用計算性能的影響,建立GPU通用計算模式的性能模型,并進行完整的性能評估和測試。
參考文獻:
[1]吳恩華,柳有權. 基于圖形處理器(GPU)的通用計算[J]. 計算機輔助設計與圖形學學報,2004,16(5):601-612.
[2]吳恩華. 圖形處理器用于通用計算的技術、現狀及其挑戰[J]. 軟件學報, 2004,15(10):1493-1504.
[3]GPGPU[EB/OL]. 2007. http://www.gpgpu.org.
[4]GOVINDARAJU NK, LLOYD B, WANG wei, et al. Fast computation of database operations using graphics processors[C]//Proc of the 2004 ACM SIGMOD. New York:ACM, 2004:215-226.
[5]GPUSort: A high performance GPU sorting library[EB/OL]. (2005). http://gamma.cs.unc.edu/GPUSORT.
[6]GDDEKE D, STRZODKA R, TUREK S. Performance and accuracy of hardware-oriented native-, emulated- and mixed-precision solvers in FEM simulations[J]. International Journal of Parallel Emergent and Distributed Systems, 2007,22(4):221-256.
[7]DOMINE S. GPU performance tools and analysis techniques[C]//SIGGRAPH. 2004.
[8]FERNANDO R. GPU gems :programming techniques, tips, and tricks for real-time graphics[M]. Boston: Addison-Wesley, 2004.
[9]董朝. 基于可編程圖形硬件加速的若干技術研究[D]. 杭州:浙江大學, 2005.
[10]PHARR M, GPU Gems 2: Programming techniques for high-performance graphics and general-purpose computation[M]. [S.l]:Addison-Wesley, 2005.
[11]Stanford University Graphics Lab. GPUBench[EB/OL]. (2006). http://graphics.stanford.edu/projects/gpubench/.
[12]NVIDIA. PerfKit[EB/OL]. (2007). http://developer.nvidia.com/object/nvperfkit_home.html.