再別康橋賞析(再別康橋的詩詞鑒賞)
2023-05-18
更新時(shí)間:2023-05-11 09:02:30作者:佚名
在GPU出現(xiàn)以前,顯卡和CPU的關(guān)系有點(diǎn)像“主仆”,簡單地說這時(shí)的顯卡就是畫筆,根據(jù)各種有CPU發(fā)出的指令和數(shù)據(jù)進(jìn)行著色,材質(zhì)的填充、渲染、輸出等。
較早的娛樂用的3D顯卡又稱“3D加速卡”,由于大部分坐標(biāo)處理的工作及光影特效需要由CPU親自處理,占用了CPU太多的運(yùn)算時(shí)間,從而造成整體畫面不能非常流暢地表現(xiàn)出來。
那么,GPU的工作原理是什么?
簡單的說GPU就是能夠從硬件上支持T&L(Transform and Lighting,多邊形轉(zhuǎn)換與光源處理)的顯示芯片,因?yàn)門&L是3D渲染中的一個(gè)重要部分,其作用是計(jì)算多邊形的3D位置和處理動(dòng)態(tài)光線效果,也可以稱為“幾何處理”。一個(gè)好的T&L單元,可以提供細(xì)致的3D物體和高級(jí)的光線特效;只不過大多數(shù)PC中,T&L的大部分運(yùn)算是交由CPU處理的(這就也就是所謂的軟件T&L),由于CPU的任務(wù)繁多,除了T&L之外,還要做內(nèi)存管理、輸入響應(yīng)等非3D圖形處理工作,因此在實(shí)際運(yùn)算的時(shí)候性能會(huì)大打折扣,常常出現(xiàn)顯卡等待CPU數(shù)據(jù)的情況,其運(yùn)算速度遠(yuǎn)跟不上今天復(fù)雜三維游戲的要求。
即使CPU的工作頻率超過 1GHz或更高,對(duì)它的幫助也不大,由于這是PC本身設(shè)計(jì)造成的問題,與CPU的速度無太大關(guān)系。
GPU圖形處理,可以大致分成 5 個(gè)步驟,如下圖箭頭的部分。
分別為 vertex shader、primitive processing、rasterisation、fragment shader、testing and blending。
第一步,vertex shader。是將三維空間中數(shù)個(gè)(x,y,z)頂點(diǎn)放進(jìn) GPU 中。
在這一步驟中,電腦會(huì)在內(nèi)部模擬出一個(gè)三維空間,并將這些頂點(diǎn)放置在這一空間內(nèi)部。接著,投影在同一平面上,也是我們將看到的畫面。同時(shí),存下各點(diǎn)距離投影面的垂直距離,以便做后續(xù)的處理。
這個(gè)過程就像是本地球觀看星星一般。地球的天空,就像是一個(gè)投影面,所有的星星,不管遠(yuǎn)近皆投影在同一面上。本地球的我們,抬起頭來觀看星星,分不出星星的遠(yuǎn)近,只能分辨出亮度。
GPU 所投影出的結(jié)果,和這個(gè)情況類似。
從地球所看到的星空,星星就像是投影到一球面上,除非使用特別的儀器,不然分不出星星和地球的距離
第二步,primitive processing。是將相關(guān)的點(diǎn)鏈接在一起,以形成圖形。在一開始輸入數(shù)個(gè)頂點(diǎn)進(jìn)入 GPU 時(shí),程序會(huì)特別注記哪些點(diǎn)是需要組合在一起,以形成一線或面。就像是看星座的時(shí)候一樣,將相關(guān)連的星星連起來,形成特定的圖案。
第三步,rasterisation。因?yàn)殡娔X的屏幕是由一個(gè)又一個(gè)的像素組成,因此,需要將一條連續(xù)的直線,使用繪圖的演算法,以方格繪出該直線。圖形也是以此方式,先標(biāo)出邊線,再用方格填滿整個(gè)平面。
第四步,fragment shader。將格點(diǎn)化后的圖形著上顏色。所需著上的顏色也是于輸入時(shí)便被注記。在游玩游戲時(shí),這一步相當(dāng)耗費(fèi) GPU 的計(jì)算資源,因?yàn)楣庥暗男Ч?、物體表面材質(zhì)皆是在這一步進(jìn)行,這些計(jì)算決定著游戲畫面的精細(xì)程度。因此在游玩游戲時(shí),調(diào)高游戲畫面品質(zhì)大幅增加這一步的計(jì)算負(fù)擔(dān),降低游戲品質(zhì)。
將一個(gè)三角形,用方格呈現(xiàn)近似原始圖案,并著上顏色。一塊又一塊的方格,就是顯示器上的像素
最后一步,testing and blending。便是將第一步所獲得的投影垂直距離取出,和第四步的結(jié)果一同做最后處理。在去除被會(huì)被其他較近距離的物體擋住的物體后,讓剩下的圖形放進(jìn) GPU 的輸出內(nèi)存。之后,結(jié)果便會(huì)被送到電腦屏幕顯示。
GPU與DSP區(qū)別
GPU在幾個(gè)主要方面有別于DSP(Digital Signal Processing,簡稱DSP(數(shù)字信號(hào)處理)架構(gòu)。其所有計(jì)算均使用浮點(diǎn)算法,而且目前還沒有位或整數(shù)運(yùn)算指令。此外,由于GPU專為圖像處理設(shè)計(jì),因此存儲(chǔ)系統(tǒng)實(shí)際上是一個(gè)二維的分段存儲(chǔ)空間,包括一個(gè)區(qū)段號(hào)(從中讀取圖像)和二維地址(圖像中的X、Y坐標(biāo))。此外,沒有任何間接寫指令。輸出寫地址由光柵處理器確定,而且不能由程序改變。這對(duì)于自然分布在存儲(chǔ)器之中的算法而言是極大的挑戰(zhàn)。最后一點(diǎn),不同碎片的處理過程間不允許通信。實(shí)際上,碎片處理器是一個(gè)SIMD數(shù)據(jù)并行執(zhí)行單元,在所有碎片中獨(dú)立執(zhí)行代碼。
盡管有上述約束,但是GPU還是可以有效地執(zhí)行多種運(yùn)算,從線性代數(shù)和信號(hào)處理到數(shù)值仿真。雖然概念簡單,但新用戶在使用GPU計(jì)算時(shí)還是會(huì)感到迷惑,因?yàn)镚PU需要專有的圖形知識(shí)。這種情況下,一些軟件工具可以提供幫助。兩種高級(jí)描影語言CG和HLSL能夠讓用戶編寫類似C的代碼,隨后編譯成碎片程序匯編語言。Brook是專為GPU計(jì)算設(shè)計(jì),且不需要圖形知識(shí)的高級(jí)語言。因此對(duì)第一次使用GPU進(jìn)行開發(fā)的工作人員而言,它可以算是一個(gè)很好的起點(diǎn)。
Brook是C語言的延伸,整合了可以直接映射到 GPU的簡單數(shù)據(jù)并行編程構(gòu)造。經(jīng)GPU存儲(chǔ)和操作的數(shù)據(jù)被形象地比喻成“流”(stream),類似于標(biāo)準(zhǔn)C中的數(shù)組。核心(Kernel)是在流上操作的函數(shù)。在一系列輸入流上調(diào)用一個(gè)核心函數(shù)意味著在流元素上實(shí)施了隱含的循環(huán),即對(duì)每一個(gè)流元素調(diào)用核心體。Brook還提供了約簡機(jī)制,例如對(duì)一個(gè)流中所有的元素進(jìn)行和、最大值或乘積計(jì)算。
Brook還完全隱藏了圖形API的所有細(xì)節(jié),并把GPU中類似二維存儲(chǔ)器系統(tǒng)這樣許多用戶不熟悉的部分進(jìn)行了虛擬化處理。用Brook編寫的應(yīng)用程序包括線性代數(shù)子程序、快速傅立葉轉(zhuǎn)換、光線追蹤和圖像處理。利用ATI的X800XT和Nvidia的GeForce 6800 Ultra型GPU,在相同高速緩存、SSE匯編優(yōu)化Pentium 4執(zhí)行條件下,許多此類應(yīng)用的速度提升高達(dá)7倍之多。
對(duì)GPU計(jì)算感興趣的用戶努力將算法映射到圖形基本元素。類似Brook這樣的高級(jí)編程語言的問世使編程新手也能夠很容易就掌握GPU的性能優(yōu)勢。訪問GPU計(jì)算功能的便利性也使得GPU的演變將繼續(xù)下去,不僅僅作為繪制引擎,而是會(huì)成為個(gè)人電腦的主要計(jì)算引擎。