日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gpu 概论

發(fā)布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gpu 概论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

GPU通用計算調(diào)研報告

摘要:NVIDIA公司在1999年發(fā)布GeForce256時首先提出GPU(圖形處理器)的概念,隨后大量復(fù)雜的應(yīng)用需求促使整個產(chǎn)業(yè)蓬勃發(fā)展至今。GPU在這十多年的演變過程中,我們看到GPU從最初幫助CPU分擔(dān)幾何吞吐量,到Shader(著色器)單元初具規(guī)模,然后出現(xiàn)Shader單元可編程性,到今天GPU通用計算領(lǐng)域蓬勃發(fā)展這一清晰軌跡。本報告首先根據(jù)搜集到的資料記錄GPU通用計算的發(fā)展過程中硬件和軟件的演變,然后介紹并簡要比較現(xiàn)在比較流行的GPU通用計算編程模型,最后對GPU通用計算在不同領(lǐng)域的成功應(yīng)用進(jìn)行概述。

關(guān)鍵詞:GPU??GPU通用計算??可編程單元??編程模型??GPGPU應(yīng)用

?

1GPU通用計算的背景和動機

???????GPU英文全稱Graphic Processing Unit,中文翻譯為“圖形處理器”。GPU從誕生之日起就以超越摩爾定律的速度發(fā)展,運算能力不斷提升。業(yè)界很多研究者注意到GPU進(jìn)行計算的潛力,于2003年SIGGRAPH大會上提出了GPGPU(General-purpose computing on graphics processing units)的概念。GPU逐漸從由若干專用的固定功能單元(Fixed Function Unit)組成的專用并行處理器向以通用計算資源為主,固定功能單元為輔的架構(gòu)轉(zhuǎn)變。

?

1.1???為什么要用GPU進(jìn)行計算

?????GPU在處理能力和存儲器帶寬上相對于CPU有明顯優(yōu)勢,在成本和功耗上也不需要付出太大代價。由于圖形渲染的高度并行性,使得GPU可以通過增加并行處理單元和存儲器控制單元的方式提高處理能力和存儲器帶寬。GPU設(shè)計者將更多的晶體管用作執(zhí)行單元,而不是像CPU那樣用作復(fù)雜的控制單元和緩存并以此來提高少量執(zhí)行單元的執(zhí)行效率[1]。圖1?CPUGPU中的邏輯架構(gòu)進(jìn)行了對比。


圖1?CPU和GPU邏輯架構(gòu)對比

CPU的整數(shù)計算、分支、邏輯判斷和浮點運算分別由不同的運算單元執(zhí)行,此外還有一個浮點加速器。因此,CPU面對不同類型的計算任務(wù)會有不同的性能表現(xiàn)。而GPU是由同一個運算單元執(zhí)行整數(shù)和浮點計算,因此,GPU的整型計算能力與其浮點能力相似。目前,主流GPU都采用了統(tǒng)一架構(gòu)單元,憑借強大的可編程流處理器陣容,GPU在單精度浮點運算方面將CPU遠(yuǎn)遠(yuǎn)甩在身后[1]。最頂級的英特爾Core i7 965處理器,在默認(rèn)情況下,它的浮點計算能力只有NVIDIA GeForce GTX 280?1/13,與AMD Radeon HD 4870相比差距就更大。


圖2?CPU?和?GPU?的每秒浮點運算次數(shù)和存儲器帶寬

GPU運算相對于CPU還有一項巨大的優(yōu)勢,那就是其內(nèi)存子系統(tǒng),也就是GPU上的顯存[1]。當(dāng)前桌面級頂級產(chǎn)品3通道DDR3-1333的峰值是32GB/S,實測中由于諸多因素帶寬在20 GB/S上下浮動。AMD HD 4870 512MB使用了帶寬超高的GDDR5顯存,內(nèi)存總線數(shù)據(jù)傳輸率為3.6T/s或者說107GB/s的總線帶寬。NVIDIA GTX280使用了高頻率GDDR3顯存,但是其顯存控制器支持的位寬達(dá)到了512bit,搭載160.8ns GDDR3顯存,帶寬高達(dá)驚人的142GB/s。而主流GPU普遍擁有40-60 GB/s顯存帶寬。存儲器的超高帶寬讓巨大的浮點運算能力得以穩(wěn)定吞吐,也為數(shù)據(jù)密集型任務(wù)的高效運行提供了保障。

???????還有,從GTX200和HD 4870系列GPU開始,AMD和NVIDIA兩大廠商都開始提供對雙精度運算的支持,這正是不少應(yīng)用領(lǐng)域的科學(xué)計算都需要的。NVIDIA公司最新的Fermi架構(gòu)更是將全局ECC(Error Checking and Correcting)、可讀寫緩存、分支預(yù)測等技術(shù)引入到GPU的設(shè)計中,明確了將GPU作為通用計算核心的方向。

GPU通用計算被越來越多的采用,除了GPU本身架構(gòu)的優(yōu)越性,市場需求也是重要的原因。比如很多企業(yè)或科研單位無法布置昂貴的的計算機集群,而大部分普通用戶PC上裝配的GPU使用率很低,提高GPU利用率的有效途徑就是將軟件的部分計算任務(wù)分配到GPU上,從而實現(xiàn)高性能、低功耗的最終目標(biāo)。

1.2?什么適合GPU進(jìn)行計算

???????盡管GPU計算已經(jīng)開始嶄露頭角,但GPU并不能完全替代X86解決方案,很多操作系統(tǒng)、軟件以及部分代碼現(xiàn)在還不能運行在GPU上,所謂的GPU+CPU異構(gòu)超級計算機也并不是完全基于GPU進(jìn)行計算。一般而言適合GPU運算的應(yīng)用有如下特征[2]:

??運算密集。

??高度并行。

??控制簡單。

??分多個階段執(zhí)行。

符合這些條件或者是可以改寫成類似特征的應(yīng)用程序,就能夠在GPU上獲取較高的性能。

?

2GPU通用計算的前世今生

???????GPU通用計算其實是從GPU渲染管線發(fā)展來的。GPU渲染管線的主要任務(wù)是完成3D模型到圖像的渲染工作。常用的圖形學(xué)API(DirectD/OpenGL)編程模型中渲染過程被分成幾個可以并行處理的階段,分別由GPU中渲染管線的不同單元進(jìn)行處理。在GPU渲染管線的不同階段,需要處理的對象分別是頂點(Vertex)、幾何圖元(primitive)、片元(fragment)、像素(pixel)。圖形渲染過程具有內(nèi)在的并行性:頂點之間、圖元之間、片元之間的數(shù)據(jù)相關(guān)性很弱,對它們的計算可以獨立并行進(jìn)行,這使得通過并行處理提高吞吐量成為可能[3]。這兒不對GPU渲染管線進(jìn)行詳細(xì)介紹,而是著重于介紹GPU可編程器件和編程模型的發(fā)展歷程。

?

2.1?GPU可編程器件的發(fā)展

1999年8月,NVIDIA正式發(fā)表了具有跨世紀(jì)意義的產(chǎn)品NV10——GeForce 256。GeForce256是業(yè)界第一款256bit的GPU,也是全球第一個集成T&L(Transforming&Lighting幾何光照轉(zhuǎn)換)、動態(tài)光影、三角形設(shè)置/剪輯和四像素渲染等3D加速功能的圖形引擎。通過T&L技術(shù),顯卡不再是簡單像素填充機以及多邊形生成器,它還將參與圖形的幾何計算從而將CPU從繁重的3D管道幾何運算中解放出來。可以說,T&L技術(shù)是顯卡進(jìn)化到GPU的標(biāo)志。

從某種意義上說,GeForce 256開創(chuàng)了一個全新的3D圖形時代,再到后來GeForce 3開始引入可編程特性,能將圖形硬件的流水線作為流處理器來解釋,基于GPU的通用計算也開始出現(xiàn)。GeForce3被用于實現(xiàn)矩陣乘法運算和求解數(shù)學(xué)上的擴散方程,這是GPU通用計算的早期應(yīng)用。

