GPU通用計算調研報告

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

關鍵詞: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]。

表1??Shader Model版本

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

?????????????????????????????????????????????????

2.2?AMD與NVIDIA最新GPU架構比較

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

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

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

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

?

圖3?NVIDIA和AMD使用了兩種不同的流處理器架構

兩種架構的另一個不同在于它們的緩存配置,雖然在在RV870與GF100上,我們都看到了一級緩存與二級緩存的設計。AMD RV870提供了32KB的LDS(Local Data Store),作用類似于NVIDIA傳統的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,本質上是一個可讀寫的cache,可用于各個SIMD Core之間的數據交換。GF100提供了768KB的一體化L2 cache,這個L2 cache為所有的Load/Store以及紋理請求提供高速緩存,對所有的SM來說L2 cache上的數據都是連貫一致的,從L2 cache讀取到的數據就是最新的數據。RV870的L2 cache則不能提供GF100中?L2 Cache共享內核間數據的特性。

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

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

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

?

2.3 GPU通用計算編程模型

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

2.3.1?傳統GPU通用計算開發

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

2.3.2 CUDA –C/C++及其SDK

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

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

?

圖4?異構編程模型

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

???????從CUDA Toolkit3.0開始支持NVIDIA最新的Fermi架構,最大程度上利用Fermi架構在通用計算方面的優勢。CUDA 3.0也開始支持C++的繼承和模板機制提高編程靈活性,同時CUDA C/C++內核現在以標準ELF格式進行編譯,開始支持硬件調試,還增加了一個新的Direct3D、OpenGL統一協作API,支持OpenGL紋理和Direct3D 11標準,支持所有的OpenCL特征。

?

2.3.3 OpenCL

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

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

???????OpenCL也是基于C的一個程式語言,分為Platform Layer、Runtime、Compiler三個部分:Platform Layer用來管理計算裝置,提供啟始化裝置的界面,并用來建立compute contexts和work-queues。Runtime用來管理資源,并執行程序的kernel。Compiler則是ISO C99的子集合,并加上了OpenCL特殊的語法。在OpenCL的執行模型中,有所謂的Compute Kernel和Compute Program。?Compute Kernel基本上類似于CUDA定義的kernel,是最基本的的計算單元;而Compute Program則是Compute Kernel和內建函數的集合,類似一個動態函數庫。很大程度上OpenCL與CUDA Driver API比較相像。

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

?

2.3.4 DirectCopmute

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

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

?

2.3.5 Stream SDK

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

?

圖5?AMD流計算軟件系統之間的關系

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

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

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

??

3、GPU通用計算的應用領域

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

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

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

下面對GPU通用計算在各個領域的成功應用做一個概述。

?

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

3.1?常見軟件

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

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

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

?

3.2?高性能計算

超級計算機一般指在性能上居于世界領先地位的計算機,通常有成千上萬個處理器以及專門設計的內存和I/O系統。它們采用的架構與通常的個人計算機有很大區別,使用的技術也隨著時代和具體應用不斷變動。GPU通用計算提出以后,不斷有超級計算機開始安裝GPU以提高性能。2010年9月,全球超級計算機領軍企業Cray公司正式宣布,該公司將為Cray XE6系列產品開發基于NVIDIA Tesla20系列GPU的刀片服務器。2010年11月揭曉的世界上最快的超級計算機top500列表中,最快的5個系統中有3個使用了NVIDIA的Tesla型號GPU產品,其中中國國防科技大學研發的“天河一號”榮膺榜首,最快運算速度達到2.507 petaflops。2009年10月29日完成的“天河一號”一期系統有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月,升級優化后的“天河一號”,配備了14336顆Xeon X5670處理器(32nm工藝,六核12線程,2.93GHz主頻),7168塊基于NVIDIA Fermi架構的Tesla M2050計算卡(主頻1.15GHz,雙精度浮點性能515Gflops、單精度浮點性能1.03Tflops)以及2048顆國防科技大學研制的飛騰處理器(八核64線程,主頻1GHz),峰值性能每秒4700萬億次、持續性能每秒2507萬億次(LINPACK實測值)。

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

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

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

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

?

3.3?信號與圖像處理

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

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

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

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

?

3.4?數據庫與數據挖掘

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

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

