GPU計算CUDA基本介紹.ppt_第1頁
GPU計算CUDA基本介紹.ppt_第2頁
GPU計算CUDA基本介紹.ppt_第3頁
GPU計算CUDA基本介紹.ppt_第4頁
GPU計算CUDA基本介紹.ppt_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、CUDA基本介紹,基于Nvidia GPU的通用計算開發(fā) 張舒,電子科技大學 電子工程學院 06級碩士研究生 信號探測與獲取技術專業(yè) 研究方向:合成孔徑雷達成像與雷達目標像識別 信號處理與模式識別的算法與硬件實現(xiàn)研究,GPU的優(yōu)勢,強大的處理能力 GPU接近1Tflops/s 高帶寬 140GB/s 低成本 Gflop/$和Gflops/w高于CPU 當前世界超級計算機五百強的入門門檻為12Tflops/s 一個三節(jié)點,每節(jié)點4GPU的集群,總處理能力就超過12Tflops/s,如果使用GTX280只需10萬元左右,使用專用的Tesla也只需20萬左右,GPU /CPU計算能力比較,GPU/C

2、PU存儲器帶寬比較,GPU/CPU架構比較,延遲與吞吐量,CPU: 通過大的緩存保證線程訪問內(nèi)存的低延遲,但內(nèi)存帶寬小,執(zhí)行單元太少,數(shù)據(jù)吞吐量小 需要硬件機制保證緩存命中率和數(shù)據(jù)一致性 GPU: 高顯存帶寬和很強的處理能力提供了很大的數(shù)據(jù)吞吐量 緩存不檢查數(shù)據(jù)一致性 直接訪問顯存延時可達數(shù)百乃至上千時鐘周期,單核CPU已經(jīng)走到了盡頭,頻率提高遇到了瓶頸 從p4時代至今主流處理器頻率一直在2GHz-3GHz左右 架構上已無潛力可挖。超線程 多流水線 復雜的分支預測 大緩存等技術已經(jīng)將性能發(fā)揮到了極致,但是通用計算中的指令級并行仍然偏低 上述技術占用了芯片上的絕大多數(shù)晶體管和面積,目的卻只是讓極

3、少數(shù)的執(zhí)行單元能夠滿負荷工作,GPU能夠更好的利用摩爾定律提供的晶體管,圖形渲染過程高度并行,因此硬件也是高度并行的 少量的控制單元,大量的執(zhí)行單元 顯存被固化在了PCB上,擁有更好的EMI性能,因此運行頻率高于內(nèi)存 通過更大的位寬實現(xiàn)了高帶寬,當前的單核并行計算產(chǎn)品,IBM Cell 應用主要見于PS3 SUN Niarraga NPU NV/ATI GPU 大規(guī)模應用 GPU最為常見,受市場牽引發(fā)展最快,性價比最高,架構比較,CPU GPU FPGA實現(xiàn)比較,當前的GPU開發(fā)環(huán)境,Cg:優(yōu)秀的圖形學開發(fā)環(huán)境,但不適合GPU通用計算開發(fā) ATI stream:硬件上已經(jīng)有了基礎,但只有低層次

4、匯編能夠使用所有資源。高層次抽象Brook本質(zhì)上是基于上一代GPU的,缺乏良好的編程模型 OpenCL:聯(lián)合制定的標準,抽象層次較低,對硬件直接操作更多,代碼需要根據(jù)不同硬件優(yōu)化 CUDA:目前最佳選擇,未來的發(fā)展趨勢,GPU通用計算進一步發(fā)展:更高版本的CUDA, OpenCL 新產(chǎn)品涌現(xiàn):Nvidia和AMD的下一代產(chǎn)品,Intel的LarraBee CPU+GPU產(chǎn)品:減少了CPU-GPU通信成本,但存儲器帶寬和功耗面積等可能將制約集成度。在較低端的應用中將有用武之地。,CUDA的硬件架構適合通用計算,G8x系G9x系GT200系列 標量機架構提高了處理效率,更加適合通用計算 增加了sh