???????研究人員發(fā)現(xiàn),要實現(xiàn)更加復(fù)雜多變的圖形效果,不能僅僅依賴三角形生成和硬件T&L實現(xiàn)的固定光影轉(zhuǎn)換,而要加強頂點和像素運算能力。Shader(著色器)就是在這樣的背景下提出的。Pixel Shader(頂點著色器)和Vertex Shader(像素著色器)的硬件邏輯支持可編程的像素和頂點,雖然當(dāng)時可編程性很弱,硬件限制太多,頂點部分出現(xiàn)可編程性,像素部分可編程性有限,但這的確是硬件T&L之后PC圖形技術(shù)的又一重大飛躍。3D娛樂的視覺體驗也因此向接近真實邁進(jìn)了一大步。可編程管線的引入,也為GPU發(fā)展翻開了新的篇章,GPU開始向SIMD(Single Instruction Multiple Data,單指令多數(shù)據(jù)流)處理器方向發(fā)展,憑借強大的并行處理性能,使得GPU開始用有了部分流式處理器特征。

???????隨后到來的DirectX[1]?9.0時代,讓Shader單元具備了更強的可編程性。2002年底微軟發(fā)布的DirectX 9.0中,Pixel Shader單元的渲染精度已達(dá)到浮點精度,傳統(tǒng)的硬件T&L單元也被取消。全新的Vertex Shader編程將比以前復(fù)雜得多,新的Vertex Shader標(biāo)準(zhǔn)增加了流程控制,更多的常量,每個程序的著色指令增加到了1024條。

Shader Model 2.0時代突破了以前限制PC圖形圖像質(zhì)量在數(shù)學(xué)上的精度障礙,它的每條渲染流水線都升級為128位浮點顏色,讓游戲程序設(shè)計師們更容易更輕松的創(chuàng)造出更漂亮的效果,讓程序員編程更容易。而從通用性方面理解,支持浮點運算讓GPU已經(jīng)具備了通用計算的基礎(chǔ),這一點是至關(guān)重要的。

圖形流水線中可編程單元的行為由Shader單元定義,著色器的性能由DirectX中規(guī)定的Shader Model來區(qū)分,并可以由高級的Shading語言(例如NV的Cg,OpenGL的GLSL,Microsoft的HLSL)編寫。Shader源碼被譯為字節(jié)碼,然后在運行時由驅(qū)動程序?qū)⑵滢D(zhuǎn)化為基于特定GPU的二進(jìn)制程序,具備可移植性好等優(yōu)勢。傳統(tǒng)的圖形渲染流線中有兩種不同的可編程著色器,分別是頂點著色單元(Vertex Shader,VS)和像素著色單元(Pixel Shader,PS)。

在Shader Model 4.0之前,VS和PS兩種著色器的架構(gòu)既有相同之處,又有一些不同。兩者處理的都是四元組數(shù)據(jù)(頂點著色器處理用于表示坐標(biāo)的w、x、y、z,但像素著色器處理用于表示顏色的a、r、g、b),頂點渲染需要比較高的計算精度;而像素渲染則可以使用較低的精度,從而可以增加在單位面積上的計算單元數(shù)量。傳統(tǒng)的分離架構(gòu)中,兩種著色器的比例往往是固定的。在GPU核心設(shè)計完成時,各種著色器的數(shù)量便確定下來,比如著名的“黃金比例”——頂點著色器與像素著色器的數(shù)量比例為1:3。但不同的游戲?qū)旤c資源和像素資源的計算能力要求是不同的。如果場景中有大量的小三角形,則頂點著色器必須滿負(fù)荷工作,而像素著色器則會被閑置;如果場景中有少量的大三角形,又會發(fā)生相反的情況。因此,固定比例的設(shè)計無法完全發(fā)揮GPU中所有計算單元的性能。

Shader Model 4.0統(tǒng)一了兩種著色器,頂點和像素著色器的規(guī)格要求完全相同,都支持32位浮點數(shù)。這是GPU發(fā)展的一個分水嶺。過去只能處理頂點和只能處理像素的專門處理單元被統(tǒng)一之后,更加適應(yīng)通用計算的需求,應(yīng)用程序調(diào)用著色器運算能力的效率也更高。

DirectX 11提出的Shader Model 5.0版本繼續(xù)強化了通用計算的地位,微軟提出的全新API—Direct Compute將把GPU通用計算推向新的巔峰。同時Shader Model 5.0是完全針對流處理器而設(shè)定的,所有類型的著色器,如:像素、頂點、幾何、計算、Hull和Domaim(位于Tessellator前后)都將從新指令集中獲益[4]。

著色器的可編程性也隨著架構(gòu)的發(fā)展不斷提高,下表給出每代模型的大概特點[1]

Shader Model

GPU代表

顯卡時代

特點

?

1999年第一代NV Geforce256

DirectX 7

1999~2001

GPU可以處理頂點的矩陣變換和進(jìn)行光照計算(T&L),操作固定,功能單一,不具備可編程性

SM 1.0

2001年第二代NV Geforce3

DirectX 8

將圖形硬件流水線作為流處理器來解釋,頂點部分出現(xiàn)可編程性,像素部分可編程性有限(訪問紋理的方式和格式受限,不支持浮點)

SM 2.0

2003?年

ATI R300

和第三代NV Geforce FX

DirectX 9.0b

頂點和像素可編程性更通用化,像素部分支持FP16/24/32浮點,可包含上千條指令,處理紋理更加靈活:可用索引進(jìn)行查找,也不再限制[0,1]范圍,從而可用作任意數(shù)組(這一點對通用計算很重要)

SM 3.0

2004年

第四代NV Geforce 6

和?ATI X1000

DirectX 9.0c

頂點程序可以訪問紋理VTF,支持動態(tài)分支操作,像素程序開始支持分支操作(包括循環(huán)、if/else等),支持函數(shù)調(diào)用,64位浮點紋理濾波和融合,多個繪制目標(biāo)

SM 4.0

2007年

第五代NV G80和ATI R600

DirectX 10

2007~2009

統(tǒng)一渲染架構(gòu),支持IEEE754浮點標(biāo)準(zhǔn),引入Geometry Shader(可批量進(jìn)行幾何處理),指令數(shù)從1K提升至64K,寄存器從32個增加到4096個,紋理規(guī)模從16+4個提升到128個,材質(zhì)Texture格式變?yōu)橛布С值腞GBE格式,最高紋理分辨率從2048*2048提升至8192*8192

SM 5.0

2009年

ATI RV870

和2010年NV GF100

DirectX 11

2009~

明確提出通用計算API Direct Compute概念和Open CL分庭抗衡,以更小的性能衰減支持IEEE754的64位雙精度浮點標(biāo)準(zhǔn),硬件Tessellation單元,更好地利用多線程資源加速多個GPU

?????????????????????????????????????????????????1??Shader Model版本

?

2.2?AMDNVIDIA最新GPU架構(gòu)比較

在圖形計算領(lǐng)域,NVIDIAATI/AMD把持著民用市場的絕大部分份額和大部分專用市場。為了搶占更大的市場,兩家公司不斷曾經(jīng)改進(jìn)自家GPU的架構(gòu)以實現(xiàn)更逼真的3D效果,現(xiàn)在他們同樣代表了GPU通用計算的方向,這兒對兩家公司最新的GPU架構(gòu)進(jìn)行簡單的分析和比較。

