CUDA:領(lǐng)導(dǎo)GPU高性能計算的革命
1999年NVIDIA GeForce圖形處理器的發(fā)布,實現(xiàn)了頂點的矩陣變換和光照計算,真正意義上的GPU宣告誕生。隨著GeForce 3開始引出可編程特性,能將圖形硬件的流水線作為流處理器來解釋,基于GPU的通用計算也開始出現(xiàn)。
到了Nvidia GeForce6800這一代GPU,功能相對以前更加豐富、靈活。頂點程序可以直接訪問紋理,支持動態(tài)分支;象素著色器開始支持分支操作,包括循環(huán)和子函數(shù)調(diào)用,TMU支持64位浮點紋理的過濾和混合,ROP(象素輸出單元)支持MRT(多目標(biāo)渲染)等。象素和頂點可編程性得到了大大的擴展,訪問方式更為靈活,這些對于通用計算而言更是重要突破。
G80計算架構(gòu) |
真正的革命來自于2006年,NVIDIA在這一年推出了基于DX10統(tǒng)一渲染體系的旗艦圖形處理器G80,當(dāng)人們?yōu)槠鋸姾返?D效能驚嘆時,有誰又會想到NVIDIA這次會給那些GPU通用運算的支持者帶來的更加目瞪口呆的變革!
G80包含了128個處理器(最新的G200包含了240個處理器),在某些大規(guī)模并行計算的應(yīng)用上,相對于CPU來說性能提高可達(dá)100倍以上?,F(xiàn)代的GPU計算能力已經(jīng)遠(yuǎn)遠(yuǎn)的超過了CPU和其他的處理器。但是如此強大的計算能力如果只能應(yīng)用在圖形方面,對于計算資源來說是一個極大的浪費
◆ GPGPU與GPU計算
為了能夠在圖形計算之外的更多領(lǐng)域發(fā)揮GPU強大的計算功能,人們2002年就開始研究如何能夠利用GPU完成通常意義上的數(shù)據(jù)運算,這被稱之為GPGPU(General-Purpose computing on Graphics Processing Units,基于GPU的通用計算)。
由于第一代GPU的計算是基于矢量的運算(可以理解為基于數(shù)組的計算),因此第一代的GPGPU采取的技術(shù)方案是先將需要處理的計算問題轉(zhuǎn)化為能夠用矢量表示的問題,然后通過例如DirectX或者OpenGL這樣的圖形API完成計算取回結(jié)果。由于這些圖形API會使用GPU來完成相應(yīng)的計算,因此也就通過這種間接的方式實現(xiàn)了GPGPU。但是這種方式存在著很大的不便。
它的問題在于芯片設(shè)計本身是為了圖形而進(jìn)行設(shè)計的,所以是強制一個本為圖形設(shè)計的芯片之上的進(jìn)行通用用途的計算。而且在這種通用用途的GPU計算當(dāng)中,沒有辦法用高級程序語言比如C、C++語言進(jìn)行編程。
這就是為什么在2004年的時候,NVIDIA就專門請了相關(guān)硬件方面的設(shè)計師以及軟件方面的設(shè)計師對于GPU進(jìn)行重新的完全不同的以前的設(shè)計,它既適用于圖形,也是適用于計算的。
隨著統(tǒng)一渲染架構(gòu)的誕生,GPU本身的計算方式由基于矢量計算轉(zhuǎn)為了基于標(biāo)量的并行計算。當(dāng)擺脫了架構(gòu)和計算方式所帶來的限制之后,GPU所能處理的問題由圖形領(lǐng)域擴展到了通用計算領(lǐng)域。而在開發(fā)領(lǐng)域,需要有一種靈活的開發(fā)方式,能夠讓用戶直接使用GPU的計算能力,而CUDA正是為此而誕生。
這就是為什么現(xiàn)在可以在C語言的環(huán)境當(dāng)中,也就是所說的CUDA這個環(huán)境當(dāng)中對于GPU進(jìn)行編程,而這,也就是我們現(xiàn)在所說的GPU計算
◆ GPU是并行計算的高手
僅僅幾年的時間,可編程圖像處理器單元已經(jīng)發(fā)展成為絕對的計算主力,由于具有由高內(nèi)存帶寬驅(qū)動的多個核心,今天的GPU為圖像和非圖像處理提供了難以置信的資源。 #p#page_title#e#
GPU的浮點運算能力是CPU的十?dāng)?shù)倍 |
發(fā)展背后的主要原因是GPU是特定于計算密集的、高并行的計算,而這正是圖像渲染所需要的,因此GPU設(shè)計了更多的晶體管專用于數(shù)據(jù)處理,而非數(shù)據(jù)高速緩存和流控制。
GPU相比CPU擁有更多的處理單元 |
GPU的處理核心SP基于傳統(tǒng)的處理器核心設(shè)計,能夠進(jìn)行整數(shù),浮點計算,邏輯運算等操作,從硬體設(shè)計上看就是一種完全為多線程設(shè)計的處理核心,擁有復(fù)數(shù)的管線平臺設(shè)計,完全勝任每線程處理單指令的工作。
GPU內(nèi)的線程分成多種,包括像素、幾何以及運算三種不同的類型,在三維圖像處理模式下,大量的線程同時處理一個shader program以達(dá)到最大化的效率,所以像GTX 200 GPU的核心內(nèi)很大一部分面積都作為計算之用,和CPU上大部分面積都被緩存所占據(jù)有所不同,大約估計在CPU上有20%的晶體管是用作運算之用的,而(GTX 200)GPU上有80%的晶體管用作運算。GPU處理的首要目標(biāo)是運算以及數(shù)據(jù)吞吐量,而CPU內(nèi)部晶體管的首要目的是降低處理的延時以及保持管線繁忙,這也決定了GPU在密集行計算比起CPU來更有優(yōu)勢
具體來說,GPU專用于解決數(shù)據(jù)并行計算(同一程序在許多數(shù)據(jù)元素上并行執(zhí)行)、具有高運算密度(算術(shù)運算與內(nèi)存操作的比例)的問題。因為同一程序為每個數(shù)據(jù)元素執(zhí)行,所以對高級流控制具有較低的要求;又因為在許多數(shù)據(jù)元素上執(zhí)行并具有高運算密度,所以內(nèi)存訪問延遲可以使用計算而非大的數(shù)據(jù)高速緩存來隱藏。
數(shù)據(jù)并行處理將數(shù)據(jù)元素映射到并行處理線程。處理大型數(shù)據(jù)集合(比如數(shù)組)的許多應(yīng)用程序可以使用數(shù)據(jù)并行編程模型來加速計算。在3D渲染中,大型像素和頂點集合映射到并行線程。同樣的,圖像和媒體處理應(yīng)用程序,比如渲染圖像的后期處理、視頻編碼和解碼、圖像擴展、立體視覺、模式識別,可以將圖像塊和像素映射到并行處理線程。事實上,圖像渲染和處理以外的許多算法也是可由數(shù)據(jù)并行處理來加速,范圍涉及一般的信號處理或物理模擬,直至財務(wù)計算或計算生物學(xué)。
但是,直到現(xiàn)在,獲得GPU中的所有計算能力并將其有效用于非圖像應(yīng)用程序中仍然是一個難題,正如前面所說的困難,迫切需要一種新穎的硬件和編程模型,讓GPU的計算能力得以完全發(fā)揮,并將GPU暴露為一種真正通用的數(shù)據(jù)并行計算設(shè)備。
GPU計算,并不是說不再需要CPU了。
◆ GPU+CPU異構(gòu)運算
實際上,在GPU計算中CPU和GPU之間是相連的,而且是一個異構(gòu)的計算環(huán)境。這就意味著說你的應(yīng)用程序當(dāng)中,順序執(zhí)行這一部分的代碼是在CPU里面進(jìn)行執(zhí)行的,而并行的也就是計算密集這一部分是在GPU里面進(jìn)行。
到底什么是順序,什么是并行?用簡單例子說,假設(shè)每人手中都有一瓶水,這里有一個桶,要把這個桶裝滿,順序的話,就是一個人來了以后另外一個人再過來; 并行的話,所有人把水同時往桶里倒,這樣的話,顯然通過并行的方式速度會快很多。
而且這里還有另外一個區(qū)別,現(xiàn)在CPU里面可能是有雙核或者是四核,根據(jù)它們的發(fā)展路徑,下一站可能是八核。但現(xiàn)在GPU當(dāng)中核心的數(shù)量是以百來計算的,在CPU中,我們說的是Mutli-Core,大概就是多核的意思;但是GPU里面用的是Many-Core,意思是群核。
如果大家一同到這里往水桶里面倒水的話,就是一種并行;但如果只是一聲令下,所有人都到前面去到水,可能場面的秩序會很混亂,因此,在并行運算當(dāng)中,需要對它進(jìn)行控制,使它有秩序。就像一支部隊需要一名指揮官一樣來保證這個部隊能夠有序地服從命令。而從這個意義上來說,CUDA就像指揮官一樣,通過使用CUDA,這些程序能夠被有效、高效地使用。
實際上在并行運算當(dāng)中,數(shù)據(jù)是被分為一塊一塊地同時執(zhí)行。運算的結(jié)果也是同順序計算相同的,是按照一種并行的方式進(jìn)行表達(dá)的。
異構(gòu)運算(heterogeneous computing)的想法是這樣的,通過使用計算機上的主要處理器,如CPU以及GPU來讓程序得到更高的運算性能。一般來說,CPU由于在分支處理以及隨機內(nèi)存讀取方面有優(yōu)勢,在處理串聯(lián)工作方面是好手。在另一方面,GPU由于其特殊的核心設(shè)計,在處理大量有浮點運算的并行運算時候有著天然的優(yōu)勢。完全使用計算機性能實際上就是使用CPU來做串聯(lián)工作,而GPU負(fù)責(zé)并行運算,簡單來講,異構(gòu)運算就是“使用合適的工具做合適的事情”。
那么什么程序是以串聯(lián)工作為主而什么程序又是以并行的運算為主呢?其實只有很少很少的程序使用純粹的串聯(lián)或者并行的,大部分程序同時需要兩種運算形式。編譯器、文字處理軟件、瀏覽器、e-mail客戶端等都是典型的串聯(lián)運算形式的程序。而視頻播放,視頻壓制,圖片處理,科學(xué)運算,物理模擬以及3D圖形處理(Raytracing及光柵化)這類型的應(yīng)用就是典型的并行處理程序。
◆ CUDA:一種在GPU上進(jìn)行計算的新架構(gòu)
前面我們提到過CUDA,那CUDA到底是何方神圣呢?
它是我們迫切需要的新穎的硬件和編程模型,能讓GPU的計算能力得以完全發(fā)揮,并將GPU暴露為一種真正通用的數(shù)據(jù)并行計算設(shè)備。
CUDA表示Compute Unified Device Architecture(統(tǒng)一計算設(shè)備架構(gòu)),是NVIDIA為自家的GPU編寫了一套編譯器及相關(guān)的庫文件。作為一種新型的硬件和軟件架構(gòu),用于將GPU上作為數(shù)據(jù)并行計算設(shè)備在GPU上進(jìn)行計算的發(fā)放和管理,而無需將其映射到圖像API。
CUDA提供了硬件的直接訪問接口,不必依賴圖形API |
CUDA可用于GeForce 8系列、Tesla解決方案和一些Quadro解決方案,操作系統(tǒng)的多任務(wù)機制負(fù)責(zé)管理多個并發(fā)運行的CUDA和圖像應(yīng)用程序?qū)PU的訪問。
CUDA采用C語言作為編程語言提供大量的高性能計算指令開發(fā)能力,使開發(fā)者能夠在GPU的強大計算能力的基礎(chǔ)上建立起一種效率更高的密集數(shù)據(jù)計算解決方案。CUDA是業(yè)界的首款并行運算語言,而且其非常普及化,目前有高達(dá)8千萬的PC用戶可以支持該語言。
CUDA的特色如下,引自NVIDIA的官方說明:
1、為并行計算設(shè)計的統(tǒng)一硬件軟件架構(gòu)。有可能在G80系列上得到發(fā)揮。
2、在GPU內(nèi)部實現(xiàn)數(shù)據(jù)緩存和多線程管理。這個強,思路有些類似于XB360 PS3上的CPU編程。
3、在GPU上可以使用標(biāo)準(zhǔn)C語言進(jìn)行編寫。
4、標(biāo)準(zhǔn)離散FFT庫和BLAS基本線性代數(shù)計算庫。
5、一套CUDA計算驅(qū)動。
6、提供從CPU到GPU的加速數(shù)據(jù)上傳性能。瓶頸就在于此。
7、CUDA驅(qū)動可以和OpenGL DirectX驅(qū)動交互操作。這強,估計也可以直接操作渲染管線。
8、與SLI配合實現(xiàn)多硬件核心并行計算。
9、同時支持Linux和Windows。
◆ CUDA的軟件硬件需求
CUDA支持的GPU (CUDA-enabled GPU)包含GeForce、Quadro和Tesla三個系列:GeForce是NVIDIA公司面向消費市場的GPU產(chǎn)品;Quadro是面向?qū)I(yè)圖形市場的GPU產(chǎn)品;而Tesla則是專門面向GPU計算的產(chǎn)品,它不具備圖形輸出的功能,因此不能作為圖形卡來使用。這三個產(chǎn)品面向不同的應(yīng)用領(lǐng)域,因此建議在開發(fā)和部署CUDA應(yīng)用的時候需要考慮到產(chǎn)品的應(yīng)用決定采用不同的GPU。
NVIDIA的CUDA-enabled GPU具有一個完整的產(chǎn)品線,各種用戶都可以從中選擇到合適自己的產(chǎn)品。對于有高密度計算能力需求的用戶來說,Quadro和Tesla則是必須的選擇。諸如Quadro Plex 1000 Model S4和Tesla S870在一個1U高度的標(biāo)準(zhǔn)服務(wù)器機架機箱內(nèi)裝備了四個GPU,每個GPU具備128個stream processor以及1.5GB的存儲器,每個1U裝置總共具備512個stream processor和6GB存儲器,非常適合于有高密度、大規(guī)模數(shù)據(jù)計算需求的用戶。
另外,CUDA對于GPU產(chǎn)品線還涵蓋了從筆記本電腦到高性能多GPU的系統(tǒng)中。也就是說,對于普通用戶來講,我們使用的普通筆記本或者臺式電腦,只要擁有一塊NVIDIA的GeForce 8以上級別的顯卡都能夠支持CUDA。
CUDA-enabled GPU的家族還在不斷地擴大之中,隨著NVIDIA新一代GPU的發(fā)布,更多的產(chǎn)品也將加入到這個行列中來。
軟件方面,對于普通的應(yīng)用者來說,只要安裝了一款能夠支持CUDA的驅(qū)動程序,就可以了。接下來需要做的就是使用那些能夠支持CUDA的軟件。隨著越來越多的軟件開發(fā)者加入CUDA的行列,日后能夠支持CUDA的軟件將會逐漸完善起來。
◆ CUDA的本質(zhì)
CUDA的本質(zhì)是,NVIDIA為自家的GPU編寫了一套編譯器NVCC極其相關(guān)的庫文件。CUDA的應(yīng)用程序擴展名可以選擇是.cu,而不是.cpp等。
NVCC是一個預(yù)處理器和編譯器的混合體。當(dāng)遇到CUDA代碼的時候,自動編譯為GPU執(zhí)行的代碼,也就是生成調(diào)用CUDA Driver的代碼。如果碰到Host C++代碼,則調(diào)用平臺自己的C++編譯器進(jìn)行編譯,比如Visual Studio C++自己的Microsoft C++ Compiler。然后調(diào)用Linker把編譯好的模塊組合在一起,和CUDA庫與標(biāo)準(zhǔn)CC++庫鏈接成為最終的CUDA Application。由此可見,NVCC模仿了類似于GCC一樣的通用編譯器的工作原理(GCC編譯CC++代碼本質(zhì)上就是調(diào)用cc和g++)。
CUDA在執(zhí)行的時候是讓host里面的一個一個的kernel按照線程網(wǎng)格(Grid)的概念在顯卡硬件(GPU)上執(zhí)行。每一個線程網(wǎng)格又可以包含多個線程塊(block),每一個線程塊中又可以包含多個線程(thread)。
以軍隊來打比方,每一個線程,就相當(dāng)于每一個士兵,當(dāng)要執(zhí)行某一個大的軍事任務(wù)的時候,大將軍(Host)發(fā)布命令,把這次行動分解成一個一個的子任務(wù)(kernel_1,kernel_2……kernel_M),每個子任務(wù)由不同的統(tǒng)領(lǐng)(Grid)負(fù)責(zé),各統(tǒng)領(lǐng)又把任務(wù)分成一部分一部分,劃分給手下的小頭目(Block),這些任務(wù)就由小頭目下的士兵(Thread)去執(zhí)行完成。
通過CUDA編程時,將GPU看作可以并行執(zhí)行非常多個線程的計算設(shè)備(compute device)。它作為主CPU的協(xié)處理器或者主機(host)來運作:換句話說,在主機上運行的應(yīng)用程序中數(shù)據(jù)并行的、計算密集的部分卸載到此設(shè)備上。
經(jīng)過了CUDA對線程、線程塊的定義和管理,在支持CUDA的GPU內(nèi)部實際上已經(jīng)成為了一個迷你網(wǎng)格計算系統(tǒng)。在內(nèi)存訪問方面,整個GPU可以支配的存儲空間被分成了寄存器(Register)、全局內(nèi)存(External DRAM)、共享內(nèi)存(Parallel Data Cache)三大部分。其中寄存器和共享內(nèi)存集成在GPU內(nèi)部,擁有極高的速度,但容量很小。共享內(nèi)存可以被同個線程塊內(nèi)的線程所共享,而全局內(nèi)存則是我們熟知的顯存,它在GPU外部,容量很大但速度較慢。經(jīng)過多個級別的內(nèi)存訪問結(jié)構(gòu)設(shè)計,CUDA已經(jīng)可以提供讓人滿意的內(nèi)存訪問機制,而不是像傳統(tǒng)GPGPU那樣需要開發(fā)者自行定義。
在CUDA的幫助下普通程序員只要學(xué)習(xí)一點點額外的GPU架構(gòu)知識,就能立刻用熟悉的C語言釋放GPU恐怖的浮點運算能力,通過CUDA所能調(diào)度的運算力已經(jīng)非常逼近萬億次浮點運算(GeForce 280GTX單卡浮點運算能力為933GF LOPS)。而在此之前要獲得萬億次的計算能力至少需要購買價值幾十萬元的小型機。
◆ CUDA的應(yīng)用領(lǐng)域與發(fā)展前景
由于GPU的特點是處理密集型數(shù)據(jù)和并行數(shù)據(jù)計算,因此CUDA非常適合需要大規(guī)模并行計算的領(lǐng)域。目前CUDA除了可以用C語言開發(fā),也已經(jīng)提供FORTRAN的應(yīng)用接口,未來可以預(yù)計CUDA會支持C++、Java、Python等各類語言。雖然現(xiàn)在更多的應(yīng)用在游戲、圖形動畫、科學(xué)計算、地質(zhì)、生物、物理模擬等領(lǐng)域,但是由于GPU本身的通用特性和CUDA提供的方便的開發(fā)環(huán)境,我們可以放開思維的束縛,想象幾種可能的應(yīng)用場景:
◇ 搜索引擎中的排序、文本分類等相關(guān)算法的應(yīng)用
◇ 數(shù)據(jù)庫、數(shù)據(jù)挖掘
◇ 電信、金融、證券數(shù)據(jù)分析
◇ 數(shù)理統(tǒng)計分析
◇ 生物醫(yī)藥工程
◇ 導(dǎo)航識別
◇ 軍事模擬
◇ 無線射頻模擬
◇ 圖像語音識別
這些領(lǐng)域內(nèi)的計算都是屬于大規(guī)模的數(shù)據(jù)密集型計算,因此我們完全有理由相信,在CUDA的驅(qū)動下,GPU能夠在這些領(lǐng)域建立一個屬于自己的新時代
◆ CUDA應(yīng)用舉例:實時的裸眼立體醫(yī)療成像系統(tǒng)
在成像技術(shù)中,一個非常有趣的領(lǐng)域就是裸眼立體成像技術(shù),它無需特殊眼鏡就能顯示三維立體圖像。這種有趣的技術(shù)不僅有著娛樂方面的應(yīng)用潛力,也可作為多種專業(yè)應(yīng)用程序的實用技術(shù)。東京大學(xué)信息科學(xué)與技術(shù)研究生院機械信息系的Takeyoshi Dohi教授與他的同事研究了NVDIA的CUDA并行計算平臺之后認(rèn)為,醫(yī)療成像是這種平臺非常有前途的應(yīng)用領(lǐng)域之一。
自2000年以來,這所大學(xué)的研究小組已經(jīng)開發(fā)出一種系統(tǒng),通過CT或MRI掃描實時獲得的活體截面圖被視為體紋理,這種系統(tǒng)不僅能夠通過體繪制再現(xiàn)為三維圖像,還可作為立體視頻顯示,供IV系統(tǒng)使用。該系統(tǒng)為實時、立體、活體成像帶來了革命性的變化。但是,它的計算量極其龐大,僅體繪制本身就會帶來極高的處理工作量,況且此后還需要進(jìn)一步處理來實現(xiàn)立體成像。對于每一個圖像幀,都有眾多角度需同時顯示。將此乘以視頻中的幀數(shù),您會看到令人震驚的龐大計算數(shù)量,且必須在很短的時間內(nèi)高度精確地完成這樣的計算。
在2001年的研究中,使用了一臺Pentium III 800 MHz PC來處理一些512 x 512解析度的圖片,實時體繪制和立體再現(xiàn)要花費10秒鐘以上的時間才能生成一幀。為了加速處理,研究小組嘗試使用配備60塊CPU的UltraSPARC III 900 MHz機器,這是當(dāng)時性能最高的計算機。但可以得到的最佳結(jié)果也不過是每秒鐘五幀。從實用的角度考慮,這樣的速度還不夠快。
研究人員使用NVIDIA GPU GeForce 8800 GTX開發(fā)了一個原型系統(tǒng)。在使用CUDA的GPU上運行2001年研究所用的數(shù)據(jù)集時,性能提升到每秒13至14幀。UltraSPARC系統(tǒng)的成本高達(dá)數(shù)千萬日元,是GPU的上百倍,而GPU卻交付了幾乎等同于其三倍的性能,研究人員為此感到十分驚訝。不僅如此,根據(jù)小組的研究,NVIDIA的GPU比最新的多核CPU至少要快70倍。另外,測試顯示,對于較大規(guī)模的體紋理數(shù)據(jù),GPU的性能更為突出。
目前,這支研究小組正運用NVDIA最新的桌面端超級計算機Tesla D870,針對使用CUDA的Tesla優(yōu)化目前的IV系統(tǒng)。這一舉措有望使性能獲得更大幅度的提升效果。
◆ CUDA應(yīng)用舉例:Photoshop圖形處理加速
Adobe Photoshop是業(yè)界最常用最強大的圖像處理軟件,從CS3版本開始,它支持3D圖形處理。而最新的CS4版本是首個正式支持GPU加速功能圖像處理軟件,現(xiàn)在只要大家擁有一片GeForce或Quadro顯卡,就可以體驗實時高效的GPU加速操作,常用的處理包括圖像縮放、圖像旋轉(zhuǎn)、圖像移動等等。加速這些常用操作會令用戶大大提升工作效率,讓我們輕松愉快地沉醉于創(chuàng)作之中。
GPU加速的圖片快速縮放:
通過GPU加速,Photoshop CS4用戶可以快速流暢的放大圖片,給用戶一個舒適的操作環(huán)境 |
普通縮放:
對比沒有使用GPU加速的圖片縮放操作,就可以感受到兩者之間的巨大差別,想象一下這樣子的操作是多么的不爽和郁悶 |
◆ CUDA應(yīng)用舉例:金融業(yè)LIBOR
金融行業(yè)的研究人員也采用了金融計算研究用途的GPU。上圖選自一名在GPU性能研究方面已經(jīng)獲得卓越成就的牛津大學(xué)的研究人員。即便與專門的加速設(shè)備比較時,GPU也能提供遠(yuǎn)比一個單獨CPU或CPU加上加速器高得多的性能。
◆ CUDA應(yīng)用舉例:VMD/NAMD分子動力學(xué)
NAMD MD是一個重要的醫(yī)學(xué)應(yīng)用程序類別。分子動力學(xué)是一種用于生物學(xué)研究的基本工具。之前,伊力諾依州立大學(xué)的研究人員在它們的網(wǎng)站上發(fā)布了一款 GPU加速版的視覺分子動力學(xué)工具,而最近,又發(fā)布了一款納米級分子動力學(xué)工具。該工具可以從他們的網(wǎng)站上免費下載。NAMD MD是將并行計算應(yīng)用于生物學(xué)中的基本工具的一個典型案例。
◆ CUDA應(yīng)用舉例:N體天體物理學(xué)
第一個利用GPU的科學(xué)領(lǐng)域是天體物理學(xué),去年11月,天體物理學(xué)家舉行了第一次GPU加速天體物理學(xué)應(yīng)用軟件的研究會議。上圖為研究人員利用GPU在一臺普通的PC上模擬2百萬個粒子,GPU強大的并行計算能力幫助這位研究人員做到了這一點。
◆ CUDA應(yīng)用舉例:Manifold 8地理信息
CUDA作為第一款標(biāo)配應(yīng)用軟件用于地理信息系統(tǒng)(GIS)處理。該軟件可制作出一幅地圖,并疊加上人口信息,如該區(qū)域居民的年齡、住房類型、公路的數(shù)量等等 所有描述居住區(qū)的信息。規(guī)劃人員使用GPU可以正確設(shè)計道路、房屋以及各種服務(wù)的位置,打造更加高效的城市。
◆ CUDA應(yīng)用舉例:視頻轉(zhuǎn)換加速
利用CUDA實現(xiàn)GPU計算來為應(yīng)用程序提速,Badaboom就是很好的一例,這是一款CUDA開發(fā)的視頻轉(zhuǎn)換軟件,可以把mpeg2的視頻轉(zhuǎn)換為ipod或者iphone這樣的所使用的H.264視頻格式。
GPU也可以給視頻轉(zhuǎn)換提速,處理速度達(dá)到80FPS左右,耗時37秒 |
選取一段碼率較高的MPEG2視頻,可以看到GTX 280的處理速度達(dá)到了80FPS左右,如果碼率較小,還可以達(dá)到100FPS以上甚至更高。328MB的MPEG2視頻轉(zhuǎn)換成17.4MB的iPhone可用的MP4視頻(640*365),只用了37s。而同樣平臺下用CPU進(jìn)行計算,得到的結(jié)果是耗時107s,幾乎是用GTX 280轉(zhuǎn)換耗時的三倍。
◆ CUDA應(yīng)用舉例:Folding@home
利用GTX 280的并行計算能力模擬蛋白質(zhì)折疊 |
Folding@home是美國史丹佛大學(xué)推動的分散式運算計劃,目的在于使用聯(lián)網(wǎng)式的計算方式和大量的分布式計算能力來模擬蛋白質(zhì)折疊的過程,并指引對由折疊引起的疾病的一系列研究。NVIDIA的CUDA顯卡也加入了Folding@home計劃,目前全球有8000萬塊CUDA顯卡(GeForce 8及以上及Quadro和Tesla系列),平均擁有100GFLOPS的浮點運算能力,如果這其中有0.1%參與Folding@Home,就能夠為該計劃帶來7PFLOPS的運算能力,遠(yuǎn)遠(yuǎn)高于全世界最強大的超級計算機(運算能力不足1PFLOPS)。
◆ CUDA:主導(dǎo)GPU計算的革命
GPU超強的計算能力讓它在通用計算領(lǐng)域大有可為,而CUDA則讓它變成可能,簡單易用的開發(fā)環(huán)境讓CUDA主導(dǎo)起GPU計算的革命。
正如NVIDIA首席科學(xué)家David Kirk所說:“我認(rèn)為CUDA已經(jīng)取得了空前成功,它的接受程度令人吃驚。這也表明了人們希望對整臺電腦進(jìn)行編程的濃厚興趣。過去人們往往是編寫一個C程序來控制CPU,再編寫一個圖形程序來控制GPU。你一定想通過編寫一個程序來控制CPU和GPU。因此我堅信,將來CUDA將變得無處不在。如果要對CPU和GPU進(jìn)行編程并管理系統(tǒng)中的所有資源,那就沒有理由不用CUDA。”
GPU正逐漸將并行計算推向主流,并行計算與異構(gòu)處理器系統(tǒng)的“聯(lián)姻”將是大勢所趨。而主導(dǎo)這場變革的就是CUDA。隨著越來越多的開發(fā)者加入到CUDA懷抱,支持CUDA的軟件必將滲透到我們生活的方方面面,億萬次的計算能力是我們充滿期待最好的詮釋。
◆ CUDA Q&A
讓我們來聽聽NVIDIA亞太區(qū)技術(shù)市場經(jīng)理鄧培智先生是如何看待GPGPU和CUDA的。
Q:CUDA和GPGPU在概念上有何不同?
A:GPGPU其實是一個比較寬泛的概念,它的計算還是通過API送入GPU的。傳統(tǒng)的GPGPU應(yīng)用往往要了解OpenGL編程或者DirectX編程;而現(xiàn)在基于CUDA平臺,如果你的應(yīng)用不涉及OpenGL或者DirectX的話就可以不用理會那些API。換句話說,以前的GPGPU進(jìn)行通用計算是通過把這些問題轉(zhuǎn)換成為圖形計算送到GPU中完成的,而現(xiàn)在基于CUDA則可以直接調(diào)用GPU的計算資源,成為高性能計算的軟件開發(fā)環(huán)境。
Q:CUDA是面向什么樣的人群的?能夠解決什么問題?
A:簡單地講,CUDA是用于GPU計算的開發(fā)環(huán)境,其核心則是一個C的編譯器。CUDA對于非圖形的計算并沒有什么限制,不過它還是相對比較適合高度并行的計算,畢竟這是它的長處。我們講高度并行,也就是說同時運行相當(dāng)多個線程。相對于CPU來講,雙核的CPU也許幾個線程就能充滿它整個的計算單元,然而CUDA-enabled GPU卻能夠容納上千個線程。所以常遇到的高性能計算領(lǐng)域的問題就特別適用于CUDA,而之前我們也許只能使用集群的方式來進(jìn)行計算。
Q:聽起來很不錯!那基于CUDA的GPGPU應(yīng)用能夠完成通常意義上的所有計算嗎?
A:是這樣的,就像我們剛才說的那樣,CUDA還是主要去做那些能夠分成很多個獨立線程的數(shù)值計算。比如說矩陣的乘法計算,矩陣相對應(yīng)的元素的計算是沒有什么聯(lián)系的,可以很多個線程同時送入很多個處理器進(jìn)行并行處理,這就非常適合于用CUDA來解決。當(dāng)然并不是所有的事情CUDA都能夠很好地解決,比如像操作系統(tǒng)這樣復(fù)雜的指令和紛繁的分支循環(huán)而又用很少的線程來處理,這顯然就不是CUDA的強項了。高度并行的計算是CUDA的技術(shù)特性之一。
Q:我們都知道,以前的GPU是不能處理類似于邏輯控制的指令的?現(xiàn)在的GPU芯片的發(fā)展情況是如何的呢?
A:現(xiàn)在是完全可以的。其實從我們的GeForce6一代開始,就能夠支持比較復(fù)雜的控制指令,比如條件轉(zhuǎn)移、分支、循環(huán)和子程序調(diào)用等。而到了GeForce8這一代,我們的程序控制能力又增強了很多,支持的程序長度也得到了更大的擴展,也就是說利用GPU還是可以寫一些比較復(fù)雜的程序。
Q:GPU里面包含的128個stream processor的計算能力跟CPU相比如何呢?
A:其實,GPU的stream processor個數(shù)是不能和CPU現(xiàn)在擁有的內(nèi)核數(shù)量作類比的。CPU的每一個核心都是一個完整的CPU,而GPU中的每個stream processor并不完全是這樣,它有一個組織方式,比如每8個stream processor組成一個Stream Multiprocessors (SM),每兩個SM組成一個PTC。而指令的執(zhí)行,我們GPU計算是基于線程的,每幾十個線程組成一個我們叫做warps,這些線程在每個warps里面都工作在SIMD(單指令多數(shù)據(jù))的方式。
Q:GPU中談的線程和CPU中的線程似乎有些不太一樣,區(qū)別在哪里呢?
A:GPU中的線程是一種非常輕量級的線程,創(chuàng)建線程的開銷非常小,比如說一個頂點計算中要做一個兩個矩陣的乘法運算,每個元素的相乘操作都會作為一個線程的任務(wù)提交到GPU中。而CPU中的線程所做的就比這個要多得多了,除了數(shù)據(jù)計算還可能會包含大量邏輯控制方面的指令。
Q:CUDA已經(jīng)發(fā)布了1.1版本嗎?相對于1.0有什么變化?
A:對。主要是做了一些小的升級,改變了對C語言的支持的改進(jìn),增加了對新的指令和格式的支持等等,功能上沒有什么太大的變化。不久也將會發(fā)布一個GPU的Debugger,以后將會支持新的C語言的版本,現(xiàn)在是支持到VC7.1和VC8.0,也就是Visual Studio .Net和Visual Studio 2005,以后會支持Visual Studio 2008,還會增加對Vista的支持,值得一提的是,今年會增加對雙精度的支持。而且CUDA的驅(qū)動程序也整合到了顯卡的驅(qū)動程序里面。
Q:所謂的支持這些開發(fā)環(huán)境,指的是CUDA的編譯器nvcc可以和這些開發(fā)環(huán)境聯(lián)立起來編譯項目?
A:對,你說的很對,就是指編譯器能夠和VC協(xié)同工作。實際上我們的編譯器nvcc會把CPU code和GPU code分開,CPU code還需要使用傳統(tǒng)的編譯器編譯,而GPU code就能通過nvcc編譯成GPU的代碼。
Q:如果開發(fā)人員想建立一個CUDA的開發(fā)環(huán)境,只能使用NVIDIA的GPU嗎?
A:對,現(xiàn)在來看是這樣的。因為其他公司的GPU的架構(gòu)我們也不清楚,而且也不一定適應(yīng)大規(guī)模的計算。我們NVIDIA的GPU考慮到要進(jìn)行計算,每一個stream processor都采用標(biāo)量架構(gòu),而有的公司則是使用矢量計算,可能在效率上會存在一些問題;再說CUDA的運行需要顯卡驅(qū)動的支持,我們也不可能要求其他廠商的驅(qū)動支持我們的CUDA。
退一步說,我們的顯卡市場占有率還是比較高的,大致在60%左右,所以應(yīng)該造成的影響不會太大。況且CUDA都使用在中高端領(lǐng)域,而在中高端市場我們則有更高的市場占有率,絕大部分的用戶都在使用NVIDIA的GPU,所以絕大部分的用戶都可以使用CUDA。
Q:從已經(jīng)實現(xiàn)的案例中,CUDA通常都應(yīng)用在哪些領(lǐng)域呢?
A:從高層的應(yīng)用角度分析,那就很多了。比如有限元的計算、神經(jīng)元的研究計算、地質(zhì)分析等等科學(xué)研究的領(lǐng)域;比如游戲中的物理模擬等問題。當(dāng)然目前GPU計算的應(yīng)用還是處于一個早期的階段,大部分CUDA應(yīng)用都是專業(yè)人員和相關(guān)的程序員在開發(fā),我們希望以后會有實際的基于CUDA的程序,更多的程序員能夠加入進(jìn)來,并且開發(fā)一些可以給大家日常應(yīng)用帶來好處的程序,只要有支持CUDA的GPU就能夠利用到GPU計算的好處。
Q:把現(xiàn)有的軟件,當(dāng)然都是使用CPU計算的,移植到CUDA平臺使用GPU的計算能力來加速的話需要多大的工作量?
A:這個就要看情況了。如果說以前在單個CPU上跑的應(yīng)用,可能在并行性上沒有太多的考慮,要想使用CUDA來利用GPU計算的資源,就要改寫程序中的計算部分,以便于更好地利用GPU的能力,畢竟CUDA非常適用于大規(guī)模的高度并行的高性能計算。所以最好還是在程序一開始編寫的時候就用CUDA這種模式編寫,如果移植以前的程序可能還是會涉及到很多其他的問題。
Q:你認(rèn)為很多初次接觸CUDA的人對于CUDA是否會有一些理解有誤的地方?
A:這是個好問題,顯然他們在這里存在幾個常見的誤解。
第一,可能有人認(rèn)為“有了GPU之后CPU就不需要了”,顯然GPU和CPU還是做不同的工作的,GPU的計算主要集中在高效率低成本的高性能并行計算;
第二,有人覺得“有GPU做計算CPU就不需要很強大”,但事實上在一個系統(tǒng)里面,一個高效的GPU配合一個高效的CPU,整體的效率還是會有明顯提升的,這些都是明顯的誤解;
第三,也許不叫誤解,應(yīng)該是更多的人對于CUDA的應(yīng)用范圍不是很了解。其實說穿了,CUDA適合于并行計算,大規(guī)模的并行計算,成千上萬的線程的并行計算