5、ared memory和同步機制,實現(xiàn)線程間通信 以通用的處理器矩陣為主,輔以專用圖形單元,GTX280性能,933 Gflops(MAD)單精度 116 Gflops雙精度(MAD ) 512bit位寬ddr3顯存,提供了140GB/s的帶寬 1G的顯存,GT200框圖,TPC,3 SM Instruction and constant cache Texture Load/store,SM,ROP,ROP,對DRAM進行訪問 TEXTURE機制 對global的atomic操作,微架構比較,執(zhí)行流水線,工作在通用計算模式下的GT200,SM架構,DUAL-Issue 并發(fā),每二周期可以發(fā)射

6、 一次指令 FPU和SFU指令延遲 是四周期,某些情況下可以讓FPU和SFU并發(fā)執(zhí)行,實現(xiàn)超標量 理論處理能力峰值沒有計算dual-issue 雙精度浮點計算不能dual-issue,CUDA架構GPU硬件特點,硬件資源模塊化,根據(jù)市場定位裁減 高度并行 存在TPC SM 兩層 每個SM又有8SP SM內(nèi)存在高速的shared memory和同步機制 原子操作有利于實現(xiàn)通用計算中的數(shù)據(jù)順序一致性 shared memory Texture cache constant cache等高速片內(nèi)存儲器有助于提高數(shù)據(jù)訪問速度,節(jié)省帶寬,如何選購硬件,目前(2008. 12)只有CUDA能夠完全發(fā)揮新一

7、代GPU的全部計算能力。Nvidia的G80以上的GPU能夠支持CUDA。 GT200系列不僅性能更強,而且具有很多實用的新特性 Tesla專用流處理器擁有更大的顯存和更高的核心頻率,通過降低顯存頻率,屏蔽不需要的圖形單元和改善散熱獲得了更好的穩(wěn)定性,適合服務器或者集群使用,適合的應用,GPU只有在計算高度數(shù)據(jù)并行任務時才能發(fā)揮作用。在這類任務中,需要處理大量的數(shù)據(jù),數(shù)據(jù)的儲存形式類似于規(guī)則的網(wǎng)格,而對這寫數(shù)據(jù)的進行的處理則基本相同。這類數(shù)據(jù)并行問題的經(jīng)典例子有:圖像處理,物理模型模擬(如計算流體力學),工程和金融模擬與分析,搜索,排序。 在很多應用中取得了1-2個數(shù)量級的加速,不適合的應用,

8、需要復雜數(shù)據(jù)結構的計算如樹,相關矩陣,鏈表,空間細分結構等,則不適用于使用GPU進行計算。 串行和事務性處理較多的程序 并行規(guī)模很小的應用,如只有數(shù)個并行線程 需要ms量級實時性的程序 需要重新設計算法和數(shù)據(jù)結構或者打包處理,CUDA 執(zhí)行模型,重點是將CPU做為終端(Host),而GPU做為服務器(Server)或協(xié)處理器(Coprocessor),或者設備(Device),從而讓GPU來運行一些能夠被高度線程化的程序。 CUDA的基本思想是盡量得開發(fā)線程級并行(Thread Level Parallel),這些線程能夠在硬件中被動態(tài)的調(diào)度和執(zhí)行。,CUDA執(zhí)行模型,調(diào)用核程序時CPU調(diào)用A

9、PI將顯卡端程序的二進 制代碼傳到GPU grid運行在SPA上 block運行在SM上 thread運行在SP上,grid block thread,Kernel不是一個完整的程序,而只是其中的一個關鍵并行計算步 Kernel以一個網(wǎng)格(Grid)的形式執(zhí)行,每個網(wǎng)格由若干個線程塊(block)組成,每一個線程塊又由最多512個線程(thread)組成。,grid block thread,一個grid最多可以有65535 * 65535個block 一個block總共最多可以有512個thread,在三個維度上的最大值分別為512, 512和64,grid block thread,gri

10、d之間通過global memory交換數(shù)據(jù) block之間不能相互通信,只能通過global memory共享數(shù)據(jù),不要讓多個block寫同一區(qū)段內(nèi)容(不保證數(shù)據(jù)一致性和順序一致性) 同一block內(nèi)的thread可以通過shared memory和同步實現(xiàn)通信 block間粗粒度并行,block內(nèi)thread細粒度并行,warp,Warp是硬件特性帶來的概念,在CUDA C語言中是透明的(除vote函數(shù)),但應用中不能忽略 一個warp中有32個線程,這是因為SM中有8個SP,執(zhí)行一條指令的延遲是4個周期,使用了流水線技術 一個half warp中有16個線程,這是因為執(zhí)行單元的頻率是其他