AMD的最新GPU架構(gòu)是RV870,又被命名為Cypress,采用了第二代“TeraScale 2”核心架構(gòu)。RV870包括流處理器在內(nèi)的所有核心規(guī)格都比上一代架構(gòu)RV770翻了一倍,也就是雙核心設(shè)計,幾乎是并排放置兩顆RV770核心,另外在裝配引擎內(nèi)部設(shè)計有兩個Rasterizer(光柵器)和Hierarchial-Z(多級Z緩沖模塊),以滿足雙倍核心規(guī)格的胃口。RV870的晶體管數(shù)量的達(dá)到了21億個,流處理器也從RV770時代的800個擴充到了1600個,每個流處理器單元的“14結(jié)構(gòu)包括一個全功能SP單元和4個能執(zhí)行乘加運算的SP[5]

???????NVIDIA的最新GPU架構(gòu)是GF100,又被命名為Fermi,這是NVIDIA為了搶占GPU通用計算性能制高點和完整支持DirectX 11而設(shè)計的架構(gòu)。GF100擁有三層分級架構(gòu):4GPCGraphics Processing Clusters圖形處理圖團簇)、16SMStreaming Multiprocessors流陣列多處理器)、512CUDA核心。每個GPC包括4SM,每個SM包括32CUDA核心。一個完整的的GF100還有6個內(nèi)存控制器(Memory Controller)。GF100核心,除具備前一代架構(gòu)GT200L1紋理緩存之外,還擁有真正意義的可讀寫L1緩存和L2緩存。GF100的晶體管數(shù)量達(dá)到了30億個,可以認(rèn)為GF100是一顆4核心(GPC)處理器,因為GPC幾乎是一顆全能的處理器[6]

兩種架構(gòu)最明顯的區(qū)別就是流處理器結(jié)構(gòu)。RV870選擇延續(xù)上一代非統(tǒng)一執(zhí)行架構(gòu)GPU產(chǎn)品的SIMD結(jié)構(gòu),用龐大的規(guī)模效應(yīng)壓制對手,偏向于ILPInstruction-Level Parallelism指令并行度)方向,而GF100則使用了G80以來創(chuàng)新的MIMD(Multiple Instruction Multiple Data)架構(gòu),更偏重于TLPThread-Level Parallelism線程并行度)方向。在單指令多數(shù)據(jù)流(SIMD)的結(jié)構(gòu)中,單一控制部件向每條流水線分派指令,同樣的指令被所有處理部件同時執(zhí)行。另一種控制結(jié)構(gòu)多指令多數(shù)據(jù)流(MIMD)中,每條流水線都能夠獨立于其他流水線執(zhí)行不同的程序。MIMD能比較有效率地執(zhí)行分支程序,而SIMD體系結(jié)構(gòu)運行條件語句時會造成很低的資源利用率。TLP要求強大的仲裁機制,豐富的共享cache和寄存器資源以及充足的發(fā)射端,這些都是極占晶體管的部件,幸好Fermi架構(gòu)在增大緩存和分支論斷上邁出了堅實的一步。

3?NVIDIAAMD使用了兩種不同的流處理器架構(gòu)

兩種架構(gòu)的另一個不同在于它們的緩存配置,雖然在在RV870與GF100上,我們都看到了一級緩存與二級緩存的設(shè)計AMD RV870提供了32KB的LDS(Local Data Store),作用類似于NVIDIA傳統(tǒng)的shared memory,但是目前的資料來看這個LDS并不具備配置為硬件cache的能力。GF100同時提供了shared memory?和?cache,并允許程序員選擇對它們的劃分。GF100的每個?SM?都有?64KB?可配置為?48KB shared memory + 16KB L1 cache?或者?16KB shared memory + 48KB L1 cache的高速片上RAM。AMD的RV870提供了?64KB Global Data Shared,本質(zhì)上是一個可讀寫的cache,可用于各個SIMD Core之間的數(shù)據(jù)交換。GF100提供了768KB的一體化L2 cache,這個L2 cache為所有的Load/Store以及紋理請求提供高速緩存,對所有的SM來說L2 cache上的數(shù)據(jù)都是連貫一致的,從L2 cache讀取到的數(shù)據(jù)就是最新的數(shù)據(jù)。RV870的L2 cache則不能提供GF100中?L2 Cache共享內(nèi)核間數(shù)據(jù)的特性。

還有一個不同是兩家廠商選擇了不同的最小線程執(zhí)行粒度。粒度越細(xì),能夠調(diào)用并行度來進(jìn)行指令延遲掩蓋的機會越大,性能衰減越小。細(xì)化粒度偏向TLP方向,對GPU的線程仲裁機制要求很大,最終會導(dǎo)致硬件開銷過大。GPU通用計算中最小的執(zhí)行單位是線程(Thread),多個線程會被打包成一個線程束,NVIDIA稱線程束為WarpAMD稱之為FrontwaveFrontwave包含64個線程,NVIDIA的線程管理粒度更小,每個Warp包含32個線程。RV870每湊夠64個線程,仲裁器就會動作一次,把一個Frontwave發(fā)送給空閑的一個SIMD CoreNVIDIAGF100比較特殊,還存在Half-Warp,也就是說每16個線程就可以發(fā)送給SM一次。Half-Warp由線程中的前16個線程或者后16個線程組成。

還要提到的是GF100架構(gòu)首次在GPU中引入全局ECC(Error Checking and Correcting內(nèi)存錯誤檢查和修復(fù))。在使用GPU做大數(shù)據(jù)量的處理和高性能計算的時候,ECC有大量的需求,尤其在醫(yī)療圖像處理和大型集群中,ECC是非常有用的特性。

總體來說,兩家廠商的差異在于:AMD堆砌了更大規(guī)模的運算器單元,NVIDIA則更注重如何利用有限的運算器資源。AMD將更多的晶體管消耗在大量的SIMD Core單元上,NVIDIA則將更多的晶體管消耗在仲裁機制、豐富的共享緩存資源和寄存器資源以及充足的發(fā)射端方面。AMDGPU偏向于ILP結(jié)構(gòu),NVIDIA偏向于TLP結(jié)構(gòu)。TLP(線程并行度)考驗線程能力和并行能力,ILP(指令并行度)則考驗指令處理。

?

2.3 GPU通用計算編程模型

???????GPU通用計算通常采用CPU+GPU異構(gòu)模式,由CPU負(fù)責(zé)執(zhí)行復(fù)雜邏輯處理和事務(wù)處理等不適合數(shù)據(jù)并行的計算,由GPU負(fù)責(zé)計算密集型的大規(guī)模數(shù)據(jù)并行計算。這種利用GPU強大處理能力和高帶寬彌補CPU性能不足的計算方式在發(fā)掘計算機潛在性能,在成本和性價比方面有顯著的優(yōu)勢。在2007NVIDIA推出CUDACompute Unified Device Architecture,統(tǒng)一計算設(shè)備架構(gòu))之前,GPU通用計算受硬件可編程性和開發(fā)方式的制約,開發(fā)難度較大。2007年以后,CUDA不斷發(fā)展的同時,其他的GPU通用計算標(biāo)準(zhǔn)也被相繼提出,如由Apple提出Khronos Group最終發(fā)布的OpenCLAMD推出的Stream SDK,Microsoft則在其最新的Windows7系統(tǒng)中集成了DirectCopmute以支持利用GPU進(jìn)行通用計算。

2.3.1?傳統(tǒng)GPU通用計算開發(fā)

???????最早的GPGPU開發(fā)直接使用圖形學(xué)API編程。這種開發(fā)方式要求程序員將數(shù)據(jù)打包成紋理,將計算任務(wù)映射為對紋理的渲染過程,用匯編或者高級著色語言(如GLSL,Cg,HLSL)編寫shader程序,然后通過圖形學(xué)API(Direct3D、OpenGL)執(zhí)行。2003年斯坦福大學(xué)的Ian Buck等人對ANSI C進(jìn)行擴展,開發(fā)了基于NVIDIA Cg的Brook源到源編譯器。Brook可以將類似C的brook C語言通過brcc編譯器編譯為Cg代碼,隱藏了利用圖形學(xué)API實現(xiàn)的細(xì)節(jié),大大簡化了開發(fā)過程。但早期的Brook編譯效率很低,并且只能使用像素著色器(Pixel Shader)進(jìn)行運算。受GPU架構(gòu)限制,Brook也缺乏有效的數(shù)據(jù)通信機制。AMD在其GPGPU通用計算產(chǎn)品Stream中采用Brook的改進(jìn)版本Brook+作為高級開發(fā)語言。Brook+的編譯器工作方式與Brook不同,提高了效率[7]。

