GPU工作原理概述及計(jì)算庫


導(dǎo)讀:GPU縮寫為Graphics Processing Unit的,一般稱為視覺處理單元。GPU被廣泛用于嵌入式系統(tǒng)、移動(dòng)電話、個(gè)人電腦、工作站和電子游戲解決方案當(dāng)中?,F(xiàn)代的GPU對(duì)圖像和圖形處理是十分高效率的,這是因?yàn)镚PU被設(shè)計(jì)為很高的并行架構(gòu)這樣使得比通用處理器CPU在大的數(shù)據(jù)塊并行處理算法上更具有優(yōu)勢。
1、GPU的起源
1985年 8月20日 ATi公司成立,同年10月ATi使用ASIC技術(shù)開發(fā)出了第一款圖形芯片和圖形卡,1992年 4月 ATi發(fā)布了 Mach32 圖形卡集成了圖形加速功能,1998年 4月 ATi被IDC評(píng)選為圖形芯片工業(yè)的市場領(lǐng)導(dǎo)者,但那時(shí)候這種芯片還沒有GPU的稱號(hào),很長的一段時(shí)間ATI都是把圖形處理器稱為VPU,直到AMD收購ATI之后其圖形芯片才正式采用GPU的名字。
NVIDIA公司在1999年發(fā)布GeForce 256圖形處理芯片時(shí)首先提出GPU的概念。從此NVIDIA顯卡的芯片就用這個(gè)新名字GPU來稱呼。GPU使顯卡削減了對(duì)CPU的依賴,并執(zhí)行部分原本CPU的工作,尤其是在3D圖形處理時(shí)。GPU所采用的核心技術(shù)有鋼體T&L、立方環(huán)境材質(zhì)貼圖與頂點(diǎn)混合、紋理壓縮及凹凸映射貼圖、雙重紋理四像素256位渲染引擎等,而硬體T&L技術(shù)能夠說是GPU的標(biāo)志。
2、工作原理
2.1、GPU工作流程簡介
GPU的圖形(處理)流水線完成如下的工作:(并不一定是按照如下順序):
頂點(diǎn)處理:這階段GPU讀取描述3D圖形外觀的頂點(diǎn)數(shù)據(jù)并根據(jù)頂點(diǎn)數(shù)據(jù)確定3D圖形的形狀及位置關(guān)系,建立起3D圖形的骨架。在支持DX8和DX9規(guī)格的GPU中,這些工作由硬件實(shí)現(xiàn)的VertexShader(定點(diǎn)著色器)完成。
光柵化計(jì)算:顯示器實(shí)際顯示的圖像是由像素組成的,我們需要將上面生成的圖形上的點(diǎn)和線通過一定的算法轉(zhuǎn)換到相應(yīng)的像素點(diǎn)。把一個(gè)矢量圖形轉(zhuǎn)換為一系列像素點(diǎn)的過程就稱為光柵化。例如,一條數(shù)學(xué)表示的斜線段,最終被轉(zhuǎn)化成階梯狀的連續(xù)像素點(diǎn)。
紋理帖圖:頂點(diǎn)單元生成的多邊形只構(gòu)成了3D物體的輪廓,而紋理映射(texturemapping)工作完成對(duì)多變形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應(yīng)的圖片,從而生成“真實(shí)”的圖形。TMU(Texturemapping unit)即是用來完成此項(xiàng)工作。
像素處理:這階段(在對(duì)每個(gè)像素進(jìn)行光柵化處理期間)GPU完成對(duì)像素的計(jì)算和處理,從而確定每個(gè)像素的最終屬性。在支持DX8和DX9規(guī)格的GPU中,這些工作由硬件實(shí)現(xiàn)的Pixel Shader(像素著色器)完成最終輸出,由ROP(光柵化引擎)最終完成像素的輸出,1幀渲染完畢后,被送到顯存幀緩沖區(qū)。
在GPU出現(xiàn)之前,CPU一直負(fù)責(zé)著計(jì)算機(jī)中主要的運(yùn)算工作,包括多媒體的處理工作。CPU的架構(gòu)是有利于X86指令集的串行架構(gòu),CPU從設(shè)計(jì)思路上適合盡可能快的完成一個(gè)任務(wù)。
但是如此設(shè)計(jì)的CPU在多媒體處理中的缺陷也顯而易見:多媒體計(jì)算通常要求較高的運(yùn)算密度、多并發(fā)線程和頻繁地存儲(chǔ)器訪問,而由于X86平臺(tái)中CISC(Complex Instruction Set Computer)架構(gòu)中暫存器數(shù)量有限,CPU并不適合處理這種類型的工作。
以Intel為代表的廠商曾經(jīng)做過許多改進(jìn)的嘗試,從1999年開始為X86平臺(tái)連續(xù)推出了多媒體擴(kuò)展指令集SSE(Streaming SIMD Extensions)的一代到四代版本,但由于多媒體計(jì)算對(duì)于浮點(diǎn)運(yùn)算和并行計(jì)算效率的高要求,CPU從硬件本身上就難以滿足其巨大的處理需求,僅僅在軟件層面的改并不能起到根本效果。
對(duì)于GPU來說,它的任務(wù)是在屏幕上合成顯示數(shù)百萬個(gè)像素的圖像,也就是同時(shí)擁有幾百萬個(gè)任務(wù)需要并行處理,因此GPU被設(shè)計(jì)成可并行處理很多任務(wù),而不是像CPU那樣完成單任務(wù)。
因此CPU和GPU架構(gòu)差異很大,CPU功能模塊很多,能適應(yīng)復(fù)雜運(yùn)算環(huán)境;GPU構(gòu)成則相對(duì)簡單,目前流處理器和顯存控制器占據(jù)了絕大部分晶體管。
CPU中大部分晶體管主要用于構(gòu)建控制電路(比如分支預(yù)測等)和Cache,只有少部分的晶體管來完成實(shí)際的運(yùn)算工作。而GPU的控制相對(duì)簡單,且對(duì)Cache的需求小,所以大部分晶體管可以組成各類專用電路、多條流水線,使得GPU的計(jì)算速度有了突破性的飛躍,擁有了更強(qiáng)大的處理浮點(diǎn)運(yùn)算的能力。