11、單元的兩倍,每兩個周期才進行一次數(shù)據(jù)傳輸,SIMT編程模型,SIMT是對SIMD(Single Instruction, Multiple Data,單指令多數(shù)據(jù))的一種變形。 兩者的區(qū)別在于:SIMD的向量寬度是顯式的,固定的,數(shù)據(jù)必須打包成向量才能進行處理;而SIMT中,執(zhí)行寬度則完全由硬件自動處理了。 (每個block中的thread數(shù)量不一定是32) 而SIMT中的warp中的每個線程的寄存器都是私有的,它們只能通過shared memory來進行通信。,分支性能,與現(xiàn)代的微處理器不同,Nvidia的SM沒有預測執(zhí)行機制-沒有分支預測單元(Branch Predicator)。 在需要

12、分支時,只有當warp中所有的線程都計算出各自的分支的地址,并且完成取指以后,warp才能繼續(xù)往下執(zhí)行。 如果一個warp內(nèi)需要執(zhí)行N個分支,那么SM就需要把每一個分支的指令發(fā)射到每一個SP上,再由SP根據(jù)線程的邏輯決定需不需要執(zhí)行。這是一個串行過程,此時SIMT完成分支的時間是多個分支時間之和。,存儲器模型,Register Local shared Global Constant Texture Host memory Pinned host memory,寄存器與local memory,對每個線程來說,寄存器都是線程私有的-這與CPU中一樣。如果寄存器被消耗完,數(shù)據(jù)將被存儲在本地存儲器

13、(local memory)。Local memory對每個線程也是私有的,但是local memory中的數(shù)據(jù)是被保存在顯存中,而不是片內(nèi)的寄存器或者緩存中,速度很慢。線程的輸入和中間輸出變量將被保存在寄存器或者本地存儲器中。,Shared memory,用于線程間通信的共享存儲器。共享存儲器是一塊可以被同一block中的所有thread訪問的可讀寫存儲器。 訪問共享存儲器幾乎和訪問寄存器一樣快,是實現(xiàn)線程間通信的延遲最小的方法。 共享存儲器可以實現(xiàn)許多不同的功能,如用于保存共用的計數(shù)器(例如計算循環(huán)次數(shù))或者block的公用結果(例如計算512個數(shù)的平均值,并用于以后的計算)。,const

14、ant memory, texture memory,利用GPU用于圖形計算的專用單元發(fā)展而來的高速只讀緩存 速度與命中率有關,不命中時將進行對顯存的訪問 常數(shù)存儲器空間較小(只有64k),支持隨機訪問。從host端只寫,從device端只讀 紋理存儲器尺寸則大得多,并且支持二維尋址。(一個數(shù)據(jù)的“上下左右”的數(shù)據(jù)都能被讀入緩存)適合實現(xiàn)圖像處理算法和查找表,全局存儲器,使用的是普通的顯存,無緩存,可讀寫,速度慢 整個網(wǎng)格中的任意線程都能讀寫全局存儲器的任意位置,并且既可以從CPU訪問,也可以從CPU訪問。,各種存儲器的延遲,register: 1 周期 shared memory: 1 周期

15、( 無bank conflict ) - 16 周期( 發(fā)生16路 bank conflict) texture memory: 1 ( 命中) - 數(shù)百周期(不命中) constant memory: 1 ( 命中) - 數(shù)百周期( 不命中) global local memory: 數(shù)百周期,各存儲器大小,每個SM中有64K(GT200)或者32K(G8x, G9x)寄存器,寄存器的最小單位是32bit的register file 每個SM中有16K shared memory 一共可以聲明64K的constant memory,但每個SM的cache序列只有8K 可以聲明很大的textu

