1、GPU的起源
GPU縮寫為Graphics Processing Unit的,一般稱為視覺處理單元。GPU被廣泛用於嵌入式系統、行動電話、個人電腦、工作站和電子游戲解決方案當中。現代的GPU對影象和圖形處理是十分高效率的,這是因為GPU被設計為很高的並行架構這樣使得比通用處理器CPU在大的資料塊並行處理演演算法上更具有優勢。
1985年 8月20日 ATi公司成立,同年10月ATi使用ASIC技術開發出了第一款圖形晶片和圖形卡,1992年 4月 ATi釋出了 Mach32 圖形卡集成了圖形加速功能,1998年 4月 ATi被IDC評選為圖形晶片工業的市場領導者,但那時候這種晶片還沒有GPU的稱號,很長的一段時間ATI都是把圖形處理器稱為VPU,直到AMD收購ATI之後其圖形晶片才正式採用GPU的名字。
NVIDIA公司在1999年釋出GeForce 256圖形處理晶片時首先提出GPU的概念。從此NVIDIA顯示卡的晶片就用這個新名字GPU來稱呼。GPU使顯示卡削減了對CPU的依賴,並執行部分原本CPU的工作,尤其是在3D圖形處理時。GPU所採用的核心技術有鋼體T&L;、立方環境材質貼圖與頂點混合、紋理壓縮及凹凸對映貼圖、雙重紋理四畫素256位渲染引擎等,而硬體T&L;技術能夠說是GPU的標誌。
2、工作原理
2.1、GPU工作流程簡介
GPU的圖形(處理)流水線完成如下的工作:(並不一定是按照如下順序):
- 頂點處理:這階段GPU讀取描述3D圖形外觀的頂點資料並根據頂點資料確定3D圖形的形狀及位置關係,建立起3D圖形的骨架。在支援DX8和DX9規格的GPU中,這些工作由硬體實現的VertexShader(定點著色器)完成。
- 光柵化計算:顯示器實際顯示的影象是由畫素組成的,我們需要將上面生成的圖形上的點和線透過一定的演演算法轉換到相應的畫素點。把一個向量圖形轉換為一系列畫素點的過程就稱為光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續畫素點。
- 紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理對映(texturemapping)工作完成對多變形錶面的帖圖,通俗的說,就是將多邊形的錶面貼上相應的圖片,從而生成“真實”的圖形。TMU(Texturemapping unit)即是用來完成此項工作。
- 畫素處理:這階段(在對每個畫素進行光柵化處理期間)GPU完成對畫素的計算和處理,從而確定每個畫素的最終屬性。在支援DX8和DX9規格的GPU中,這些工作由硬體實現的Pixel Shader(畫素著色器)完成最終輸出,由ROP(光柵化引擎)最終完成畫素的輸出,1幀渲染完畢後,被送到視訊記憶體幀緩衝區。
在GPU出現之前,CPU一直負責著計算機中主要的運算工作,包括多媒體的處理工作。CPU的架構是有利於X86指令集的序列架構,CPU從設計思路上適合盡可能快的完成一個任務。
但是如此設計的CPU在多媒體處理中的缺陷也顯而易見:多媒體計算通常要求較高的運算密度、多併發執行緒和頻繁地儲存器訪問,而由於X86平臺中CISC(Complex Instruction Set Computer)架構中暫存器數量有限,CPU並不適合處理這種型別的工作。
以Intel為代表的廠商曾經做過許多改進的嘗試,從1999年開始為X86平臺連續推出了多媒體擴充套件指令集SSE(Streaming SIMD Extensions)的一代到四代版本,但由於多媒體計算對於浮點運算和平行計算效率的高要求,CPU從硬體本身上就難以滿足其巨大的處理需求,僅僅在軟體層面的改並不能起到根本效果。
對於GPU來說,它的任務是在螢幕上合成顯示數百萬個畫素的影象,也就是同時擁有幾百萬個任務需要並行處理,因此GPU被設計成可並行處理很多工,而不是像CPU那樣完成單任務。
因此CPU和GPU架構差異很大,CPU功能模組很多,能適應複雜運算環境;GPU構成則相對簡單,目前流處理器和視訊記憶體控制器佔據了絕大部分電晶體。
CPU中大部分電晶體主要用於構建控制電路(比如分支預測等)和Cache,只有少部分的電晶體來完成實際的運算工作。而GPU的控制相對簡單,且對Cache的需求小,所以大部分電晶體可以組成各類專用電路、多條流水線,使得GPU的計算速度有了突破性的飛躍,擁有了更強大的處理浮點運算的能力。
圖2-1 CPU和GPU架構
從硬體設計上來講,CPU 由專為順序序列處理而最佳化的幾個核心組成。另一方面,GPU則由數以千計的更小、更高效的核心組成,這些核心專為同時處理多工而設計。
圖2-2 序列運算示意圖
圖2-3 並行運算示意圖
透過上圖我們可以較為容易地理解序列運算和並行運算之間的區別。傳統的序列編寫軟體具備以下幾個特點:要執行在一個單一的具有單一中央處理器(CPU)的計算機上;一個問題分解成一系列離散的指令;指令必須一個接著一個執行;只有一條指令可以在任何時刻執行。
而平行計算則改進了很多重要細節:要使用多個處理器執行;一個問題可以分解成可同時解決的離散指令;每個部分進一步細分為一系列指示;每個部分的問題可以同時在不同處理器上執行。提高了演演算法的處理速度。
3、GPU加速技術
3.1、CUDA
為充分利用GPU的計算能力,NVIDIA在2006年推出了CUDA(ComputeUnifiedDevice Architecture,統一計算裝置架構)這一程式設計模型。CUDA是一種由NVIDIA推出的通用平行計算架構,該架構使GPU能夠解決複雜的計算問題。它包含了CUDA指令集架構(ISA)以及GPU內部的平行計算引擎。開發人員現在可以使用C語言來為CUDA架構編寫程式。
透過這個技術,使用者可利用NVIDIA的GeForce 8以後的GPU和較新的QuadroGPU進行計算。以GeForce 8800 GTX為例,其核心擁有128個內處理器。利用CUDA技術,就可以將那些內處理器串通起來,成為執行緒處理器去解決資料密集的計算。而各個內處理器能夠交換、同步和共享資料。
從CUDA體系結構的組成來說,包含了三個部分:開發庫、執行期環境和驅動。
開發庫是基於CUDA技術所提供的應用開發庫。CUDA的1.1版提供了兩個標準的數學運算庫:CUFFT (離散快速傅立葉變換)和CUBLAS(離散基本線性計算)的實現。這兩個數學運算庫所解決的是典型的大規模的平行計算問題,也是在密集資料計算中非常常見的計算型別。開發人員在開發庫的基礎上可以快速、方便的建立起自己的計算應用。此外,開發人員也可以在CUDA的技術基礎上實現出更多的開發庫。
執行期環境提供了應用開發介面和執行期元件,包括基本資料型別的定義和各類計算、型別轉換、記憶體管理、裝置訪問和執行排程等函式。基於CUDA開發的程式程式碼在實際執行中分為兩種,一種是執行在CPU上的宿主程式碼(HostCode),一種是執行在GPU上的裝置程式碼(Device Code)。
不同型別的程式碼由於其執行的物理位置不同,能夠訪問到的資源不同,因此對應的執行期元件也分為公共元件、宿主元件和裝置元件三個部分,基本上囊括了所有在GPGPU開發中所需要的功能和能夠使用到的資源介面,開發人員可以透過執行期環境的程式設計介面實現各種型別的計算。
由於目前存在著多種GPU版本的NVIDIA顯示卡,不同版本的GPU之間都有不同的差異,因此驅動部分基本上可以理解為是CUDA-enable的GPU的裝置抽象層,提供硬體裝置的抽象訪問介面。CUDA提供執行期環境也是透過這一層來實現各種功能的。由於體系結構中硬體抽象層的存在,CUDA今後也有可能發展成為一個通用的GPU標準介面,相容不同廠商的GPU產品。
圖3-1 CUDA處理流程
對於軟體開發者來說,使用Cuda平臺呼叫Cuda的加速庫使用的語言包括:C、C++和Fortran。C/C++程式設計者使用UDAC/C++並用nvcc進行編譯。
Nvidia的LLVM庫是基於C/C++編譯器的。Fortran的開發者能夠使用CUDA Fortran,編譯使用PGI CUDA Fortran。當然CUDA平臺也支援其他的程式設計介面,包括OpenCL,微軟的DirectCompute、OpenGL ComputeShaders和 C++ AMP。第三方的開發者也可以使用Python、Perl、Fortran、Java、Ruby、Lua、Haskell、R、MATLAB、IDL由曼賽馬提亞原生支援。
3.2、OpenCL
OpenCL全稱Open Computing Language即開放計算語言。OpenCL為異構平臺提供了一個編寫程式,尤其是並行程式的開放的框架標準。OpenCL所支援的異構平臺可由多核CPU、GPU或其他型別的處理器組成。
CUDA只能夠在NVIDIA的GPU硬體上執行。但是,OpenCL的標的是面向任何一種並行處理器,OpenCL是第一種真正的開放自由版權程式設計標準,適用於異構系統上的通用計算。而異構平臺可由CPU、GPU、DSP、FPGA或其他型別的處理器搭建。
OpenCL程式同CUDA程式一樣,也是分為兩部分,一是用於編寫核心程式(在OpenCL裝置上執行的程式碼) 的語言,二是定義並控制平臺的API。OpenCL提供了基於任務和基於資料兩種平行計算機制,它極大地擴充套件了GPU 的應用範圍,使之不再侷限於圖形領域。
OpenCL由Khronos Group維護。Khronos Group是一個非盈利性技術組織,維護著多個開放的工業標準,例如OpenGL和OpenAL。這兩個標準分別用於三維圖形和計算機音訊方面。OpenCL源程式既可以在多核CPU上也可以在GPU上編譯執行,這大大提高了程式碼的效能和可移植性。OpenCL標準由相應的標準委員會制訂,委員會的成員來自業界各個重要廠商。作為使用者和程式員期待已久的東西,OpenCL帶來兩個重要變化:一個跨廠商的非專有軟體解決方案;一個跨平臺的異構框架以同時發揮系統中所有計算單元的能力。
OpenCL是一個用於異構平臺上程式設計的開放性行業標準。這個平臺可以包括 CPU GPU和其他各類計算裝置,OpenCL會將各類計算裝置組織成一個統一的平臺。OpenCL不僅僅是一種程式語言,更是一個完整的並行程式設計框架,它包括程式語言,API,函式庫以及執行時系統來支援軟體在整個平臺上的開發。
朋友會在“發現-看一看”看到你“在看”的內容