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