16、re memory,但是實際上的texture cache序列為每SM 6-8K,使用存儲器時可能出現(xiàn)的問題,致命問題:無法產(chǎn)生正確結果 多個block訪問global同一塊,以及block內(nèi)thread間線程通信時的數(shù)據(jù)一致性問題 Texture的工作模式設置錯誤 效率問題:大大增加訪存延遲 Shared bank conflict問題 Global 合并訪問問題,Bank conflict,Shared memory被分為了16個bank,單位是32-bit,相鄰數(shù)據(jù)在不同bank中,對16余數(shù)相同的數(shù)據(jù)在同一bank Half warp中的16個線程訪問shared memory時最好一

17、一對應,如果多個thread同時訪問屬于同一bank的數(shù)據(jù)將發(fā)生bank conflict 16個線程讀同一數(shù)據(jù)時,會發(fā)生一次廣播,只用一個cycle,沒有bank conflict,合并訪問,訪問顯存時要遵守嚴格的合并訪問規(guī)則 將half warp訪問global的起始位置嚴格的對齊到16的整數(shù)倍 在G8x, G9x硬件上thread訪問顯存的位置必須逐一遞增 GT200有了很大的改進,對齊和次序比較靈活 好的合并訪問可以將存儲器訪問次數(shù)減少十幾倍,CUDA API,CUDA C語言,由Nvidia的CUDA編譯器(nvcc)編譯 CUDA C不是C語言,而是對C語言進行擴展形成的變種。,C

18、UDA對C的擴展:函數(shù)限定符,對函數(shù)有了限定符,用來規(guī)定函數(shù)是在host還是在device上執(zhí)行,以及這個函數(shù)是從host調(diào)用還是從device調(diào)用。這些限定符是:_device_,_host_和_global_。,CUDA對C的擴展:函數(shù)限定符,_device_函數(shù)在device端執(zhí)行,并且也只能從device端調(diào)用,即作為device端的子函數(shù)來使用 _global_函數(shù)即kernel函數(shù),它在設備上執(zhí)行,但是要從host端調(diào)用 _host_函數(shù)在host端執(zhí)行,也只能從host端調(diào)用,與一般的C函數(shù)相同,CUDA對C的擴展:變量限定符,對變量類型的限定符,用來規(guī)定變量被存儲在哪一種存儲器

19、上。 傳統(tǒng)的在CPU上運行的程序中,編譯器就能自動決定將變量存儲在CPU的寄存器還是在計算機的內(nèi)存中。 而在CUDA中,不僅要使用host端的內(nèi)存,而且也要使用顯卡上的顯存和GPU上的幾種寄存器和緩存。在CUDA編程模型中,一共抽象出來了多達8種不同的存儲器!,CUDA對C的擴展:變量限定符,_device_ _device_限定符聲明的變量存在于device端,其他的變量限定符聲明的變量雖然存在于不同的存儲器里,但總體來說也都在device端。所以_device_限定符可以與其他的限定符聯(lián)用。當單獨使用_device_限定符修飾變量時,這個變量: 存在于global memory中; 變量生

20、命周期與整個程序一樣長; 可以被grid中所有的線程都可以訪問,也可以從host端通過運行時庫中的函數(shù)訪問。,CUDA對C的擴展:變量限定符,_constant_ _constant_限定符,可以與_device_聯(lián)用,即_device_ _constant_,此時等同于單獨使用_constant_。使用_constant_限定符修飾的變量: 存在于constant memory中,訪問時速度一般比使用global memory略快; 變量生命周期與整個程序一樣長; 可以被grid中所有的線程讀,從host端通過運行時庫中的函數(shù)寫。,CUDA對C的擴展:變量限定符,_shared_ _shar

21、ed_限定符,可以與_device_聯(lián)用,即_device_ _shared_,此時等同于單獨使用_shared_。使用_shared_限定符修飾的變量: 存在于block中的shared memory中; 變量生命周期與block相同; 只有同一block內(nèi)的thread才能訪問。,CUDA對C的擴展:kernel執(zhí)行參數(shù),運算符,用來傳遞一些kernel執(zhí)行參數(shù) Grid的大小和維度 Block的大小和維度 外部聲明的shared memory大小 stream編號,CUDA對C的擴展:內(nèi)建變量,Dim3 ThreadIdx(三維) Dim3 ThreadDim(三維) Dim3 Bloc