2.3.2 CUDA –C/C++及其SDK

???????2007年6月,NVIDIA推出了CUDA技術(shù)。CUDA是一種將GPU作為數(shù)據(jù)并行計算設(shè)備的軟硬件體系,硬件上NVIDIA GeForce 8系列以后的GPU(包括GeForce、ION、Quadro、Tesla系列)已經(jīng)采用支持CUDA的架構(gòu),軟件開發(fā)包上CUDA也已經(jīng)發(fā)展到CUDA Toolkit 3.2(截止到2010年11月),并且支持Windows、Linux、MacOS三種主流操作系統(tǒng)。CUDA采用比較容易掌握的類C語言進(jìn)行開發(fā),而且正在開發(fā)適用于CUDA架構(gòu)的用于科學(xué)計算的Fortran版本。無論是CUDA C-語言或是OpenCL,指令最終都會被驅(qū)動程序轉(zhuǎn)換成PTX(Parallel Thread Execution,并行線程執(zhí)行,CUDA架構(gòu)中的指令集,類似于匯編語言)代碼,交由顯示核心計算[8]。

???????CUDA編程模型將CPU作為主機(Host),GPU作為協(xié)處理器(co-processor)或者設(shè)備(Device)。在一個系統(tǒng)中可以存在一個主機和若干個設(shè)備。CPU、GPU各自擁有相互獨立的存儲地址空間:主機端內(nèi)存和設(shè)備端顯存。CUDA對內(nèi)存的操作與一般的C程序基本相同,但是增加了一種新的pinned memory;操作顯存則需要調(diào)用CUDA API存儲器管理函數(shù)。一旦確定了程序中的并行部分,就可以考慮把這部分計算工作交給GPU。運行在GPU上的CUDA并行計算函數(shù)稱為kernel(內(nèi)核函數(shù))。一個完整的CUDA程序是由一系列的設(shè)備端kernel函數(shù)并行步驟和主機端的串行處理步驟共同組成的。這些處理步驟會按照程序中相應(yīng)語句的順序依次執(zhí)行,滿足順序一致性。


圖4?異構(gòu)編程模型

???????CUDA SDK提供的API分為CUDA runtime API(運行時API)和CUDA driver API(驅(qū)動程序API)。CUDA runtime API在CUDA driver API的基礎(chǔ)上進(jìn)行了封裝,隱藏了一些實現(xiàn)細(xì)節(jié),編程更加方便。CUDA runtime API函數(shù)前都有CUDA前綴。CUDA driver API是一種基于句柄的底層接口,可以加載二進(jìn)制或匯編形式的kernel模塊,指定參數(shù)并啟動運算。CUDA driver API編程復(fù)雜,但有時能通過直接操作硬件的執(zhí)行實現(xiàn)一些更加復(fù)雜的功能或者獲得更高的性能。由于它使用的設(shè)備端代碼是二進(jìn)制或者匯編代碼,因此可以在各種語言中調(diào)用。CUDA driver API所有函數(shù)的前綴為cu。另外CUDA SDK也提供了CUFFT(CUDA Fast Fourier Transform,基于CUDA的快速傅立葉變換)、CUBLAS(CUDA Basic Linear Algebra Subprograms,基于CUDA的基本矩陣與向量運算庫)和CUDPP(CUDA Data Parallel Primitives,基于CUDA的常用并行操作函數(shù))等函數(shù)庫,提供了簡單高效的常用函數(shù)供開發(fā)者直接使用。

???????從CUDA Toolkit3.0開始支持NVIDIA最新的Fermi架構(gòu),最大程度上利用Fermi架構(gòu)在通用計算方面的優(yōu)勢。CUDA 3.0也開始支持C++的繼承和模板機制提高編程靈活性,同時CUDA C/C++內(nèi)核現(xiàn)在以標(biāo)準(zhǔn)ELF格式進(jìn)行編譯,開始支持硬件調(diào)試,還增加了一個新的Direct3DOpenGL統(tǒng)一協(xié)作API,支持OpenGL紋理和Direct3D 11標(biāo)準(zhǔn),支持所有的OpenCL特征。

?

2.3.3 OpenCL

???????OpenCL?(Open?Computing?Language,開放計算語言)?是一個為異構(gòu)平臺編寫程序的框架,此異構(gòu)平臺可由CPU、GPU或其他類型的處理器組成。OpenCL由用于編寫kernels?(在OpenCL設(shè)備上運行的函數(shù))的語言(基于C99)和一組用于定義并控制平臺的API組成。OpenCL提供了基于任務(wù)分區(qū)和數(shù)據(jù)分區(qū)的并行計算機制。

OpenCL最初由Apple公司開發(fā),Apple擁有其商標(biāo)權(quán),并在與AMD,IBM,Intel和NVIDIA技術(shù)團隊的合作之下初步完善。隨后,Apple將這一草案提交至Khronos Group。2008年6月16日,Khronos的通用計算工作小組成立。5個月后的2008年11月18日,該工作組完成了OpenCL 1.0規(guī)范的技術(shù)細(xì)節(jié)。該技術(shù)規(guī)范在由Khronos成員進(jìn)行審查之后,于2008年12月8日公開發(fā)表。2010年6月14日,OpenCL 1.1?發(fā)布[9]。

???????OpenCL也是基于C的一個程式語言,分為Platform LayerRuntimeCompiler三個部分:Platform Layer用來管理計算裝置,提供啟始化裝置的界面,并用來建立compute contextswork-queuesRuntime用來管理資源,并執(zhí)行程序的kernelCompiler則是ISO C99的子集合,并加上了OpenCL特殊的語法。OpenCL的執(zhí)行模型中,有所謂的Compute KernelCompute Program?Compute Kernel基本上類似于CUDA定義的kernel,是最基本的的計算單元;而Compute Program則是Compute Kernel和內(nèi)建函數(shù)的集合,類似一個動態(tài)函數(shù)庫。很大程度上OpenCLCUDA Driver API比較相像。

???????自從2008年12月NVIDIA在SIGGRAPH Asia大會上在筆記本電腦上展示全球首款OpenCL GPU演示以來,AMD、NVIDIA、Apple、RapidMind、Gallium3D、ZiiLABS、IBM、Intel先后發(fā)布他們自己的OpenCL規(guī)范實現(xiàn)(當(dāng)一臺機器上存在不同廠家的支持OpenCL的設(shè)備時,這樣也給開發(fā)應(yīng)用程序帶來不統(tǒng)一的一些麻煩)。除了AMD和NVIDIA,其他廠商如S3、VIA等也紛紛發(fā)布他們支持OpenCL的硬件產(chǎn)品[10]。

?

2.3.4 DirectCopmute

Directcompute是一種由Microsoft開發(fā)和推廣的用于GPU通用計算的應(yīng)用程序接口,集成在Microsoft DirectX內(nèi),允許Windows Vista或Windows 7平臺上運行的程序利用GPU進(jìn)行通用計算。雖然DirectCompute最初在DirectX 11 API中得以實現(xiàn),但支持DX10的GPU可以利用此API的一個子集進(jìn)行通用計算(DirectX 10內(nèi)集成Directcompute 4.0,DirectX 10.1內(nèi)集成Directcompute 4.1),支持DirectX11的GPU則可以使用完整的DirectCompute功能(DirectX 11內(nèi)集成Directcompute 5.0)。Directcompute和OpenCL都是開放標(biāo)準(zhǔn),得到NVIDIA CUDA架構(gòu)和ATI Stream技術(shù)的支持。

