圖形處理器(英語:Graphics Processing Unit,縮寫:GPU),又稱顯示核心、視覺處理器、顯示芯片,是一種專門在個(gè)人電腦、工作站、游戲機(jī)和一些移動(dòng)設(shè)備(如平板電腦、智能手機(jī)等)上圖像運(yùn)算工作的微處理器。
圖形處置單元(或簡稱GPU)會(huì)賣力處置從PC外部傳送到所銜接表現(xiàn)器的一切內(nèi)容,不管你在玩游戲、編纂視頻或只是盯著桌面的壁紙,一切表現(xiàn)器中表現(xiàn)的圖象都是由GPU停止襯著的。本文體系極客將向人人先容甚么是GPU、它是若何事情的,和為何要為游戲和圖象密集型應(yīng)用程序設(shè)置裝備擺設(shè)公用顯卡。
對(duì)通俗用戶來講,現(xiàn)實(shí)上不消要自力顯卡就能夠向表現(xiàn)器「供給」內(nèi)容。像筆記本電腦或平板用戶,平日CPU芯片都邑集成GPU內(nèi)核,也便是人人熟稱的「核顯」,如許便可認(rèn)為對(duì)表現(xiàn)請求不高的低功耗裝備供給更好的性價(jià)比。
正因如斯,部門筆記本電腦、平板電腦和某些PC用戶來講,要想將其圖形處置器進(jìn)級(jí)到更高級(jí)別也很艱苦,乃至不太能夠。這就會(huì)招致游戲(和視頻編纂等)機(jī)能欠安,只能將圖形品質(zhì)設(shè)置低落能力事情。對(duì)此類用戶而言,只要在主板支撐和余暇空間充足的情況下,增加新顯卡才能夠或許把(游戲)表現(xiàn)體驗(yàn)進(jìn)步到一個(gè)新的程度。
GPU發(fā)展和現(xiàn)狀
1. GPU原來就是為了加速3D渲染的,后來被拿過來做計(jì)算。
2. 現(xiàn)在GPU可以支持通用的指令,可以用傳統(tǒng)的C和C++,還有Fortran來編程。
3. 現(xiàn)在單個(gè)高端GPU的性能已經(jīng)達(dá)到了傳統(tǒng)多核CPU集群的性能
4. 有的應(yīng)用通過GPU加速相比傳統(tǒng)的多核CPU來說可以達(dá)到100X的加速。對(duì)某些特定應(yīng)用來說GPU還是更適合的。
GPU編程模型
1. 在GPU中,工作的分配是通過在調(diào)度空間上并行地應(yīng)用或者映射一個(gè)函數(shù)(或者叫做kernel)。舉例來說,一個(gè)矩陣中的每一個(gè)點(diǎn)就是調(diào)度空間。
2. kernel就是描述在一個(gè)線程在調(diào)度空間中的每一個(gè)點(diǎn)要完成的工作。在調(diào)度空間中,每一個(gè)點(diǎn)都要啟動(dòng)一個(gè)線程。
3. 由于GPU是在單個(gè)PCI-e卡上的協(xié)處理器,數(shù)據(jù)必須通過顯式地從系統(tǒng)內(nèi)存拷貝到GPU板上內(nèi)存。
4. GPU是以SIMD的多個(gè)group的形式組織的。在每一個(gè)SIMD的group(或者叫warp,在NIVIDA CUDA編程中為32個(gè)線程)中,所有的線程在lockstep中執(zhí)行相同的指令。這樣的在lockstep中執(zhí)行相同指令的多個(gè)線程就叫做warp,雖然分支是被允許的,但是如果同一個(gè)warp中的線程出現(xiàn)不同的執(zhí)行路徑,會(huì)帶來一些性能開銷。
4. 對(duì)于memory-bound的應(yīng)用來說,可能的話,同一個(gè)warp中的所有線程應(yīng)當(dāng)訪問相鄰的數(shù)據(jù)元素,同一個(gè)warp中相鄰的線程應(yīng)當(dāng)訪問相鄰的數(shù)據(jù)元素。這可能要對(duì)數(shù)據(jù)布局和數(shù)據(jù)訪問模式進(jìn)行重新安排。
5. GPU有多個(gè)內(nèi)存空間可用于開發(fā)數(shù)據(jù)訪問模式。除了golbal memory以外,還有constant memory(read-only, cached),,texture memory(read-only, cached, optimized for neighboring regions of an array)和per-block shared memory(a fast memory space within each warp processor, managed explicitly by the programmer)。
6. GPU編程有兩個(gè)主要平臺(tái),一個(gè)是OpenCL,一個(gè)編程方式類似OpenGL的產(chǎn)業(yè)標(biāo)準(zhǔn),還有另一個(gè)是為了C/C++ Fortran的CUDA,在NVIDIA的GPU上編程。
7. OpenCL/CUDA編譯器并不是把C代碼轉(zhuǎn)換成CUDA代碼,編程人員最主要的工作還是選擇算法和數(shù)據(jù)結(jié)構(gòu)。例如在GPU上,基數(shù)排序和歸并排序要比堆排序和快速排序好。Some programming effort is also required to write the necessary CUDA kernel(s) as well as to add code to transfer data to the GPU,launch the kernel(s), and then read back the results from the GPU.
什么應(yīng)用適合GPU
1. 內(nèi)核中有豪多并行線程的應(yīng)用
2. 對(duì)于線程間的數(shù)據(jù)交換都發(fā)生在kernel調(diào)度空間中的相鄰線程之間的應(yīng)用,因?yàn)檫@樣就可以用到per-block shared memory.
3. 數(shù)據(jù)并行的應(yīng)用,多個(gè)線程做相似工作,循環(huán)是數(shù)據(jù)并行的主要來源。
4. 那些能得到很好的天然硬件支持的應(yīng)用,如倒數(shù)和反平方根,不過在編程中要打開“fastmath”選項(xiàng),確保使用硬件支持功能。
5. 需要對(duì)每個(gè)數(shù)據(jù)元素做大量的計(jì)算,或者能夠充分利用寬內(nèi)存接口(wide memory interface這里有疑問)
6. 做同步操作較少的應(yīng)用。
什么應(yīng)用不適合GPU
1. 并行度小的應(yīng)用,如需要的線程數(shù)小于100個(gè),那么使用GPU加速效果不明顯
2. 不規(guī)則的任務(wù)并行---盡管應(yīng)用需要很多線程,但是這些線程都做不同的工作,那么GPU不能得到有效的利用。不過這也依賴于具體工作,多久對(duì)線程調(diào)度一次,加速的可能仍然存在。
3. 頻繁的全局同步,這要求全局的barrier,帶來很大性能開銷。
4. 在線程之間,會(huì)出現(xiàn)隨機(jī)的點(diǎn)對(duì)點(diǎn)同步的應(yīng)用。GPU對(duì)這個(gè)的支持不好,通常需要在每次同步的時(shí)候做一個(gè)全局barrier,如果要利用GPU,最好重構(gòu)算法避免出現(xiàn)這個(gè)問題。
5. 要求計(jì)算量(相比于數(shù)據(jù)傳輸量)少的應(yīng)用。盡管在CPU+GPU計(jì)算結(jié)構(gòu)中,GPU可以帶來計(jì)算性能的提升,但是這些提升都被向GPU傳輸數(shù)據(jù)所消耗的實(shí)踐覆蓋了。舉個(gè)例子,對(duì)于兩個(gè)向量求和運(yùn)算,如果非常大的向量的話,一般都選擇在CPU上算,否則傳輸?shù)紾PU上的時(shí)間開銷很大。
硬件需求。
你需要有NVIDIA GeForce FX 或者 ATI RADEON 9500 以上的顯卡, 一些老的顯卡可能不支持我們所需要的功能(主要是單精度浮點(diǎn)數(shù)據(jù)的存取及運(yùn)算) 。
軟件需求
首先,你需要一個(gè)C/C++編譯器。你有很多可以選擇,如:Visual Studio .NET 2003, Eclipse 3.1 plus CDT/MinGW, the Intel C++ Compiler 9.0 及 GCC 3.4+等等。然后更新你的顯卡驅(qū)動(dòng)讓它可以支持一些最新特性。
本文所附帶的源代碼,用到了兩個(gè)擴(kuò)展庫,GLUT 和 GLEW 。對(duì)于windows系統(tǒng),GLUT可以在 這里下載到,而Linux 的freeglut和freeglut-devel大多的版本都集成了。GLEW可以在SourceForge 上下載到,對(duì)于著色語言,大家可以選擇GLSL或者CG,GLSL在你安裝驅(qū)動(dòng)的時(shí)候便一起裝好了。如果你想用CG,那就得下載Cg Toolkit 。
二者擇其一
大家如果要找DirectX版本的例子的話,請看一下Jens Krügers的《 Implicit Water Surface》 demo(該例子好像也有OpenGL 版本的)。當(dāng)然,這只是一個(gè)獲得高度評(píng)價(jià)的示例源代碼,而不是教程的。
有一些從圖形著色編程完全抽象出來的GPU的元程序語言,把底層著色語言作了封裝,讓你不用學(xué)習(xí)著色語言,便能使用顯卡的高級(jí)特性,其中BrookGPU 和Sh 就是比較出名的兩個(gè)項(xiàng)目。
Back to top
初始化OpenGL
GLUT
GLUT(OpenGLUtility Toolkit)該開發(fā)包主要是提供了一組窗口函數(shù),可以用來處理窗口事件,生成簡單的菜單。我們使用它可以用盡可能少的代碼來快速生成一個(gè)OpenGL 開發(fā)環(huán)境,另外呢,該開發(fā)包具有很好的平***立性,可以在當(dāng)前所有主流的操作系統(tǒng)上運(yùn)行 (MS-Windows or Xfree/Xorg on Linux / Unix and Mac)。
?。踓pp] view plaincopy// include the GLUT header file
#include 《GL/glut.h》
// call this and pass the command line arguments from main()
void initGLUT(int argc, char **argv) {
glutInit ( &argc, argv );
glutCreateWindow(“SAXPY TESTS”);
}
評(píng)論
查看更多