1. 程式人生 > >談GPU的作用、原理及與CPU、DSP的區別

談GPU的作用、原理及與CPU、DSP的區別

GPU是顯示卡的“心臟”,也就相當於CPU在電腦中的作用,它決定了該顯示卡的檔次和大部分效能,同時也是2D顯示卡和3D顯示卡的區別依據。2D顯示晶片在處理3D影象和特效時主要依賴CPU的處理能力,稱為“軟加速”。3D顯示晶片是將三維影象和特效處理功能集中在顯示晶片內,也即所謂的“硬體加速”功能。顯示晶片通常是顯示卡上最大的晶片(也是引腳最多的)。GPU使顯示卡減少了對CPU的依賴,並進行部分原本CPU的工作,尤其是在3D圖形處理時。GPU所採用的核心技術有硬體T&L、立方環境材質貼圖和頂點混合、紋理壓縮和凹凸對映貼圖、雙重紋理四畫素256位渲染引擎等,而硬體T&L技術可以說是GPU的標誌。 GPU能夠從硬體上支援T&L(TransformandLighting,多邊形轉換與光源處理)的顯示晶片,因為T&L是3D渲染中的一個重要部分,其作用是計算多邊形的3D位置和處理動態光線效果,也可以稱為“幾何處理”。一個好的T&L單元,可以提供細緻的3D物體和高階的光線特效;只不過大多數PC中,T&L的大部分運算是交由CPU處理的(這就也就是所謂的軟體T&L),由於CPU的任務繁多,除了T&L之外,還要做記憶體管理、輸入響應等非3D圖形處理工作,因此在實際運算的時候效能會大打折扣,常常出現顯示卡等待CPU資料的情況,其運算速度遠跟不上今天覆雜三維遊戲的要求。即使CPU的工作頻率超過1GHz或更高,對它的幫助也不大,由於這是PC本身設計造成的問題,與CPU的速度無太大關係。 主要作用 今天,GPU已經不再侷限於3D圖形處理了,GPU通用計算技術發展已經引起業界不少的關注,事實也證明在浮點運算、平行計算等部分計算方面,GPU可以提供數十倍乃至於上百倍於CPU的效能,如此強悍的“新星”難免會讓CPU廠商老大英特爾為未來而緊張,NVIDIA和英特爾也經常為CPU和GPU誰更重要而展開口水戰。GPU通用計算方面的標準目前有 OPEN CL、CUDA、ATI STREAM。其中,OpenCL(全稱Open Computing Language,開放運算語言)是第一個面向異構系統通用目的並行程式設計的開放式、免費標準,也是一個統一的程式設計環境,便於軟體開發人員為高效能運算伺服器、桌面計算系統、手持裝置編寫高效輕便的程式碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell型別架構以及數字訊號處理器(DSP)等其他並行處理器,在遊戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景,AMD-ATI、NVIDIA現在的產品都支援OPEN CL。 NVIDIA公司在1999年釋出GeForce 256圖形處理晶片時首先提出GPU的概念。從此NV顯示卡的芯就用這個新名字GPU來稱呼。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與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和Apple等公司也釋出了OpenCL,GPU開始在通用計算領域得到廣泛應用,包括:數值分析,海量資料處理(排序,Map-Reduce等),金融分析等等。 簡而言之,當程式設計師為CPU編寫程式時,他們傾向於利用複雜的邏輯結構優化演算法從而減少計算任務的執行時間,即Latency。當程式設計師為GPU編寫程式時,則利用其處理海量資料的優勢,通過提高總的資料吞吐量(Throughput)來掩蓋Lantency。目前,CPU和GPU的區別正在逐漸縮小,因為GPU也在處理不規則任務和執行緒間通訊方面有了長足的進步。另外,功耗問題對於GPU比CPU更嚴重。 總的來講,GPU和CPU的區別是個很大的話題,甚至可以花一個學期用32個學時十幾次講座來講。