Windows 7增加了視頻即時拖放轉(zhuǎn)換功能,可以將電腦中的視頻直接轉(zhuǎn)換到移動媒體播放器上,如果電腦中的GPU支持Directcompute,那么這一轉(zhuǎn)換過程就將由GPU完成。其轉(zhuǎn)換速度將達(dá)到CPU的5-6倍。Internet Explorer 9加入了對Directcompute技術(shù)的支持,可以調(diào)用GPU對網(wǎng)頁中的大計算量元素做加速計算,另外Excel2010、Powerpoint2010均提供Directcompute技術(shù)支持[11]。

?

2.3.5 Stream SDK

AMD的流計算模型其實也包含了流處理器架構(gòu)和相應(yīng)的軟件包。AMD在2007年12月發(fā)布運行在Windows XP系統(tǒng)下的Steam SDK v1.0,?此SDK采用了Brook+作為開發(fā)語言,Brook+是AMD對斯坦福大學(xué)開發(fā)的Brook語言(基于ANSI C)的改進(jìn)版本。Stream SDK為開發(fā)者提供對系統(tǒng)和平臺開放的標(biāo)準(zhǔn)以方便合作者開發(fā)第三方工具。軟件包包含了如下組件:支持Brook+的編譯器,支持流處理器的設(shè)備驅(qū)動CAL(Compute Abstraction Layer),程序庫ACML(AMD Core Math Library)以及內(nèi)核函數(shù)分析器。


圖5?AMD流計算軟件系統(tǒng)之間的關(guān)系

在Stream編程模型中,在流處理器上執(zhí)行的程序稱為kernel(內(nèi)核函數(shù)),每個運行在SIMD引擎的流處理器上的kernel實例稱為thread(線程),線程映射到物理上的運行區(qū)域稱為執(zhí)行域。流處理器調(diào)度線程陣列到線程處理器上執(zhí)行,直到所有線程完成后才能運行下一個內(nèi)核函數(shù)。

Brook+是流計算的上層語言,抽象了硬件細(xì)節(jié),開發(fā)者編寫能夠運行在流處理器上的內(nèi)核函數(shù),只需指定輸入輸出和執(zhí)行域,無需知道流處理器硬件的實現(xiàn)。Brook+語言中兩個關(guān)鍵特性是:Stream和Kernel。Stream是能夠并行執(zhí)行的相同類型元素的集合;Kernel是能夠在執(zhí)行域上并行執(zhí)行的函數(shù)。Brook+軟件包包含brcc和brt。brcc是一個源語言對源語言的編譯器,能夠?qū)rook+程序翻譯成設(shè)備相關(guān)的IL(Intermediate Language),這些代碼被后續(xù)鏈接、執(zhí)行。brt是一個可以執(zhí)行內(nèi)核函數(shù)的運行時庫,這些庫函數(shù)有些運行在CPU上,有些運行在流處理器上。運行在流處理器上的核函數(shù)庫又稱為CAL(Compute Abstraction Layer)。CAL是一個用C編寫的設(shè)備驅(qū)動庫,允許開發(fā)者在保證前端一致性的同時對流處理器核心從底層進(jìn)行優(yōu)化。CAL提供了設(shè)備管理、資源管理、內(nèi)核加載和執(zhí)行、多設(shè)備支持、與3D?圖形API交互等功能。同時,Stream SDK也提供了常用數(shù)學(xué)函數(shù)庫ACML(AMD Core Math Library)供開發(fā)者快速獲得高性能的計算。ACML包括基本完整的線性代數(shù)子例程、FFT運算例程、隨機數(shù)產(chǎn)生例程和超越函數(shù)例程[12]。

面對NVIDIA在GPU通用計算上的不斷創(chuàng)新,AMD也不甘示弱,不斷改進(jìn)自己的Stream SDK。截止到2010年11月,AMD發(fā)布了Stream SDK v2.2,能夠在WindowsXP SP3、Windows 7和部分Linux發(fā)行版上運行,開始支持OpenCL 1.1規(guī)范和雙精度浮點數(shù)操作。

??

3、GPU通用計算的應(yīng)用領(lǐng)域

從SIGGRAPH 2003大會首先提出GPU通用計算概念,到NVIDIA公司2007年推出CUDA平臺,GPU通用計算依靠其強大的計算能力和很高的存儲帶寬在很多領(lǐng)域取得了成功。越來越多的信號告訴我們,GPU通用計算是一片正在被打開的潛力巨大的市場[13]。

GPGPU項目研究中的先行者是英國劍橋大學(xué)的BionicFx課題組。早在2004年9月,劍橋大學(xué)的BionicFx課題組便宣布在NVIDIA的GeForce FX 5900產(chǎn)品中實現(xiàn)了專業(yè)的實時音頻處理功能,并且準(zhǔn)備進(jìn)行商業(yè)化的運作,對其產(chǎn)品進(jìn)行銷售,給音樂創(chuàng)作者帶來實惠。在隨后的一段時間,GPGPU進(jìn)入了深入研究階段,但是由于編程語言架構(gòu)和編程環(huán)境都難以通用,該領(lǐng)域的發(fā)展能力受到廣泛質(zhì)疑。就在人們認(rèn)為GPGPU的研究即將偃旗息鼓的時候,ATI在2006年8月驚人地宣布即將聯(lián)手斯坦福大學(xué)在其Folding@Home項目中提供對ATI Radeon X1900的支持。在顯卡加入Folding@Home項目后,科研進(jìn)展速度被成倍提升,人們第一次感受到了GPU的運算威力。

毫無疑問,在GPGPU研究上,ATI跨出了極具意義的一步。同時將GPGPU的應(yīng)用領(lǐng)域和普及程度推向高潮。隨后NVIDIA憑借GeForce 8800GTX這款業(yè)界首個DirectX 10 GPU,在GPU通用計算方面實現(xiàn)了大步跨越,特別是CUDA概念的提出(該工具集的核心是一個C語言編譯器),在新的通用計算領(lǐng)域后來居上。

下面對GPU通用計算在各個領(lǐng)域的成功應(yīng)用做一個概述。


圖6?不同項目使用CUDA后獲得的加速比

3.1?常見軟件

???????最新版本的MATLAB 2010b中Parallel Computing Toolbox與MATLAB Distributed Computing Server的最新版本可利用NVIDIA的CUDA并行計算架構(gòu)在NVIDIA計算能力1.3以上的GPU上處理數(shù)據(jù),執(zhí)行GPU加速的MATLAB運算,將用戶自己的CUDA Kernel函數(shù)集成到MATLAB應(yīng)用程序當(dāng)中。另外,通過在臺式機上使用Parallel Computing Toolbox以及在計算集群上使用MATLAB Distributed Computing Server來運行多個MATLAB worker程序,從而可在多顆NVIDIA GPU上進(jìn)行計算[14]。AccelerEyes公司開發(fā)的Jacket插件也能夠使MATLAB利用GPU進(jìn)行加速計算。Jacket不僅提供了GPU API(應(yīng)用程序接口),而且還集成了GPU MEX功能。在一定程度說,Jacket是一個完全對用戶透明的系統(tǒng),能夠自動的進(jìn)行內(nèi)存分配和自動優(yōu)化。Jacket使用了一個叫“on-the- fly”的編譯系統(tǒng),使MATLAB交互式格式的程序能夠在GPU上運行。目前,Jacket只是基于NVIDIA的CUDA技術(shù),但能夠運行在各主流操作系統(tǒng)上[15]。

