GPU挑戰CPU地位!詳解CUDA+OpenCL威力
[泡泡網顯卡頻道 12月16日] 眾所周知,GPU擁有數十倍于CPU的浮點運算能力,但如此強大的實力多數情況下只能用來玩游戲,豈不可惜?因此近年來業界都在致力于發掘GPU的潛能,讓它能夠在非3D、非圖形領域大展拳腳。
- 1999年,首顆GPU(GeForce 256)誕生,GPU從CPU手中接管T&L(坐標轉換和光源)
- 2000年,Hopf在GPU上實現小波變換
- 2001年,Larsen利用GPU的多紋理技術做矩陣運算
- 2002年,Harris在GPU上用細胞自動機(CA)仿真各種物理現象,Purcell第一次使用GPU加速光線跟蹤算法
- 2003年,是GPGPU領域具有里程碑意義的一年,Kruger實現了線性代數操作;Li實現了Lattice Boltzmann的流體仿真;Lefohn實現了Level Set方法等一大批成果
- 2004年,Govindaraju在數據庫領域應用GPU加速取得進展;商業領域,Apple推出支持GPU的視頻工具
- 2006年,首顆DX10 GPU(GeForce 8800)誕生,GPU代替CPU進行更高效的Geometry Shader(幾何著色)運算
- 2007年,主流DX10 GPU全面上市,將CPU從勞累不堪的高清視頻解碼運算中解放出來,如今整合GPU都完美支持硬解碼
- 2008年,CUDA架構初露鋒芒:PhysX引擎發布,GPU代替CPU和PPU進行物理加速運算;Badaboom、TMPGEnc等軟件開始利用GPU的并行計算能力來加速視頻編碼
- 2009年,CUDA、OpenCL、DX11 Compute Shader百花齊放,GPU將會全面取代CPU進行并行計算,大批應用軟件改投GPU門下……
可以這么說,CPU是功能較多的,它幾乎可以處理任何事情,但由于深度流水作業架構的特性、以及浮點運算能力的限制,它處理一些任務時的效率很低。縱觀近年來GPU的發展歷程,就是一步步的將那些不適合CPU處理、或CPU算不動的任務轉移過來,從而消除程序運算時的瓶頸,大幅提升電腦執行效能,以更小的代價(成本和功耗)實現更強大的性能。
但是,想要讓一大批應用軟件從CPU移植到GPU上,非一朝一夕所能完成,需要業界的大力推廣以及開發平臺及編程語言的支持。NVIDIA早在2005年開始就致力于研發CUDA架構及基于CUDA的C語言開發者平臺,并于2007年正式推出,而且專門發布了針對科學計算的Tesla品牌,在GPU計算方面一直處于領跑地位。
而今年由蘋果所倡導的OpenCL標準發布后,包括NVIDIA、Intel、AMD在內的所有IT巨頭都表示出了濃厚的興趣。有了統一的標準之后,GPU計算的推廣與普及就是水到渠成之事,GPU將會在電腦系統中扮演更重要的角色。
那么CUDA與OpenCL之間有什么利害關系呢?未來誰將左右GPU的發展?GPU會否取代CPU成為計算機核心?筆者通過搜集各方資料,并采訪NVIDIA相關技術研究人員,為大家深入分析GPU的通用計算之路。
可能很多朋友還心存疑惑:目前CPU的性能已經很強大了,為什么還要花很大的代價讓GPU進行輔助運算呢?這個問題可以從兩個角度來回答:一般我們認為CPU在浮點運算/并行計算方面的性能遠不如GPU強大,所以將GPU的實力釋放出來可以將電腦獲得新的飛躍;如果從更深層面考慮的話,目前CPU的發展已經遇到了瓶頸,無論核心架構的效率還是核心數量都很難獲得大幅提升,而GPU則是新的突破點,它的潛力幾乎是無限的!
● CPU核心效率提升舉步維艱
就拿目前Intel最強的Core i7處理器來說,架構方面相比上代Core 2 Quad發生了天翻地覆的變化:膠水四核變成了原生四核、引入三級緩存、高速QPI總線、三通道DDR3內存控制器、超線程技術、諸多內核及指令集優化等等……,所有這些技術共同作用的結果就是——同頻率下i7 965的綜合性能僅比上代QX9770提升了10-20%,這說明了什么呢?說明Intel的處理器架構已經非常優秀了,以至于在此基礎上很難再有Pentium D到Core 2 Duo那種飛躍式提升。

