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