Photoshop雖然已經(jīng)支持多核心處理器,但在某些時候的速度仍然讓人抓狂,比如打開一個超大文件,或者應(yīng)用一個效果復(fù)雜的濾鏡。從Photoshop CS4開始,Adobe將GPU通用計算技術(shù)引入到自家的產(chǎn)品中來。GPU可提供對圖像旋轉(zhuǎn)、縮放和放大平移這些常規(guī)瀏覽功能的加速,還能夠?qū)崿F(xiàn)2D/3D合成,高質(zhì)量抗鋸齒,HDR高動態(tài)范圍貼圖,色彩轉(zhuǎn)換等。而在Photoshop CS5中,更多的算法和濾鏡也開始支持GPU加速。另外,Adobe的其他產(chǎn)品如Adobe After Effects CS4、Adobe Premiere Pro CS4也開始使用GPU進(jìn)行加速。這些軟件借助的也是NVIDIA的CUDA技術(shù)[16]。

下一代主流操作系統(tǒng)?Windows 7?的核心組成部分包括了支持GPU通用計算的Directcompute API,為視頻處理、動態(tài)模擬等應(yīng)用進(jìn)行加速。Windows 7借助Directcompute增加了對由GPU支持的高清播放的in-the-box支持,可以流暢觀看,同時CPU占用率很低。Internet Explorer 9加入了對Directcompute技術(shù)的支持,可以調(diào)用GPU對網(wǎng)頁中的大計算量元素做加速計算;Excel2010、Powerpoint2010也開始提供對Directcompute技術(shù)的支持。

?

3.2?高性能計算

超級計算機一般指在性能上居于世界領(lǐng)先地位的計算機,通常有成千上萬個處理器以及專門設(shè)計的內(nèi)存和I/O系統(tǒng)。它們采用的架構(gòu)與通常的個人計算機有很大區(qū)別,使用的技術(shù)也隨著時代和具體應(yīng)用不斷變動。GPU通用計算提出以后,不斷有超級計算機開始安裝GPU以提高性能。2010年9月,全球超級計算機領(lǐng)軍企業(yè)Cray公司正式宣布,該公司將為Cray XE6系列產(chǎn)品開發(fā)基于NVIDIA Tesla20系列GPU的刀片服務(wù)器。2010年11月揭曉的世界上最快的超級計算機top500列表中,最快的5個系統(tǒng)中有3個使用了NVIDIA的Tesla型號GPU產(chǎn)品,其中中國國防科技大學(xué)研發(fā)的“天河一號”榮膺榜首,最快運算速度達(dá)到2.507 petaflops。2009年10月29日完成的“天河一號”一期系統(tǒng)有3072顆Intel Quad Core Xeon E5540 2.53GHz和3072顆Intel Quad Core Xeon E5450 3.0GHz以及2560塊AMD Radeon HD 4870 X2,峰值性能為每秒1206萬億次(top500中排名第5)。2010年10月,升級優(yōu)化后的“天河一號”,配備了14336顆Xeon X5670處理器(32nm工藝,六核12線程,2.93GHz主頻),7168塊基于NVIDIA Fermi架構(gòu)的Tesla M2050計算卡(主頻1.15GHz,雙精度浮點性能515Gflops、單精度浮點性能1.03Tflops)以及2048顆國防科技大學(xué)研制的飛騰處理器(八核64線程,主頻1GHz),峰值性能每秒?4700萬億次、持續(xù)性能每秒2507萬億次(LINPACK實測值)。

計算機集群(簡稱集群)是一種通過松散集成的計算機軟件和硬件連接起來高度緊密地完成計算工作的系統(tǒng),采用將計算任務(wù)分配到集群的不同計算節(jié)點而提高計算能力,主要應(yīng)用在科學(xué)計算領(lǐng)域。比較流行的集群采用Linux操作系統(tǒng)和其它一些免費軟件來完成并行運算。

200610月,全球最大的分布式計算項目——Folding@home中提供對ATI Radeon X1900的支持后,任何一臺個人電腦都可以下載客戶端參與,科研進(jìn)展速度被成倍提升。該項目可精確地模擬蛋白質(zhì)折疊和錯誤折疊的過程,以便能更好地了解多種疾病的起因和發(fā)展。在目前的大約10萬臺參與該項目的計算機中,僅有的11370顆支持CUDAGPU提供總計算能力的一半,而運行WindowsCPU共計208268顆,卻只能提供該項目總能力的約6%的計算[1]

早在2007年,AMAXSupermicro等公司就已經(jīng)開始探索和研究GPU用于服務(wù)器和集群。時至今日,AMAX已成為集CPU+GPU塔式服務(wù)器機柜式服務(wù)器、CPU+GPU集群等幾十種系列產(chǎn)品的生產(chǎn)和銷售為一體的一站式GPU解決方案供應(yīng)商,可以滿足不同領(lǐng)域科研群體的計算需求。AMAX GPU集群相對于傳統(tǒng)CPU集群產(chǎn)品,可以以十分之一的價格,二十分之一的功耗,獲得20-150倍的計算性能提高和60%的空間節(jié)余。AMAX采用NVIDIA支持大規(guī)模并行計算的CUDA架構(gòu)GPU,支持IEEE 754單精度和雙精度浮點計算,支持CUDA編程環(huán)境、多種編程語言和API,包括CC + +OpenCLDirectComputeFortran,支持ECCNVIDIA Parallel DataCache?技術(shù),以及NVIDIA GigaThread引擎技術(shù),支持異步傳輸和系統(tǒng)監(jiān)控功能[17]目前眾多科研機構(gòu)和公司(如哈佛大學(xué)、中國科學(xué)院、劍橋大學(xué)、英國航空公司等等)都已經(jīng)架設(shè)了基于NVIDIA Tesla(支持CUDA)系列GPU的通用計算機集群。2010年7月,AMD也宣稱其合作伙伴,荷蘭公司ClusterVision,已經(jīng)開始利用其新一代的Opteron處理器(12核心CPU)和FireStream圖形計算加速卡組建服務(wù)器集群。

???????云計算指服務(wù)的交付和使用模式,通過網(wǎng)絡(luò)以按需、易擴展的方式獲得所需的服務(wù)。?“云”是一些可以自我維護(hù)和管理的虛擬計算資源,通常為一些大型服務(wù)器集群,包括計算服務(wù)器、存儲服務(wù)器、寬帶資源等等。此前的種種云計算,都是通過網(wǎng)絡(luò)傳輸CPU的運算能力,為客戶端返回計算結(jié)果或者文件;而GPU云計算則偏重于圖形渲染運算或大規(guī)模并行計算。2009年10月,NVIDIA聯(lián)合Mental Images公司推出基于GPU的云計算平臺RealityServer,利用Tesla RS硬件和RealityServer?3.0軟件,為PC、筆記本、上網(wǎng)本、智能手機提供逼真的交互式3D圖形渲染服務(wù)。2010年11月,Amazon與NVIDIA宣布推出基于亞馬遜集群GPU計算實例(Amazon Cluster GPU Instances)的EC2(彈性計算云)服務(wù)[18],亞馬遜GPU集群實例提供了22GB的存儲容量,33.5?個EC2計算單元,并且利用亞馬遜?EC2集群網(wǎng)絡(luò)為高性能計算和數(shù)據(jù)集中處理提供了很高的吞吐量和低延遲。每一個GPU實例都配有兩個NVIDIA Tesla(R) M2050 GPU,提供了甚至超過每秒100萬兆次的雙精度浮點計算的超高的性能。通過GPU實例的數(shù)百個內(nèi)核并行處理能力,許多工作負(fù)載可以被大大加速。

?

3.3?信號與圖像處理

???????很多信號與圖像處理算法的計算密度非常高,隨著GPU通用計算的快速發(fā)展,越來越多的算法實現(xiàn)了在GPU上運行,獲得令人滿意的加速。在NVIDIA推出CUDA技術(shù)之前,盡管開發(fā)不方便,不少研究者利用圖形API和各種Shader語言(HLSL、GLSL、Cg等)實現(xiàn)了一些圖像分割、CT圖像重建、快速傅立葉變換、圖像以及音視頻編解碼等算法。AMD的Brook+尤其是CUDA技術(shù)的推出極大地方便了在GPU上開發(fā)信號與圖像處理并行算法。