圖2-1 CPU和GPU架構(gòu)
從硬件設(shè)計(jì)上來講,CPU 由專為順序串行處理而優(yōu)化的幾個(gè)核心組成。另一方面,GPU則由數(shù)以千計(jì)的更小、更高效的核心組成,這些核心專為同時(shí)處理多任務(wù)而設(shè)計(jì)。

圖2-2 串行運(yùn)算示意圖

圖2-3 并行運(yùn)算示意圖
通過上圖我們可以較為容易地理解串行運(yùn)算和并行運(yùn)算之間的區(qū)別。傳統(tǒng)的串行編寫軟件具備以下幾個(gè)特點(diǎn):要運(yùn)行在一個(gè)單一的具有單一中央處理器(CPU)的計(jì)算機(jī)上;一個(gè)問題分解成一系列離散的指令;指令必須一個(gè)接著一個(gè)執(zhí)行;只有一條指令可以在任何時(shí)刻執(zhí)行。
而并行計(jì)算則改進(jìn)了很多重要細(xì)節(jié):要使用多個(gè)處理器運(yùn)行;一個(gè)問題可以分解成可同時(shí)解決的離散指令;每個(gè)部分進(jìn)一步細(xì)分為一系列指示;每個(gè)部分的問題可以同時(shí)在不同處理器上執(zhí)行。提高了算法的處理速度。
3、GPU加速技術(shù)
3.1、CUDA
為充分利用GPU的計(jì)算能力,NVIDIA在2006年推出了CUDA(ComputeUnifiedDevice Architecture,統(tǒng)一計(jì)算設(shè)備架構(gòu))這一編程模型。CUDA是一種由NVIDIA推出的通用并行計(jì)算架構(gòu),該架構(gòu)使GPU能夠解決復(fù)雜的計(jì)算問題。它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計(jì)算引擎。開發(fā)人員現(xiàn)在可以使用C語言來為CUDA架構(gòu)編寫程序。
通過這個(gè)技術(shù),用戶可利用NVIDIA的GeForce 8以后的GPU和較新的QuadroGPU進(jìn)行計(jì)算。以GeForce 8800 GTX為例,其核心擁有128個(gè)內(nèi)處理器。利用CUDA技術(shù),就可以將那些內(nèi)處理器串通起來,成為線程處理器去解決數(shù)據(jù)密集的計(jì)算。而各個(gè)內(nèi)處理器能夠交換、同步和共享數(shù)據(jù)。
從CUDA體系結(jié)構(gòu)的組成來說,包含了三個(gè)部分:開發(fā)庫、運(yùn)行期環(huán)境和驅(qū)動(dòng)。
開發(fā)庫是基于CUDA技術(shù)所提供的應(yīng)用開發(fā)庫。CUDA的1.1版提供了兩個(gè)標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算庫:CUFFT (離散快速傅立葉變換)和CUBLAS(離散基本線性計(jì)算)的實(shí)現(xiàn)。這兩個(gè)數(shù)學(xué)運(yùn)算庫所解決的是典型的大規(guī)模的并行計(jì)算問題,也是在密集數(shù)據(jù)計(jì)算中非常常見的計(jì)算類型。開發(fā)人員在開發(fā)庫的基礎(chǔ)上可以快速、方便的建立起自己的計(jì)算應(yīng)用。此外,開發(fā)人員也可以在CUDA的技術(shù)基礎(chǔ)上實(shí)現(xiàn)出更多的開發(fā)庫。
運(yùn)行期環(huán)境提供了應(yīng)用開發(fā)接口和運(yùn)行期組件,包括基本數(shù)據(jù)類型的定義和各類計(jì)算、類型轉(zhuǎn)換、內(nèi)存管理、設(shè)備訪問和執(zhí)行調(diào)度等函數(shù)。基于CUDA開發(fā)的程序代碼在實(shí)際執(zhí)行中分為兩種,一種是運(yùn)行在CPU上的宿主代碼(HostCode),一種是運(yùn)行在GPU上的設(shè)備代碼(Device Code)。
不同類型的代碼由于其運(yùn)行的物理位置不同,能夠訪問到的資源不同,因此對(duì)應(yīng)的運(yùn)行期組件也分為公共組件、宿主組件和設(shè)備組件三個(gè)部分,基本上囊括了所有在GPGPU開發(fā)中所需要的功能和能夠使用到的資源接口,開發(fā)人員可以通過運(yùn)行期環(huán)境的編程接口實(shí)現(xiàn)各種類型的計(jì)算。
由于目前存在著多種GPU版本的NVIDIA顯卡,不同版本的GPU之間都有不同的差異,因此驅(qū)動(dòng)部分基本上可以理解為是CUDA-enable的GPU的設(shè)備抽象層,提供硬件設(shè)備的抽象訪問接口。CUDA提供運(yùn)行期環(huán)境也是通過這一層來實(shí)現(xiàn)各種功能的。由于體系結(jié)構(gòu)中硬件抽象層的存在,CUDA今后也有可能發(fā)展成為一個(gè)通用的GPU標(biāo)準(zhǔn)接口,兼容不同廠商的GPU產(chǎn)品。