在數據挖掘領域,HP實驗室的Wu,Zhang,Hsu等研究了使用GPU對商業智能分析進行加速[32]。福尼吉亞理工大學的Sean P. Ponce在其碩士論文中應用算法轉換于臨時數據挖掘,使其數據并行化,更適合在GPU上實現加速[33]。北卡羅來納州立大學的Y. Zhang和美國橡樹嶺國家實驗室的X. Cui聯合研究了利用CUDA加速文本挖掘,開發了優化的文本搜索算法[34]。馬里蘭大學的Schatz,Trapnel等開發的Cmatch和MUMmerGPU[35][36],在GPU上實現了高效的的后綴樹算法,能夠對一系列查詢字符串及其子串進行并行搜索,從而進行快速準確的字符串匹配。香港科技大學的Fang和微軟亞洲研究院的He等開發了一個小工具GPUMiner,實現了K-均值聚類算法和先驗頻率模式挖掘算法,用CPU對控制數據I/O和CPU與GPU之間的數據傳輸,用CPU和GPU聯合實現并行算法并提供可視化界面[26]。

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

?

4、總結和展望

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

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

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

?

參考文獻:

[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] 10年GPU通用計算回顧,?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集群開創高性能計算新紀元,?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行業軟件解決方案,http://www.nvidia.cn/object/vertical_solutions_cn.html



[1]?DirectX并不是一個單純的圖形API,它是由微軟公司開發的用途廣泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個組件,它提供了一整套的多媒體接口方案。只是其在3D圖形方面的優秀表現,讓它的其它幾個組件幾乎被人們忽略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 圖形化工具 GitKraken 的使用 —— 分支的創建與合并

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 分支管理是Git工作流的重點 在之前的文章中通過GitKraken可以很清楚的看到,每一次commit,git把他們串成了一條線…

ubuntu11.04下CUDA4.0的安裝與配置