Core i7的性能表現沒有帶來驚喜
AMD方面的情況也大致如此,Phenom II相比Phenom的提升主要來自于45nm工藝帶來的高頻率,核心架構優化的貢獻僅有不到5%。目前兩大處理器巨頭單核心效能都已接近極限,只能依靠新工藝帶來的大緩存、高頻率,而獲得微弱的性能提升。
● CPU核心數量不能盲目增加
既然單核效率已經很難取得突破,于是處理器巨頭近年來都將發展方向轉為多核心產品,雙核四核六核八核相繼誕生。但美國Sandia國家實驗室日前的一項模擬測試卻讓人大跌眼鏡:由于存儲機制和內存帶寬的限制,16核、32核甚至64核處理器對于超級計算機來說,不僅不能帶來性能提升,甚至可能導致效率的大幅度下降。
根據他們的模擬,8核心之后再往處理器內塞入更多的核心,并不能帶來性能提升,在數據處理應用中反而會出現性能下滑。“16核的表現就和雙核差不多”。他們近一年來和業內處理器廠商、超級計算機廠商以及超級計算機用戶進行了大量討論。得出的結論是,如果不對計算機架構作出修改,未來當出現16核32核處理器時,為超級計算機編程的程序員或許只好屏蔽部分核心,或是將這些處理器用于非重點運算應用。
● Intel的"80核CPU"其實是顆GPU
當然業界領袖Intel也意識到了多核CPU發展之路遇到了瓶頸,因此在準備傳統六核/八核處理器的同時,也在緊鑼密鼓的研制另一種群核處理器——GPU以及類似于GPU架構的混合處理器。
就拿Intel代號為“Larrabee”的GPU來說,它是對IA-32(x86)新指令集的一種擴展,其內部是由N顆Pentium處理器核心加上一個16路的向量處理器組合而成的。Larrabee最初的目標是獨立顯示處理領域,與CPU組合使用。可是Larrabee與GPU相比又有所不同,所謂的Larrabee是能夠支持某種程度scalar運算的支持單體OS的CPU。

80核心處理器結構示意圖
此外,Intel還公布了另一款研發中的80核心處理器實物和架構,事實上這是一顆徹頭徹尾的并行計算處理器,每顆核心都包括了兩個浮點運算單元,怎么看都像是一顆GPU的架構。從這個意義來看,Larrabee與80核CPU是Intel將來CPU產品的一面鏡子。現有的Core 2和Core i7處理器將來會如何向PC&服務器通用處理器進化呢?從這些變種處理器身上我們也可以看到2010年以后Intel的發展方向。
或許我們可以這樣認為,未來CPU與GPU之間的界限會非常模糊,多核CPU的架構設計會向現有GPU的模式靠攏,而GPU也不會滿足于僅處理一些無聊的3D渲染任務,在特定API及開發平臺的支持下,GPU將會取代CPU處理繁重的并行計算任務。
較多核CPU確實很誘人,但只能存在于實驗室中,距離我們似乎非常遙遠。由于較多核CPU的架構與目前的雙核/四核CPU有很大的不同,因此大家不必拘泥于傳統處理器的概念。其實較多核處理器“遠在天邊、近在眼前”——高配置電腦當中肯定擁有一顆GPU(顯卡),9800GTX+是128核心、GTX280則擁有240顆核心,GPU的每一個流處理器就是一顆核心。
目前X86架構的處理器經過30年的發展,指令集、平臺、系統和軟件支持已經接近完美,因此使用CPU處理數據是天經地義的。GPU雖然也誕生了近20年,但它從來都只能渲染圖形,想要讓他進入全新并行計算領域,無論硬件架構還是軟件平臺都需要作相應的調整。
● GPU在硬件架構方面的進步
傳統GPU的核心組成部分是Shader(著色器),分為Pixel Shader(像素單元)和Vertex Shader(頂點單元),每一個Shader是一個4D或5D的矢量運算單元,之所以設計成這樣是因為在圖形處理中,最常見的像素都是由RGB(紅黃藍)三種顏色構成的,加上它們共有的信息說明(Alpha),總共是4個通道。而頂點數據一般也是由XYZW四個坐標構成,這樣也是4個通道。在3D圖形進行渲染時,其實就是改變RGBA四個通道或者XYZW四個坐標的數值。為了一次性處理1個完整的像素渲染或幾何轉換,GPU的像素著色單元和頂點著色單元從一開始就被設計成為同時具備4次運算能力的運算器(ALU)。