圖3-1 CUDA處理流程
對(duì)于軟件開發(fā)者來說,使用Cuda平臺(tái)調(diào)用Cuda的加速庫使用的語言包括:C、C++和Fortran。C/C++編程者使用UDAC/C++并用nvcc進(jìn)行編譯。
Nvidia的LLVM庫是基于C/C++編譯器的。Fortran的開發(fā)者能夠使用CUDA Fortran,編譯使用PGI CUDA Fortran。當(dāng)然CUDA平臺(tái)也支持其他的編程接口,包括OpenCL,微軟的DirectCompute、OpenGL ComputeShaders和 C++ AMP。第三方的開發(fā)者也可以使用Python、Perl、Fortran、Java、Ruby、Lua、Haskell、R、MATLAB、IDL由曼賽馬提亞原生支持。
3.2、OpenCL
OpenCL全稱Open Computing Language即開放計(jì)算語言。OpenCL為異構(gòu)平臺(tái)提供了一個(gè)編寫程序,尤其是并行程序的開放的框架標(biāo)準(zhǔn)。OpenCL所支持的異構(gòu)平臺(tái)可由多核CPU、GPU或其他類型的處理器組成。
CUDA只能夠在NVIDIA的GPU硬件上運(yùn)行。但是,OpenCL的目標(biāo)是面向任何一種并行處理器,OpenCL是第一種真正的開放自由版權(quán)編程標(biāo)準(zhǔn),適用于異構(gòu)系統(tǒng)上的通用計(jì)算。而異構(gòu)平臺(tái)可由CPU、GPU、DSP、FPGA或其他類型的處理器搭建。
OpenCL程序同CUDA程序一樣,也是分為兩部分,一是用于編寫內(nèi)核程序(在OpenCL設(shè)備上運(yùn)行的代碼) 的語言,二是定義并控制平臺(tái)的API。OpenCL提供了基于任務(wù)和基于數(shù)據(jù)兩種并行計(jì)算機(jī)制,它極大地?cái)U(kuò)展了GPU 的應(yīng)用范圍,使之不再局限于圖形領(lǐng)域。
OpenCL由Khronos Group維護(hù)。Khronos Group是一個(gè)非盈利性技術(shù)組織,維護(hù)著多個(gè)開放的工業(yè)標(biāo)準(zhǔn),例如OpenGL和OpenAL。這兩個(gè)標(biāo)準(zhǔn)分別用于三維圖形和計(jì)算機(jī)音頻方面。OpenCL源程序既可以在多核CPU上也可以在GPU上編譯執(zhí)行,這大大提高了代碼的性能和可移植性。OpenCL標(biāo)準(zhǔn)由相應(yīng)的標(biāo)準(zhǔn)委員會(huì)制訂,委員會(huì)的成員來自業(yè)界各個(gè)重要廠商。作為用戶和程序員期待已久的東西,OpenCL帶來兩個(gè)重要變化:一個(gè)跨廠商的非專有軟件解決方案;一個(gè)跨平臺(tái)的異構(gòu)框架以同時(shí)發(fā)揮系統(tǒng)中所有計(jì)算單元的能力。
OpenCL是一個(gè)用于異構(gòu)平臺(tái)上編程的開放性行業(yè)標(biāo)準(zhǔn)。這個(gè)平臺(tái)可以包括 CPU GPU和其他各類計(jì)算設(shè)備,OpenCL會(huì)將各類計(jì)算設(shè)備組織成一個(gè)統(tǒng)一的平臺(tái)。OpenCL不僅僅是一種編程語言,更是一個(gè)完整的并行編程框架,它包括編程語言,API,函數(shù)庫以及運(yùn)行時(shí)系統(tǒng)來支持軟件在整個(gè)平臺(tái)上的開發(fā)。
來源:智能計(jì)算芯世界
相關(guān)下載:
1、GPU高性能計(jì)算概述
2、GPU深度學(xué)習(xí)基礎(chǔ)介紹
3、OpenACC基本介紹
4、CUDA CC 編程介紹
5、CUDA Fortr基本介紹

轉(zhuǎn)載申明:轉(zhuǎn)載本號(hào)文章請(qǐng)注明作者和來源,本號(hào)發(fā)布文章若存在版權(quán)等問題,請(qǐng)留言聯(lián)系處理,謝謝。
推薦閱讀
更多架構(gòu)相關(guān)技術(shù)知識(shí)總結(jié)請(qǐng)參考“架構(gòu)師全店鋪技術(shù)資料打包”相關(guān)電子書(37本技術(shù)資料打包匯總詳情可通過“閱讀原文”獲取)。
全店內(nèi)容持續(xù)更新,現(xiàn)下單“全店鋪技術(shù)資料打包(全)”,后續(xù)可享全店內(nèi)容更新“免費(fèi)”贈(zèng)閱,價(jià)格僅收198元(原總價(jià)350元)。
溫馨提示:
掃描二維碼關(guān)注公眾號(hào),點(diǎn)擊閱讀原文鏈接獲取“架構(gòu)師技術(shù)全店資料打包匯總(全)”電子書資料詳情。