???????AMD的Stream SDK和NVIDIA?的CUDA SDK發(fā)布時就包含了各自經(jīng)優(yōu)化后的基本線性代數(shù)例程(BLAS)和快速傅立葉變換庫(FFT)。2008年Georgia Tech的Andrew Kerr等開發(fā)了基于CUDA平臺的VSIPL(Vector Signal Image Processing Library)[19],支持向量和矩陣運算,快速FIR(Finite Impulse Response,有限沖擊響應(yīng))濾波,矩陣的QR分解等;2009年6月,NVIDIA又發(fā)布了專注于圖像和視頻處理的庫NPP(NVIDIA Performing Primitives),對一些統(tǒng)計函數(shù)、JPEG編解碼、濾波函數(shù)、邊緣檢測算法進(jìn)行了封裝[20];2010年8月,TunaCode宣布對NPP庫進(jìn)行擴展,推出了CUVI Lib(CUDA for Vision and Imaging Lib),增加了NPP中不包含的一些高級計算機視覺和圖像處理算法,如光流法、離散小波變換、Hough變換、顏色空間轉(zhuǎn)換等[21]。另外,2010年9月,Graz大學(xué)的研究人員發(fā)布了專用于圖像邊緣分割的GPU4Vision庫,用GPU實現(xiàn)圖像分割算法的加速[22]。NVIDIA主導(dǎo)的OpenVIDIA項目在2010年6月發(fā)布了CUDA VisionWorkbench v 1.3.1.0,里面使用OpenGL,Cg,CUDA-C等語言,而且支持OpenCL和DirectCompute的例子會于近期添加,該項目實現(xiàn)了立體視覺、光流法、特征跟蹤的一些算法[23]。

???????在特征提取領(lǐng)域,瑞典的Marten Bjorkman和美國北卡羅來納大學(xué)的Wu等實現(xiàn)了基于CUDA的SIFT(Lowe's Scale Invariant Feature Transform,尺度不變特征)的提取[24];北卡羅來納州立大學(xué)的Christopher Zach等則在GPU上實現(xiàn)KLT算法用于視頻中的特征跟蹤。在機器學(xué)習(xí)領(lǐng)域,斯坦福大學(xué)的Rajat Raina等在GPU上實現(xiàn)了大規(guī)模深度無監(jiān)督算法DBNs(Deep Belief Networks)和稀疏編碼(Sparse Coding)算法;谷歌上的開源項目multisvm則基于CUDA實現(xiàn)了SVM(Support Vector Machine,支持向量機)的多分類器,實驗表明加速效果明顯[25]。

另外值得一提的是,醫(yī)學(xué)成像是最早利用?GPU計算加快性能的應(yīng)用之一,GPU通用計算在這一領(lǐng)域的應(yīng)用日趨成熟,當(dāng)前許多醫(yī)學(xué)成像領(lǐng)域的算法已在GPU上實現(xiàn)。Digisens和Acceleware AxRecon已經(jīng)分別開發(fā)出能夠利用GPU進(jìn)行計算的用于X線CT和電子斷層攝影術(shù)的3D成像軟件和在無損圖像質(zhì)量的情況下可實時重建圖像的軟件。Techniscan的開發(fā)人員在其新一代全乳房超聲波成像系統(tǒng)中將其專有的逆向散射算法在CUDA平臺上實現(xiàn),獲得很高的加速比。東京大學(xué)Takeyoshi Dohi教授與他的同事則在其實時醫(yī)療成像的裸眼立體成像系統(tǒng)中使用GPU加速體繪制過程和后期文件格式轉(zhuǎn)換。另外,比利時安特衛(wèi)普大學(xué),通用電氣醫(yī)療集團,西門子醫(yī)療,東芝中風(fēng)研究中心和紐約州立大學(xué)水牛城分校的都針對GPU加速CT重建進(jìn)行了各自的研究,不僅如此,西門子醫(yī)療用GPU實現(xiàn)了加速MRI中的GRAPPA自動校準(zhǔn),完成MR重建,快速MRI網(wǎng)格化,隨機擴散張量磁共振圖像(DT-MRI)連通繪圖等算法。其他的一些研究者則把醫(yī)學(xué)成像中非常重要的二維與三維圖像中器官分割(如Level Set算法),不同來源圖像的配準(zhǔn),重建體積圖像的渲染等也移植到GPU上進(jìn)行計算。

?

3.4?數(shù)據(jù)庫與數(shù)據(jù)挖掘

面對當(dāng)前海量增加的數(shù)據(jù),搜索數(shù)據(jù)庫并找到有用信息已經(jīng)成為一個巨大的計算難題。學(xué)術(shù)界以及微軟、Oracle、SAP等公司的研究人員正在研究利用GPU的強大計算能力來找到一款可擴展的解決方案。

加利福尼亞大學(xué)的Santa Cruz等(現(xiàn)任職于Oracle)比較早地提出把GPU強大的運算能力應(yīng)用于數(shù)據(jù)庫技術(shù)。2009年Oracle的Blas, Tim Kaldewey?在IEEE Spectrum上著文分析為什么圖形處理器將徹底改變數(shù)據(jù)庫處理(Why graphics processors will transform database processing),在另一篇文章中他們探索了利用GPU實現(xiàn)并行的搜索算法[27],如并行二分搜索和P-ary搜索;更多的研究者如深圳先進(jìn)技術(shù)研究院和香港中文大學(xué)的S. Chen,P. A. Heng,加州伯克利大學(xué)的Nadathur Satish[28],微軟研究院的Naga K. Govindaraju等[29],瑞典的Erik Sintorn等[30]則研究了在GPU上實現(xiàn)高效率的并行排序算法。香港科技大學(xué)的Bingsheng He等研究了使用GPU進(jìn)行查詢協(xié)同處理[31]。

在數(shù)據(jù)挖掘領(lǐng)域,HP實驗室的Wu,Zhang,Hsu等研究了使用GPU對商業(yè)智能分析進(jìn)行加速[32]。福尼吉亞理工大學(xué)的Sean P. Ponce在其碩士論文中應(yīng)用算法轉(zhuǎn)換于臨時數(shù)據(jù)挖掘,使其數(shù)據(jù)并行化,更適合在GPU上實現(xiàn)加速[33]。北卡羅來納州立大學(xué)的Y. Zhang和美國橡樹嶺國家實驗室的X. Cui聯(lián)合研究了利用CUDA加速文本挖掘,開發(fā)了優(yōu)化的文本搜索算法[34]。馬里蘭大學(xué)的Schatz,Trapnel等開發(fā)的Cmatch和MUMmerGPU[35][36],在GPU上實現(xiàn)了高效的的后綴樹算法,能夠?qū)σ幌盗胁樵冏址捌渥哟M(jìn)行并行搜索,從而進(jìn)行快速準(zhǔn)確的字符串匹配。香港科技大學(xué)的Fang和微軟亞洲研究院的He等開發(fā)了一個小工具GPUMiner,實現(xiàn)了K-均值聚類算法和先驗頻率模式挖掘算法,用CPU對控制數(shù)據(jù)I/O和CPU與GPU之間的數(shù)據(jù)傳輸,用CPU和GPU聯(lián)合實現(xiàn)并行算法并提供可視化界面[26]。