22、kIdx(二維) Dim3 BlockDim(三維),執(zhí)行參數(shù)與內(nèi)建變量的作用,各個thread和block之間的唯一不同就是threadID和BlockID,通過內(nèi)建變量控制各個線程處理的指令和數(shù)據(jù) CPU運行核函數(shù)時的執(zhí)行參數(shù)確定GPU在SPA上分配多少個block,在SM上分配多少個thread,CUDA API,CUDA API需要CUDA driver API才能運行,新版本的Nvidia驅(qū)動已經(jīng)包含了CUDA driver API CUDA runtime API是CUDA API的可選組件,它是一種動態(tài)編譯器(JIT),能夠直接訪問實際中的底層硬件架構。,CUDA API功能,設

23、備管理(Device management) 上下文管理(Context management) 存儲器管理(Memory management) 代碼塊管理(Code Module management) 執(zhí)行控制(Excution Control) 紋理索引管理(Texture Reference management) 與OpenGL和Direct3D的互操作(Interoperity with OpenGL and Direct3D),NVCC 編譯器,生成三種不同的輸出:PTX,CUDA二進制序列和標準C,NVCC 編譯器 PTX,PTX(Parallel Thread eXecut

24、ion)作用類似于匯編,是為動態(tài)編譯器(包含在標準的Nvidia 驅(qū)動中)設計的輸入指令序列。這樣,不同的顯卡使用不同的機器語言,而動態(tài)編譯器卻可以運行相同的PTX。這樣做使PTX成為了一個穩(wěn)定的接口,帶來了很多好處:后向兼容性,更長的壽命,更好的可擴展性和更高的性能,但在一定程度上也限制了工程上的自由發(fā)揮。這種技術保證了兼容型,但也使新一代的產(chǎn)品必須擁有上代產(chǎn)品的所有能力,這樣才能讓今天的PTX代碼在未來的系統(tǒng)上仍然可以運行。,NVCC 編譯器 CUBIN,雖然PTX和JIT編譯器提供了很高的性能,但也不是在所有的場合都適用。某些獨立軟件開發(fā)商傾向于犧牲性能,以獲得更好的可確定性和可驗證性。

25、JIT編譯器的輸出隨著目標硬件和一些其他因素會發(fā)生變化。對于需要能夠確定的代碼的獨立軟件開發(fā)商(比如很多財經(jīng)軟件開發(fā)商),它們可以將代碼直接編譯成CUDA二進制代碼,這樣就能避免JIT過程的不確定性。直接編譯得到的CUDA二進制代碼是與特定的硬件和驅(qū)動相關的。,NVCC 編譯器 C,Nvcc的輸出還包括標準C。由nvcc生成的C代碼將被重定向到其他編譯器進行編譯,比如ICC,GCC或者其他合適的高性能編譯器。CUDA中明確的表示了程序中的并行度沒不僅在用于編寫運行在Nvidia GPU上的代碼時非常有效,而且為多核CPU生成高性能代碼。在某些應用中,CUDA生成的代碼比標準的x86編譯器生成的

26、代碼的性能提高了4倍。,CUDA API 庫函數(shù),CUFFT GPU進行傅立葉變換的函數(shù)庫,提供了與廣泛使用的FFTW庫相似的接口。 CUBLAS(CUDA Basic Linear Algorithm Subprogrammes)庫是一個基本的矩陣與向量的運算庫,提供了與BLAS相似的接口,可以用于簡單的矩陣計算,也可以作為基礎構建更加復雜的函數(shù)包,如LAPACK等。 CUDPP(CUDA Data parallel primitives) 庫提供了很多基本的常用并行操作函數(shù),如排序、搜索等,可以作為基本組件快速的搭建出并行計算程序。,如何編寫CUDA程序,硬件實現(xiàn)不完全透明,需要掌握硬件實現(xiàn)的原理 并行度高,適合CPU的小規(guī)模并行算法不一定適用,需要重新設計算法或者參考在集群上使用的并行算法,如何編寫CUDA程序?,確定適合GPU的算法,找出算法中的并行部分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論