傳統Shader結構的GPU只適合做圖形渲染
這樣的4D矢量運算單元在渲染3D圖形時會有很高的效率,但在處理復雜指令時的效率會大打折扣,比如DX10新引入的幾何著色、物理加速等,尤其在面對非圖形渲染指令時優勢全無。
NVIDIA的科學家對圖形指令結構進行了深入研究,它們發現標量數據流所占比例正在逐年提升,如果渲染單元還是堅持SIMD(單指令多數據流)設計會讓效率下降。為此NVIDIA在G80中做出大膽變革:流處理器不再針對矢量設計,而是統統改成了標量ALU單元。用通俗的話說就是:Shader單元內部ALU完全打散,設計成為各自獨立的流處理器,并分配相應的指令發射端和控制單元,這樣的架構在面對任何形式的指令(包括組合指令)時都能保證最高的執行效率,這也就是NVIDIA在DX10時代游戲性能大幅領先于競爭對手的根本原因!
隨著圖形畫面越來越復雜,1D、2D、3D指令所占比例正在逐年增多,而G80在遇到這種指令時可說是如魚得水,與普通4D指令一樣不會有任何效能損失,指令轉換效率高并且對指令的適應性非常好,這樣G80就將GPU Shader執行效率提升到了新的境界!
這種富有彈性的架構不僅擁有很強的圖形渲染能力,而且能夠處理以往不敢奢想的非圖形運算指令,理論上來講只要是浮點運算指令都可以交給GPU來處理。而在以往,程序員必須針對GPU的架構特點,對指令重新分類打包并模擬圖形指令交給GPU處理器,工作量可想而知,效率也極為低下。
G80的架構無論對于圖形渲染還是并行計算都是革命性的,但NVIDIA并沒有滿足于此,為了進一步提高GPU的并行計算效能,把GPU改造成為一顆真正的通用處理器,NVIDIA在GTX200核心大規模擴充流處理器數量的同時,也對內核架構進行了諸多優化與改進,使之更適合做超大規模并行數據處理。

GTX200核心的主要改進有:
- 每個SM(8個流處理器為一簇)可執行線程從768提升至1024條;
- 每個SM的指令寄存器容量翻倍,從16K提升至32K;
- 將雙指令執行(Dual-Issue)效率提升至94%,接近于理論值;
- 512Bit顯存控制器,4GB顯存容量支持,防止指令排隊溢出;
- 支持雙精度64Bit浮點運算,55nm版GTX200的雙精度運算能力提高4倍!
以上所有的改進(顯存位寬除外)并不會讓GTX200核心的圖形渲染能力得到提高,但卻能夠大幅提升GPU在進行海量數據處理時的效率。由此我們可以看出NVIDIA的野心與實力——G80與GTX200已經不再是一顆圖形處理器,而是較多核通用處理器!而NVIDIA這種圖形架構與并行計算架構合二為一的架構就被稱為CUDA。
任何硬件想要盡情地發揮性能離不開軟件的支持,GPU光有優秀的架構還是遠遠不夠的,如果沒有驅動和軟件的支持那就是一紙空談。所以,NVIDIA在G80核心發布之后,一直都在想方設法地釋放這種架構的能量。
● GPU在開發平臺方面的進步
于是,CUDA的概念誕生了,CUDA是Compute Unified Device Architecture的簡寫,中文含義是統一計算設備架構,它是建立在NVIDIA GeForce 8架構基礎上,并在GeForce 9和GTX200架構上改進優化并發揚光大。

CUDA是NVIDIA推出的一個并行計算架構。這個架構包含有一個ISA(指令集架構)以及并行計算的硬件引擎。就如同CPU的情況一樣,X86的架構也包含ISA和執行指令的硬件架構。各種應用程序都基于這個架構進行開發并在此上運行。可以說CUDA架構的GPU是圖形渲染架構與并行計算架構的合體!

