GPU是顯示卡的“心臟”,也就相當于CPU在電腦中的作用,它決定了該顯卡的檔次和大部分性能,同時也是2D顯示卡和3D顯示卡的區別依據。 2D顯示芯片在處理3D圖像和特效時主要依賴CPU的處理能力,稱為“軟加速”。3D顯示芯片是將三維圖像和特效處理功能集中在顯示芯片內,也即所謂的“硬件加速”功能。顯示芯片通常是顯示卡上最大的芯片(也是引腳最多的)。GPU使顯卡減少了對CPU的依賴,并進行部分原本CPU的工作,尤其是在3D圖形處理時。GPU所采用的核心技術有硬體T&L、立方環境材質貼圖和頂點混合、紋理壓縮和凹凸映射貼圖、雙重紋理四像素256位渲染引擎等,而硬體T&L技術可以說是GPU的標志。
工作原理
簡單的說GPU就是能夠從硬件上支持T&L(Transform and Lighting,多邊形轉換與光源處理)的顯示芯片,因為T&L是3D渲染中的一個重要部分,其作用是計算多邊形的3D位置和處理動態光線效果,也可以稱為“幾何處理”。一個好的T&L單元,可以提供細致的3D物體和高級的光線特效;只不過大多數PC中,T&L的大部分運算是交由CPU處理的(這就也就是所謂的軟件T&L),由于CPU的任務繁多,除了T&L之外,還要做內存管理、輸入響應等非3D圖形處理工作,因此在實際運算的時候性能會大打折扣,常常出現顯卡等待CPU數據的情況,其運算速度遠跟不上今天復雜三維游戲的要求。即使CPU的工作頻率超過 1GHz或更高,對它的幫助也不大,由于這是PC本身設計造成的問題,與CPU的速度無太大關系。
GPU圖形處理,可以大致分成 5 個步驟,如下圖箭頭的部分。分別為 vertex shader、primitive processing、rasterisation、fragment shader、testing and blending。
三維座標繪圖并產生屏幕輸出的圖形
第一步,vertex shader。是將三維空間中數個(x,y,z)頂點放進 GPU 中。在這一步驟中,電腦會在內部模擬出一個三維空間,并將這些頂點放置在這一空間內部。接著,投影在同一平面上,也是我們將看到的畫面。同時,存下各點距離投影面的垂直距離,以便做后續的處理。
這個過程就像是本地球觀看星星一般。地球的天空,就像是一個投影面,所有的星星,不管遠近皆投影在同一面上。本地球的我們,抬起頭來觀看星星,分不出星星的遠近,只能分辨出亮度。GPU 所投影出的結果,和這個情況類似。
從地球所看到的星空,星星就像是投影到一球面上,除非使用特別的儀器,不然分不出星星和地球的距離
第二步,primitive processing。是將相關的點鏈接在一起,以形成圖形。在一開始輸入數個頂點進入 GPU 時,程序會特別注記哪些點是需要組合在一起,以形成一線或面。就像是看星座的時候一樣,將相關連的星星連起來,形成特定的圖案。
第三步,rasterisation。因為電腦的屏幕是由一個又一個的像素組成,因此,需要將一條連續的直線,使用繪圖的演算法,以方格繪出該直線。圖形也是以此方式,先標出邊線,再用方格填滿整個平面。
第四步,fragment shader。將格點化后的圖形著上顏色。所需著上的顏色也是于輸入時便被注記。在游玩游戲時,這一步相當耗費 GPU 的計算資源,因為光影的效果、物體表面材質皆是在這一步進行,這些計算決定著游戲畫面的精細程度。因此在游玩游戲時,調高游戲畫面品質大幅增加這一步的計算負擔,降低游戲品質。
將一個三角形,用方格呈現近似原始圖案,并著上顏色。一塊又一塊的方格,就是顯示器上的像素
最后一步,testing and blending。便是將第一步所獲得的投影垂直距離取出,和第四步的結果一同做最后處理。在去除被會被其他較近距離的物體擋住的物體后,讓剩下的圖形放進 GPU 的輸出內存。之后,結果便會被送到電腦屏幕顯示。
GPU與DSP區別
GPU在幾個主要方面有別于DSP(Digital Signal Processing,簡稱DSP(數字信號處理)架構。其所有計算均使用浮點算法,而且目前還沒有位或整數運算指令。此外,由于GPU專為圖像處理設計,因此存儲系統實際上是一個二維的分段存儲空間,包括一個區段號(從中讀取圖像)和二維地址(圖像中的X、Y坐標)。此外,沒有任何間接寫指令。輸出寫地址由光柵處理器確定,而且不能由程序改變。這對于自然分布在存儲器之中的算法而言是極大的挑戰。最后一點,不同碎片的處理過程間不允許通信。實際上,碎片處理器是一個SIMD數據并行執行單元,在所有碎片中獨立執行代碼。
盡管有上述約束,但是GPU還是可以有效地執行多種運算,從線性代數和信號處理到數值仿真。雖然概念簡單,但新用戶在使用GPU計算時還是會感到迷惑,因為GPU需要專有的圖形知識。這種情況下,一些軟件工具可以提供幫助。兩種高級描影語言CG和HLSL能夠讓用戶編寫類似C的代碼,隨后編譯成碎片程序匯編語言。Brook是專為GPU計算設計,且不需要圖形知識的高級語言。因此對第一次使用GPU進行開發的工作人員而言,它可以算是一個很好的起點。 Brook是C語言的延伸,整合了可以直接映射到 GPU的簡單數據并行編程構造。經GPU存儲和操作的數據被形象地比喻成“流”(stream),類似于標準C中的數組。核心(Kernel)是在流上操作的函數。在一系列輸入流上調用一個核心函數意味著在流元素上實施了隱含的循環,即對每一個流元素調用核心體。Brook還提供了約簡機制,例如對一個流中所有的元素進行和、最大值或乘積計算。Brook還完全隱藏了圖形API的所有細節,并把GPU中類似二維存儲器系統這樣許多用戶不熟悉的部分進行了虛擬化處理。用Brook編寫的應用程序包括線性代數子程序、快速傅立葉轉換、光線追蹤和圖像處理。利用ATI的X800XT和Nvidia的GeForce 6800 Ultra型GPU,在相同高速緩存、SSE匯編優化Pentium 4執行條件下,許多此類應用的速度提升高達7倍之多。
對GPU計算感興趣的用戶努力將算法映射到圖形基本元素。類似Brook這樣的高級編程語言的問世使編程新手也能夠很容易就掌握GPU的性能優勢。訪問GPU計算功能的便利性也使得GPU的演變將繼續下去,不僅僅作為繪制引擎,而是會成為個人電腦的主要計算引擎。
GPU和CPU的區別是什么?
要解釋兩者的區別,要先明白兩者的相同之處:兩者都有總線和外界聯系,有自己的緩存體系,以及數字和邏輯運算單元。一句話,兩者都為了完成計算任務而設計。
兩者的區別在于存在于片內的緩存體系和數字邏輯運算單元的結構差異:CPU雖然有多核,但總數沒有超過兩位數,每個核都有足夠大的緩存和足夠多的數字和邏輯運算單元,并輔助有很多加速分支判斷甚至更復雜的邏輯判斷的硬件;GPU的核數遠超CPU,被稱為眾核(NVIDIA Fermi有512個核)。每個核擁有的緩存大小相對小,數字邏輯運算單元也少而簡單(GPU初始時在浮點計算上一直弱于CPU)。從結果上導致CPU擅長處理具有復雜計算步驟和復雜數據依賴的計算任務,如分布式計算,數據壓縮,人工智能,物理模擬,以及其他很多很多計算任務等。GPU由于歷史原因,是為了視頻游戲而產生的(至今其主要驅動力還是不斷增長的視頻游戲市場),在三維游戲中常常出現的一類操作是對海量數據進行相同的操作,如:對每一個頂點進行同樣的坐標變換,對每一個頂點按照同樣的光照模型計算顏色值。GPU的眾核架構非常適合把同樣的指令流并行發送到眾核上,采用不同的輸入數據執行。在 2003-2004年左右,圖形學之外的領域專家開始注意到GPU與眾不同的計算能力,開始嘗試把GPU用于通用計算(即GPGPU)。之后NVIDIA發布了CUDA,AMD和等公司也發布了OpenCL,GPU開始在通用計算領域得到廣泛應用,包括:數值分析,海量數據處理(排序,Map- Reduce等),金融分析等等。
簡而言之,當程序員為CPU編寫程序時,他們傾向于利用復雜的邏輯結構優化算法從而減少計算任務的運行時間,即Latency。當程序員為GPU編寫程序時,則利用其處理海量數據的優勢,通過提高總的數據吞吐量(Throughput)來掩蓋 Lantency。目前,CPU和GPU的區別正在逐漸縮小,因為GPU也在處理不規則任務和線程間通信方面有了長足的進步。另外,功耗問題對于GPU比CPU更嚴重。
總的來講,GPU和CPU的區別是個很大的話題,在這里只能簡單講解一下了。
(審核編輯: 滄海一土)
分享