另有一些研究者正在研究將Map-Reduce架構(gòu)擴展到GPU上實現(xiàn)。香港科技大學(xué)的Bingsheng He?和Wenbin Fang在單GPU上開發(fā)的Mars,目前已經(jīng)包含字符串匹配,矩陣乘法,倒序索引,字詞統(tǒng)計,網(wǎng)頁訪問排名,網(wǎng)頁訪問計數(shù),相似性評估和K均值等8項應(yīng)用,能夠在32與64位的linux平臺下運行[37]。德克薩斯大學(xué)的Alok Mooley等也在分布式的GPU網(wǎng)絡(luò)上實現(xiàn)了功能類似的系統(tǒng)DisMaRC[38]。加州伯克利大學(xué)的Bryan Catanzaro等則在基于CUDA實現(xiàn)的Map-Reduce框架下實現(xiàn)了SVM(Support Vector Machine,支持向量機)的訓(xùn)練和分類。

?

4、總結(jié)和展望

???????GPU擁有超高的計算密度和顯存帶寬,CPU+GPU混合架構(gòu)憑借其高性能、低功耗等優(yōu)勢在許多領(lǐng)域有優(yōu)異的表現(xiàn)。巨大的運算能力讓人們對GPU充滿期待,似乎在一夜之間,GPU用于通用計算(General Purpose GPU)及其相關(guān)方面的問題成為一個十分熱門的話題。視頻編解碼應(yīng)用、矩陣運算及仿真、醫(yī)療行業(yè)應(yīng)用、生命科學(xué)研究等需要大量重復(fù)的數(shù)據(jù)集運算和密集的內(nèi)存存取,紛紛利用GPU實現(xiàn)了比CPU強悍得多的計算能力[39]

展望未來GPU發(fā)展,以下幾個問題是必須解決的。首先是分支預(yù)測能力,GPU需要擁有更好的分支能力,才能運行更多復(fù)雜程序,更好的利用cache來掩蓋分支的延遲;然后是更大的緩存和Shared memoryAMD稱之為LDS?Local Data Share),這種共享寄存器負(fù)責(zé)共享數(shù)據(jù)和臨時掛起線程,容量越大,線程跳轉(zhuǎn)和分支能力就越強;線程粒度同樣重要,粒度越細(xì)能夠調(diào)用并行度來進(jìn)行指令延遲掩蓋的機會越大,性能衰減越小,而細(xì)化粒度對GPU的線程仲裁機制要求很大。

GPU發(fā)展到今天,已經(jīng)突破了無數(shù)技術(shù)屏障,最初因圖形處理而誕生的硬件發(fā)展成為今天大規(guī)模并行計算領(lǐng)域的明星。我們完全可以相信GPU的架構(gòu)還會不斷優(yōu)化,并被越來越多的大型計算所采用。

?

參考文獻(xiàn):

[1]?張舒,褚艷麗等著, GPU高性能計算之CUDA,?中國水利水電出版社, 2009

[2] John D. Owens, Mike Houston,et al,GPU Computing,?Proceedings of the IEEE, Vol. 96, No. 5, May 2008

[3] GPGPU website,?http://gpgpu.org/

[4] 10GPU通用計算回顧,?http://vga.zol.com.cn/172/1721480.html

[5] Programming Guide:ATI Stream Computing,

http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Stream_SDK_CAL_Programming_Guide_v2.0%5B1%5D.pdf

[6]?Fermi Compute Architecture White Paper

http://www.nvidia.com/content/PDF/fermi_white_papers/NVIDIA_Fermi_Compute_Architecture_Whitepaper.pdf

[7] John D. Owens1, David Luebke, et al, A Survey of General-Purpose Computation on Graphics Hardware,?COMPUTER GRAPHICS forum, Volume 26 (2007), number 1 pp. 80–113

[8] NVIDIA CUDA Programming Guide

http://developer.download.nvidia.com/compute/cuda/2_0/docs/NVIDIA_CUDA_Programming_Guide_2.0.pdf

[9] OpenCL Website,?http://www.khronos.org/opencl/

[10]?維基百科OpenCL Website,?http://en.wikipedia.org/wiki/OpenCL

[11]?百度百科DirectCompute Website,?http://baike.baidu.com/view/3245449.html?fromTaglist

[12]?Technical Overview:ATI Stream Computing,

http://developer.amd.com/gpu_assets/Stream_Computing_Overview.pdf

[13]?維基百科GPGPU Website,?http://en.wikipedia.org/wiki/GPGPU

[14] Matlab Parallel Computing,?http://www.mathworks.com/products/parallel-computing/

[15] Jacket Website,?http://www.accelereyes.com/

[16]?http://www.nvidia.com/object/builtforadobepros.html

[17]?AMAX GPU集群開創(chuàng)高性能計算新紀(jì)元,?http://server.zol.com.cn/189/1891144.html

[18]?Announcing Cluster GPU Instances for Amazon EC2,?http://aws.amazon.com/ec2/

[19] GPU VSIPL: High-Performance VSIPL Implementation for GPUs

http://gpu-vsipl.gtri.gatech.edu/

[20] NVIDIA Performance Primitives (NPP) Library

http://developer.nvidia.com/object/npp_home.html

[21] CUDA Vision and Imaging Library,?http://www.cuvilib.com/

[22] GPU4Vision,?http://gpu4vision.icg.tugraz.at/

[23] OpenVIDIA: Parallel GPU Computer Vision

http://openvidia.sourceforge.net/index.php/OpenVIDIA

[24] SiftGPU: A GPU Implementation of Scale Invariant Feature Transform (SIFT)

http://www.cs.unc.edu/~ccwu/siftgpu/

[25] Multisvm Website,?http://code.google.com/p/multisvm/

[26] GPUMiner Website,?http://code.google.com/p/gpuminer/

[27] Parallel Search On Video Cards

http://www.usenix.org/event/hotpar09/tech/full_papers/kaldeway/kaldeway.pdf

[28] Nadathur Satis, et al, Designing Ef?cient Sorting Algorithms for Manycore GPUs, 23rd IEEE International Parallel and Distributed Processing Symposium, May 2009

http://mgarland.org/files/papers/gpusort-ipdps09.pdf

[29]?Naga K. Govindaraju, et al, GPUTeraSort:High Performance Graphics Coprocessor Sorting for Large Database Management, Microsoft Technical Report 2005

http://research.microsoft.com/pubs/64572/tr-2005-183.pdf

[30] Erik Sintorn, et al, Fast Parallel GPU-Sorting Using a Hybrid Algorithm,

http://www.cse.chalmers.se/~uffe/hybridsort.pdf

[31] GPUQP: Query Co-Processing Using Graphics Processors,?http://www.cse.ust.hk/gpuqp/

[32] Ren Wu, et al, GPU-Accelerated Large Scale Analytics, HP Laboratories

http://www.hpl.hp.com/techreports/2009/HPL-2009-38.pdf

[33] Sean P. Ponce, Towards Algorithm Transformation for Temporal Data Mining on GPU, Master Thesis of Sean P. Ponce, Virginia Polytechnic Institute and State University

http://scholar.lib.vt.edu/theses/available/etd-08062009-133358/unrestricted/ponce-thesis.pdf

[34] Yongpeng Zhang, Frank Mueller, et al, GPU-Accelerated Text Mining,?EPHAM’09

http://moss.csc.ncsu.edu/~mueller/ftp/pub/mueller/papers/epham09.pdf

[35] Cmatch: Fast Exact String Matching on the GPU,http://www.cbcb.umd.edu/software/cmatch/

[36]?MUMmerGPU: High-throughput sequence alignment using Graphics Processing Units

http://sourceforge.net/apps/mediawiki/mummergpu/index.php?title=MUMmerGPU

[37] Mars: A MapReduce Framework on Graphics Processors

http://www.cse.ust.hk/gpuqp/Mars.html

[38] DisMaRC: A Distributed Map Reduce framework on CUDA

http://www.cs.utexas.edu/~karthikm/dismarc.pdf

[39] NVIDIA行業(yè)軟件解決方案,http://www.nvidia.cn/object/vertical_solutions_cn.html


總結(jié)

以上是生活随笔為你收集整理的gpu 概论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。