歡迎光臨
每天分享高質量文章

最全GPU架構知識介紹

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,函式庫以及運行時系統來支持軟體在整個平臺上的開發。

已同步到看一看
赞(0)

分享創造快樂