1:下載CUDA 4.0 安裝官網最新的顯卡驅動: 安裝方法可以參考: 《Ubuntu11.04下安裝Nvidia顯卡驅動的方法》 然后從NVIDIA網站(http://developer.nvidia.com/cuda-downloads)下載 CUDA Toolkit for Ubuntu Linux 10.10&a…

GitKraken - 簡單教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 簡單介紹:外觀 GitKraken首頁預覽圖 常用快捷鍵 模糊搜索:(cmd p) 在進行模糊搜索的時候會在當前頁面彈出一個…

LeetCode刷題第二天——3Longest Substring Without repeating character 4 Median of Two Sorted Arrays...

混淆點: 子串 連續 子序列 可以不連續 知識點: HashMap: 出現問題: 1.使用unordered_map頭文件時報錯 #error This file requires compiler and library support for the ISO C 2011 standard. This support is currently experi…

【BZOJ 3339 / BZOJ 3585 / luogu 4137】Rmq Problem / mex

【原題題面】傳送門 【題解大意】 都說了是莫隊練習題。 考慮已知[l,r]區間的mex值時&#xff0c;如何求[l1,r]的mex值。 比較a[l1]與已知ans的大小&#xff0c;如果a[l1]>ans或者a[l1]<ans&#xff0c;均對答案沒有影響。 如果a[l1]ans&#xff0c;考慮找到一個比當前an…

postman 無法正常返回結果 Could not get any response

在瀏覽器輸入地址可以返回結果&#xff0c;但是由于返回的json沒有格式&#xff0c;看起來比較麻煩&#xff0c;用postman卻報錯Could not get any response。 可以注意到下面寫了可能的情況&#xff1a;比如服務器無響應&#xff08;由于瀏覽器可以訪問&#xff0c;所以排除…

在Windows 下使用OpenCL

目前&#xff0c;NVIDIA和AMD的Windows driver均有支援OpenCL&#xff08;NVIDIA的正式版driver是從195.62版開始&#xff0c;而AMD則是從9.11版開始&#xff09;。NVIDIA的正式版driver中包含OpenCL.dll&#xff0c;因此可以直接使用。AMD到目前為止&#xff0c;則仍需要安裝其…

Java中方法重載

方法重載&#xff1a;指在同一個類中&#xff0c;允許存在一個以上的同名方法&#xff0c;只要它們的參數列表不同即可&#xff0c;與修飾符和返回值類型無關。參數列表&#xff1a;個數不同&#xff0c;數據類型不同&#xff0c;順序不同。重載方法調用&#xff1a;JVM通過方法…

swift -自定義返回圖片,替換系統圖片backItem

隱藏系統返回按鍵 方法1&#xff1a;self.navigationItem.leftBarButtonItem nil //隱藏自定義的itemself.navigationItem.hidesBackButton true //隱藏系統的item方法2&#xff1a;let item UIBarButtonItem(image: nil, style: UIBarButtonItem.Style.plain, target: …

云服務器主機內網 ip 和外網 ip 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 服務器公網ip   可以用于域名解析ip&#xff0c;服務器遠程登錄ip&#xff0c;是最主要的服務器ip地址。    內網ip   不能用于域…

[Swift]快速反向平方根 | Fast inverse square root

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

適用于ATI卡的GPU計算MD5的小程序源碼,基于AMD APP SDK開發

以下代碼在win7 home basic , ati hd 5450平臺測試通過&#xff0c;處理速度為每秒100萬次。 程序很簡單&#xff0c;只有一個main.cpp程序。Device端只有一個md5.cl文件。 下面我把代碼貼出來&#xff0c;因為不能上傳附件&#xff0c;我把完整工程包放到了242337476的群共享里…

【CentOS 7筆記11】,目錄權限,所有者與所有組,隱藏權限#171022

2019獨角獸企業重金招聘Python工程師標準>>> shallow丿ove 一. 文件或目錄權限change mode r4&#xff0c;w2&#xff0c;x1 selinux開啟則權限后面會有個. 更改SElinux配置文件&#xff0c;將永久關閉SElinux [rootlocalhost ~]# vi /etc/selinux/config #將默認…

python字符編碼與轉碼

詳細文章: http://www.cnblogs.com/yuanchenqi/articles/5956943.html http://www.diveintopython3.net/strings.html 需知: 1.在python2默認編碼是ASCII, python3里默認是unicode 2.unicode 分為 utf-32(占4個字節),utf-16(占兩個字節)&#xff0c;utf-8(占1-4個字節)&#xf…

IntelliJ IDEA 詳細圖解最常用的配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 剛剛使用IntelliJ IDEA 編輯器的時候&#xff0c;會有很多設置&#xff0c;會方便以后的開發&#xff0c;磨刀不誤砍柴工。 比如&#x…

OpenCL快速入門教程

OpenCL快速入門教程 原文地址&#xff1a;http://opencl.codeplex.com/wikipage?titleOpenCL%20Tutorials%20-%201 翻譯日期&#xff1a;2012年6月4日星期一 這是第一篇真正的OpenCL教程。這篇文章不會從GPU結構的技術概念和性能指標入手。我們將會從OpenCL的基礎API開始&…

Git使用教程-idea系列中git使用教程

一、新建項目 新建項目后記得復制git倉庫的地址。 二、上傳項目到git倉庫 在你的idea里新建git倉庫&#xff0c;這是新建本地倉庫&#xff0c;等會會同步到線上git倉庫 新建后如果代碼不是文件名不是綠色的表示沒有加入到git索引中 將需要上傳的文件按照下圖方式add 添加后&…

分布式開放 消息系統 (RocketMQ) 的原理與實踐

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 分布式消息系統作為實現分布式系統可擴展、可伸縮性的關鍵組件&#xff0c;需要具有高吞吐量、高可用等特點。而談到消息系統的設計&…

日本企業RPA導入風險分析和解決對策

日本企業RPA導入風險分析和解決對策 文/馬磊 【UiBot東京特約觀察 第三期】 RPA作為一種能將定型業務完全自動化的技術&#xff0c;在老齡化、少子化和勞動力不足的日本備受矚目。上一期我們談到了關于日本工作方式改革法案的實施以及RPA導入后帶來的積極影響。但是任何事物都會…

使用 OpenCL.Net 進行 C# GPU 并行編程

在 初探 C# GPU 通用計算技術 中&#xff0c;我使用 Accelerator 編寫了一個簡單的 GPU 計算程序。也簡單看了一些 Brahma 的代碼&#xff0c;從它的 SVN 最新代碼看&#xff0c;Brahma 要轉移到使用 OpenCL.Net 作為底層了&#xff0c;于是也去網上搜索了一下&#xff0c;發現…