NVIDIA提供的CUDA開發包中的C語言編譯器版本更新很快
CUDA本意就是一種架構,但很多人認為CUDA是一種語言、或者是開發平臺,這可能跟NVIDIA最初的宣傳、推廣策略有關系。在CUDA架構誕生之初(GeForce 8時代),尚不存在專門針對GPU并行計算的開發平臺以及編程語言,因此NVIDIA必須給程序員提供一種簡單、易上手、并且完整的軟件開發解決方案,這樣NVIDIA所發布的CUDA包當中就包括了針對GPU的C語言編譯器、糾錯器/制模器、專用驅動和標準函數庫等。

除了支持自家C語言編譯器之外,更多的語言及API都能運行在CUDA架構上
現在,越來越多的廠商和開發者意識到了GPU計算的重要性,于是各種開發語言及應用程序編程接口應運而生了,其中除了CUDA編譯器所提供的C語言之外,大家所熟知的Fortran、C++也會支持高性能GPU并行計算,另外近期發布的OpenCL及未來的DX11也會專門針對GPU開發相應的API。在整個產業的共同推動下,GPU計算可謂是前途無量!
不難看出,正是對于GPU通用計算敏銳的嗅覺以及前瞻性,讓NVIDIA站在了業界的前沿,并且加速了整個行業的發展。
NVIDIA有優秀的CUDA架構,還有自行開發的CUDA C編譯器,而AMD只強調開源,因此AMD在很早之前就對CUDA嗤之以鼻,并對OpenCL寄予厚望。然而NVIDIA對于OpenCL的熱情反而遠比AMD高漲,OpenCL標準出臺后就一直贊不絕口,并大力推廣,這是為什么呢?
首先,CUDA是一種架構,OpenCL是API(應用程序接口),兩者是完全不同的概念,不存在竟爭關系。既然OpenCL標準能夠進一步拓展GPU的應用領域,NVIDIA沒有理由不支持,事實上這也正是CUDA架構的設計初衷。
其次,OpenCL標準的倡導者——蘋果,是NVIDIA的親密合作伙伴,蘋果新一代MacBook將會全面采用NVIDIA的GeForce 9400M GPU以及GF9300整合GPU。NVIDIA還是第一家展示運行中的OpenCL程序的公司,NVIDIA的GPU自然能夠對OpenCL提供完美支持,擁有非常好的的并行計算效率。
最后,NVIDIA是OpenCL的標準制定者之一,NVIDIA公司副總裁Neil Trevett擔任Khronos OpenCL工作組的主席,該組織中還有多位骨干成員都是NVIDIA員工。
由此可見,與大方空話、誹謗競爭對手的AMD相比,NVIDIA顯然要務實很多!在公開標準尚未出臺之前,NVIDIA CUDA架構及C編譯器早已準備就緒,在GPU計算大勢所趨的情況下CUDA受到了開發者及科研人員的一致好評;在OpenCL標準制定過程中,NVIDIA也扮演著舉足輕重的角色,并擔負起改進與推廣的重任;與此同時,對于微軟正在開發的DirectX 11,NVIDIA也積極參與其中,絕不放棄任何能夠拓寬GPU市場的標準。
不管未來CUDA C語言、OpenCL API以及DX11 Computer Shader誰將成為業界標準、誰的使用率最高,NVIDIA都是GPU并行計算堅定不移的支持者,并對所有的語言及API提供完美支持,就像現有GPU同時支持DirectX 10及OpenGL圖形API一樣。
理清CUDA架構及OpenCL API之間的關系之后,再來研究下CUDA C語言與OpenCL之間的優劣,兩者有很多相似之處,存在著競爭與互補的雙重關系,但對于GPU硬件架構(如CUDA)來說是無差別的。
NVIDIA認為CUDA的基本理念因OpenCL的出現得到了增強。兩者的根本原理都是一樣的,但OpenCL是一種更底層的架構,需要開發人員自行編寫內存管理等等功能的代碼,而CUDA則可以讓那些非專業編程人員如科研工作者更簡單的編制GPGPU程序代碼。
簡言之,CUDA C語言與OpenCL的定位不同,或者說是用人群不同。CUDA C是一種高級語言,那些對硬件了解不多的非專業人士也能輕松上手;而OpenCL則是針對硬件的應用程序開發接口,它能給程序員更多對硬件的控制權,相應的上手及開發會比較難一些。
另外程序員的使用習慣也是非常重要的一方面,那些在X86 CPU平臺使用C語言的人員,會很容易接受基于CUDA GPU平臺的C語言;而習慣于使用OpenGL圖形開發的人員,看到OpenCL會更加親切一些,在其基礎上開發與圖形、視頻有關的計算程序會非常容易。
所以說,CUDA C語言與OpenCL是各有所長,是互補而非競爭關系,不會發生一方取代另一方的情況。就拿成熟的X86 CPU架構來講,各種開發語言不勝枚舉,C、C++、Basic、Fortran、Java……,每種語言都有自己的特色、都能找到適合自己的領域。現在針對GPU架構的語言及API還不夠多,目前僅有的CUDA C語言和OpenCL都還處在起步階段,相信未來會有更多的語言/API移植到GPU上來,CUDA架構為此已經做好了充分的準備。
關于GPU并行計算,其實AMD比NVIDIA更早提出了GPGPU(通用GPU)的概念,那么NVIDIA怎么看老對手AMD在并行計算方面的發展呢?現在我們就看看NVIDIA技術人員對于AMD的評價。
● 衡量GPU并行計算的主要指標就是浮點運算能力,根據理論值來看,AMD GPU似乎要比NVIDIA GPU高不少(HD4850達到1TFLOPS、HD4870 1.2TFLOPS),那NVIDIA GPU的優勢是什么?
答:的確,GPU的浮點運算能力非常重要,但這只是理論值而已,理論與實際存在很大的差距,尤其是在GPU架構截然不同的情況下,幾乎沒有可比性。目前超級計算機500強的排名是使用統一的軟件進行評估獲得的實際浮點運算性能,而并非理論值,采用NVIDIA Tesla GPU的超級計算機初出茅廬就排行第29,實際運算能力得到了充分肯定。
任何架構都有效率高低之分,GPU也不例外,NVIDIA CUDA架構的GPU執行各種復雜的圖形指令及非圖形指令都有著非常高的效率,而競爭對手的產品聽起來擁有較多的流處理器、理論浮點運算能力也很夸張,但實際性能如何呢,通過最新DX10游戲來看其效率很低,GPU的本職工作都做不好,何談指令更加復雜的并行計算呢?
● 科學研究對運算精度要求非常高,雙精度浮點運算使用率很高,NVIDIA GPU的雙精度運算能力只有單精度的1/8,而AMD雙精度性能是單精度的1/5,這是為什么呢?
答:確實,在不少應用領域都須需要雙精度浮點運算,這方面NVIDIA上代GPU做得還不夠好,當初主要考慮提升單精度浮點運算的能力和效率,在民用場合會得到非常出色的效能(比如視頻轉碼、物理加速等)。
不過,新一代Tesla產品的雙精度浮點運算能力將會提高至原來的4倍之多,新一代核心不僅僅是工藝改進頻率提升而已,事實上我們對內核架構作了進一步優化,每個SM內部FP64運算單元達4個,這樣NVIDIA下一代GPU的雙精度浮點運算能力可以達到單精度的1/2,性能提升非常可觀!
● 對于AMD的FireStream流處理加速卡,NVIDIA怎么看?
答:AMD FireStream比NVIDIA Tesla誕生得早,但由于架構和開發平臺問題,市場占有率及用戶認可度根本無法同Tesla相提并論。大家看到的多是有關產品方面的報道,而不是有關應用及解決方案方面,因為AMD根本拿不出什么像樣的應用軟件,目前最流行的Folding@Home蛋白質分布式運算以及AVIVO視頻轉碼,其實早在X1000時代就存在了,時至今日產品更新換代了三四代,但GPU運算效率并沒有得到提升,為什么呢?
因為AMD沒有給用戶提供一種系統的開發平臺,而是僅使用匯編一類的低級語言去進行GPGPU編程,這樣的開發效率極低,而且移植起來非常困難,針對不同架構的GPU需要重新編寫軟件才能提供支持。舉個最簡單的例子,HD4000剛發布時候的Folding@Home運算效能甚至還不如HD3000,要知道HD4000的理論性能是后者的2.5倍之多!
可以這么說,AMD的GPU架構純粹是針對圖形渲染設計的,而且很落后,因為NVIDIA很久以前的NV30就是這種SIMD架構,并行計算只是AMD圖形架構的副產品,所以AMD在面對并行計算時能有多高的效率值得懷疑。或許OpenCL的出現能給AMD一些機會,但AMD有的NVIDIA都有,而AMD沒有的正是NVIDIA的強項,優秀的CUDA架構再加上各類編譯器/API可以讓NVIDIA GPU大放異彩!
前面我們曾提到過,Intel未來較多核CPU的架構,將會吸取傳統CPU與GPU的優勢,重點提升浮點運算能力,而Intel也在緊鑼密鼓的研發自己的GPU,那么GPU與CPU在未來會發生什么變化呢?是GPU取代CPU,還是GPU與CPU合二為一?
● GPU不會取代CPU,但CPU的重要性正在削弱,GPU扮演更重要的角色
NVIDIA認為GPU是不會取代CPU的,CPU作為中央處理器仍然占有相當重要的位置,GPU只能處理大規模多線程的并行計算,并不是所有的程序都能良好的運行在GPU上,但幾乎所有的程序都有運行在CPU上的優秀代碼。
不過并行計算對于處理器性能的渴求幾乎是無止境的,也是未來推動電腦系統持續高速發展的重要動力,由于CPU在這方面的欠缺,CPU的價值正在快速下滑,隨著CUDA及OpenCL走向成熟,未來為GPU和并行運算優化的程序將大行其道。
試想,如果視頻編碼解碼、物理加速、科學計算、窮舉算法、數據庫分析等這類對CPU要求極為苛刻的應用,都改用GPU來處理器的話,誰還愿意去花那么多錢購買一顆四核CPU呢?四核CPU并不會讓操作系統及日常應用變得更快,此時高端顯卡將會吸引游戲玩家以外更多用戶的注意。
● 整合意味著低端,高性能電腦不需要也無法整合
GPU的重要性是毋庸置疑的,要不然AMD就不會收購ATI,Intel也不會到處挖墻角去研發自己的獨立GPU了。在獨立GPU高速發展的同時,我們也注意到AMD和Intel相繼公布了CPU與GPU整合計劃,那么GPU將何去何從呢?
整合就意味著低端,只保證基本的功能、而不在乎性能,目前主板上的整合顯卡、聲卡、網卡、Raid控制器等無不是這種情況。目前AMD和Intel公布的CPU整合GPU計劃,道理其實就跟內存控制器從北橋轉移至CPU內部一個道理,原本北橋整合的GPU被納入CPU之中,這樣有助于提高整合顯卡性能,并降低生產制造成本。
但是想要在CPU之中包含一顆高性能的GPU是不可能的,半導體制造工藝不允許,內存帶寬更不允許!我們知道中高端GPU的晶體管與核心面積要比CPU大很多,目前GTX200核心已經達到了65/55nm制造工藝的極限,要是能放入更多的晶體管早就誕生更強大的GPU了,何需等待?此外GPU對需要海量內存帶寬的支持,現有的雙通道/三通道DDR3根本就是杯水車薪,連CPU都滿足不了還想整合GPU進去?
所以,CPU整合GPU計劃本來就是定位中低端,這種解決方案很有創新意義,也會給用戶帶來很多實惠,但并不能影響到未來主流中高端CPU與GPU的發展。

Tagra處理器架構圖
當然,CPU也有可能被GPU整合,NVIDIA針對移動計算平臺發布的Tagra處理器就是很好的例子,通過它的模塊及架構設計來看,所有的處理模塊和功能模塊都被整合在了一起,按照比重來看應該說是GPU整合了CPU。未來類似于類似Atom一類的順序架構小型處理器被Chipset或GPU整合起來也很難說。
● 保持現狀,CPU+GPU異構計算引領發展
GPU的重要性與日俱增,但CPU的核心地位依然是無法撼動的,所以,在未來很長一段時間內還會保持CPU與GPU各自獨立發展的現狀不變,繼續在各自擅長的領域發揮熱量。

而計算機性能提升的方法,就來自于API和語言對GPU性能的釋放,未來無論是OpenCL 1.1還是CUDA 3.0,都會同時支持CPU與GPU的資源管理,合理分配指令與任務,只有充分調動所有的硬件模塊、消除瓶頸,才能釋放出最強性能!<
關注我們


