摘要:NVIDIA公司在1999年發佈GeForce256時首先提出GPU(圖形處理器)的概念,隨後大量複雜的應用需求促使整個產業蓬勃發展至今。GPU在這十多年的演變過程當中,咱們看到GPU從最初幫助CPU分擔幾何吞吐量,到Shader(着色器)單元初具規模,而後出現Shader單元可編程性,到今天GPU通用計算領域蓬勃發展這一清晰軌跡。本報告首先根據蒐集到的資料記錄GPU通用計算的發展過程當中硬件和軟件的演變,而後介紹並簡要比較如今比較流行的GPU通用計算編程模型,最後對GPU通用計算在不一樣領域的成功應用進行概述。html
關鍵詞:GPU GPU通用計算 可編程單元 編程模型 GPGPU應用
1、GPU通用計算的背景和動機
GPU英文全稱Graphic Processing Unit,中文翻譯爲「圖形處理器」。GPU從誕生之日起就以超越摩爾定律的速度發展,運算能力不斷提高。業界不少研究者注意到GPU進行計算的潛力,於2003年SIGGRAPH大會上提出了GPGPU(General-purpose computing on graphics processing units)的概念。GPU逐漸從由若干專用的固定功能單元(Fixed Function Unit)組成的專用並行處理器向以通用計算資源爲主,固定功能單元爲輔的架構轉變。
1.1 爲何要用GPU進行計算
GPU在處理能力和存儲器帶寬上相對於CPU有明顯優點,在成本和功耗上也不須要付出太大代價。因爲圖形渲染的高度並行性,使得GPU能夠經過增長並行處理單元和存儲器控制單元的方式提升處理能力和存儲器帶寬。GPU設計者將更多的晶體管用做執行單元,而不是像CPU那樣用做複雜的控制單元和緩存並以此來提升少許執行單元的執行效率[1]。圖1 對CPU與GPU中的邏輯架構進行了對比。緩存
圖1 CPU和GPU邏輯架構對比
CPU的整數計算、分支、邏輯判斷和浮點運算分別由不一樣的運算單元執行,此外還有一個浮點加速器。所以,CPU面對不一樣類型的計算任務會有不一樣的性能表現。而GPU是由同一個運算單元執行整數和浮點計算,所以,GPU的整型計算能力與其浮點能力類似。目前,主流GPU都採用了統一架構單元,憑藉強大的可編程流處理器陣容,GPU在單精度浮點運算方面將CPU遠遠甩在身後[1]。最頂級的英特爾Core i7 965處理器,在默認狀況下,它的浮點計算能力只有NVIDIA GeForce GTX 280的1/13,與AMD Radeon HD 4870相比差距就更大。
圖2 CPU 和 GPU 的每秒浮點運算次數和存儲器帶寬
GPU運算相對於CPU還有一項巨大的優點,那就是其內存子系統,也就是GPU上的顯存[1]。當前桌面級頂級產品3通道DDR3-1333的峯值是32GB/S,實測中因爲諸多因素帶寬在20 GB/S上下浮動。AMD HD 4870 512MB使用了帶寬超高的GDDR5顯存,內存總線數據傳輸率爲3.6T/s或者說107GB/s的總線帶寬。NVIDIA GTX280使用了高頻率GDDR3顯存,可是其顯存控制器支持的位寬達到了512bit,搭載16顆0.8ns GDDR3顯存,帶寬高達驚人的142GB/s。而主流GPU廣泛擁有40-60 GB/s顯存帶寬。存儲器的超高帶寬讓巨大的浮點運算能力得以穩定吞吐,也爲數據密集型任務的高效運行提供了保障。
還有,從GTX200和HD 4870系列GPU開始,AMD和NVIDIA兩大廠商都開始提供對雙精度運算的支持,這正是很多應用領域的科學計算都須要的。NVIDIA公司最新的Fermi架構更是將全局ECC(Error Checking and Correcting)、可讀寫緩存、分支預測等技術引入到GPU的設計中,明確了將GPU做爲通用計算核心的方向。
GPU通用計算被愈來愈多的採用,除了GPU自己架構的優越性,市場需求也是重要的緣由。好比不少企業或科研單位沒法佈置昂貴的的計算機集羣,而大部分普通用戶PC上裝配的GPU使用率很低,提升GPU利用率的有效途徑就是將軟件的部分計算任務分配到GPU上,從而實現高性能、低功耗的最終目標。
1.2 什麼適合GPU進行計算
儘管GPU計算已經開始嶄露頭角,但GPU並不能徹底替代X86解決方案,不少操做系統、軟件以及部分代碼如今還不能運行在GPU上,所謂的GPU+CPU異構超級計算機也並非徹底基於GPU進行計算。通常而言適合GPU運算的應用有以下特徵[2]:
• 運算密集。
• 高度並行。
• 控制簡單。
• 分多個階段執行。
符合這些條件或者是能夠改寫成相似特徵的應用程序,就可以在GPU上獲取較高的性能。
2、GPU通用計算的前世此生
GPU通用計算實際上是從GPU渲染管線發展來的。GPU渲染管線的主要任務是完成3D模型到圖像的渲染工做。經常使用的圖形學API(DirectD/OpenGL)編程模型中渲染過程被分紅幾個能夠並行處理的階段,分別由GPU中渲染管線的不一樣單元進行處理。在GPU渲染管線的不一樣階段,須要處理的對象分別是頂點(Vertex)、幾何圖元(primitive)、片元(fragment)、像素(pixel)。圖形渲染過程具備內在的並行性:頂點之間、圖元之間、片元之間的數據相關性很弱,對它們的計算能夠獨立並行進行,這使得經過並行處理提升吞吐量成爲可能[3]。這兒不對GPU渲染管線進行詳細介紹,而是着重於介紹GPU可編程器件和編程模型的發展歷程。
2.1 GPU可編程器件的發展
1999年8月,NVIDIA正式發表了具備跨世紀意義的產品NV10——GeForce 256。GeForce256是業界第一款256bit的GPU,也是全球第一個集成T&L(Transforming&Lighting幾何光照轉換)、動態光影、三角形設置/剪輯和四像素渲染等3D加速功能的圖形引擎。經過T&L技術,顯卡再也不是簡單像素填充機以及多邊形生成器,它還將參與圖形的幾何計算從而將CPU從繁重的3D管道幾何運算中解放出來。能夠說,T&L技術是顯卡進化到GPU的標誌。
從某種意義上說,GeForce 256開創了一個全新的3D圖形時代,再到後來GeForce 3開始引入可編程特性,能將圖形硬件的流水線做爲流處理器來解釋,基於GPU的通用計算也開始出現。GeForce3被用於實現矩陣乘法運算和求解數學上的擴散方程,這是GPU通用計算的早期應用。
研究人員發現,要實現更加複雜多變的圖形效果,不能僅僅依賴三角形生成和硬件T&L實現的固定光影轉換,而要增強頂點和像素運算能力。Shader(着色器)就是在這樣的背景下提出的。Pixel Shader(頂點着色器)和Vertex Shader(像素着色器)的硬件邏輯支持可編程的像素和頂點,雖然當時可編程性很弱,硬件限制太多,頂點部分出現可編程性,像素部分可編程性有限,但這的確是硬件T&L以後PC圖形技術的又一重大飛躍。3D娛樂的視覺體驗也所以向接近真實邁進了一大步。可編程管線的引入,也爲GPU發展翻開了新的篇章,GPU開始向SIMD(Single Instruction Multiple Data,單指令多數據流)處理器方向發展,憑藉強大的並行處理性能,使得GPU開始用有了部分流式處理器特徵。
隨後到來的DirectX[1] 9.0時代,讓Shader單元具有了更強的可編程性。2002年末微軟發佈的DirectX 9.0中,Pixel Shader單元的渲染精度已達到浮點精度,傳統的硬件T&L單元也被取消。全新的Vertex Shader編程將比之前複雜得多,新的Vertex Shader標準增長了流程控制,更多的常量,每一個程序的着色指令增長到了1024條。
Shader Model 2.0時代突破了之前限制PC圖形圖像質量在數學上的精度障礙,它的每條渲染流水線都升級爲128位浮點顏色,讓遊戲程序設計師們更容易更輕鬆的創造出更漂亮的效果,讓程序員編程更容易。而從通用性方面理解,支持浮點運算讓GPU已經具有了通用計算的基礎,這一點是相當重要的。
圖形流水線中可編程單元的行爲由Shader單元定義,着色器的性能由DirectX中規定的Shader Model來區分,並能夠由高級的Shading語言(例如NV的Cg,OpenGL的GLSL,Microsoft的HLSL)編寫。Shader源碼被譯爲字節碼,而後在運行時由驅動程序將其轉化爲基於特定GPU的二進制程序,具有可移植性好等優點。傳統的圖形渲染流線中有兩種不一樣的可編程着色器,分別是頂點着色單元(Vertex Shader,VS)和像素着色單元(Pixel Shader,PS)。
在Shader Model 4.0以前,VS和PS兩種着色器的架構既有相同之處,又有一些不一樣。二者處理的都是四元組數據(頂點着色器處理用於表示座標的w、x、y、z,但像素着色器處理用於表示顏色的a、r、g、b),頂點渲染須要比較高的計算精度;而像素渲染則可使用較低的精度,從而能夠增長在單位面積上的計算單元數量。傳統的分離架構中,兩種着色器的比例每每是固定的。在GPU核心設計完成時,各類着色器的數量便肯定下來,好比著名的「黃金比例」——頂點着色器與像素着色器的數量比例爲1:3。但不一樣的遊戲對頂點資源和像素資源的計算能力要求是不一樣的。若是場景中有大量的小三角形,則頂點着色器必須滿負荷工做,而像素着色器則會被閒置;若是場景中有少許的大三角形,又會發生相反的狀況。所以,固定比例的設計沒法徹底發揮GPU中全部計算單元的性能。
Shader Model 4.0統一了兩種着色器,頂點和像素着色器的規格要求徹底相同,都支持32位浮點數。這是GPU發展的一個分水嶺。過去只能處理頂點和只能處理像素的專門處理單元被統一以後,更加適應通用計算的需求,應用程序調用着色器運算能力的效率也更高。
DirectX 11提出的Shader Model 5.0版本繼續強化了通用計算的地位,微軟提出的全新API—Direct Compute將把GPU通用計算推向新的巔峯。同時Shader Model 5.0是徹底針對流處理器而設定的,全部類型的着色器,如:像素、頂點、幾何、計算、Hull和Domaim(位於Tessellator先後)都將重新指令集中獲益[4]。
着色器的可編程性也隨着架構的發展不斷提升,下表給出每代模型的大概特色[1]。
Shader Model
|
GPU表明
|
顯卡時代
|
特色
|
|
1999年第一代NV Geforce256
|
DirectX 7
1999~2001
|
GPU能夠處理頂點的矩陣變換和進行光照計算(T&L),操做固定,功能單一,不具有可編程性
|
SM 1.0
|
2001年第二代NV Geforce3
|
DirectX 8
|
將圖形硬件流水線做爲流處理器來解釋,頂點部分出現可編程性,像素部分可編程性有限(訪問紋理的方式和格式受限,不支持浮點)
|
SM 2.0
|
2003 年
ATI R300
和第三代NV Geforce FX
|
DirectX 9.0b
|
頂點和像素可編程性更通用化,像素部分支持FP16/24/32浮點,可包含上千條指令,處理紋理更加靈活:可用索引進行查找,也再也不限制[0,1]範圍,從而可用做任意數組(這一點對通用計算很重要)
|
SM 3.0
|
2004年
第四代NV Geforce 6
和 ATI X1000
|
DirectX 9.0c
|
頂點程序能夠訪問紋理VTF,支持動態分支操做,像素程序開始支持分支操做(包括循環、if/else等),支持函數調用,64位浮點紋理濾波和融合,多個繪製目標
|
SM 4.0
|
2007年
第五代NV G80和ATI R600
|
DirectX 10
2007~2009
|
統一渲染架構,支持IEEE754浮點標準,引入Geometry Shader(可批量進行幾何處理),指令數從1K提高至64K,寄存器從32個增長到4096個,紋理規模從16+4個提高到128個,材質Texture格式變爲硬件支持的RGBE格式,最高紋理分辨率從2048*2048提高至8192*8192
|
SM 5.0
|
2009年
ATI RV870
和2010年NV GF100
|
DirectX 11
2009~
|
明確提出通用計算API Direct Compute概念和Open CL分庭抗衡,以更小的性能衰減支持IEEE754的64位雙精度浮點標準,硬件Tessellation單元,更好地利用多線程資源加速多個GPU
|
表1 Shader Model版本
2.2 AMD與NVIDIA最新GPU架構比較
本文來源:http://www.cnblogs.com/chunshan/archive/2011/07/18/2110076.html