我知道這很長,但是,我堅(jiān)持看完了.希望有幸看到這文章并對(duì)圖形方面有興趣的朋友,也能堅(jiān)持看完.一定大有收獲.畢竟知道它們到底是怎么"私下勾搭"的.會(huì)有利于我們用程序來指揮它們....(這是我加上去的)
原文從這里開始:
要說到設(shè)計(jì)的復(fù)雜程度,那還是CPU了!這個(gè)不用討論,很簡單的道理你看看顯卡芯片的更新速度和CPU的更新速度就可見一斑了。還是簡單說說他們的設(shè)計(jì)原理吧。
CPU:
但是,現(xiàn)在我要問一句:“什么是CPU?”我相信大多數(shù)人并不知道什么是CPU。當(dāng)然,你可以回答CPU是中央處理器,或者來一句英文: Central Processing Unit。是的,沒錯(cuò)。但,RISC和CISC是什么?什么是“9路超標(biāo)量設(shè)計(jì)”、“20級(jí)流水線”?什么是“解 碼”,為什么Athlon和PIII的解碼過程需要的時(shí)鐘周期大大大于其他的RISC處理器?這些都不是一句“中央處理器”所能夠回答的。
一、 指令系統(tǒng)
要講CPU,就必須先講一下指令系統(tǒng)。指令系統(tǒng)指的是一個(gè)CPU所能夠處理的全部指令的集合,是一個(gè)CPU的根本屬性。比如我們現(xiàn)在所用的CPU都是 采用x86指令集的,他們都是同一類型的CPU,不管是PIII、Athlon或Joshua。我們也知道,世界上還有比PIII和Athlon快得多的 CPU,比如Alpha,但它們不是用x86指令集,不能使用數(shù)量龐大的基于x86指令集的程序,如Windows98。之所以說指令系統(tǒng)是一個(gè)CPU的 根本屬性,是因?yàn)橹噶钕到y(tǒng)決定了一個(gè)CPU能夠運(yùn)行什么樣的程序。所有采用高級(jí)語言編出的程序,都需要翻譯(編譯或解釋)成為機(jī)器語言后才能運(yùn)行,這些機(jī) 器語言中所包含的就是一條條的指令。
1、 指令的格式
一條指令一般包括兩個(gè)部分:操作碼和地址碼。操作碼其實(shí)就是指令序列號(hào),用來告訴CPU需要執(zhí)行的是那一條指令。地址碼則復(fù)雜一些,主要包括源操作數(shù)地址、目的地址和下一條指令的地址。在某些指令中,地址碼可以部分或全部省略,比如一條空指令就只有操作碼而沒有地址碼。
舉個(gè)例子吧,某個(gè)指令系統(tǒng)的指令長度為32位,操作碼長度為8位,地址長度也為8位,且第一條指令是加,第二條指令是減。當(dāng)它收到一個(gè) “00000010000001000000000100000110”的指令時(shí),先取出它的前8位操作碼,即00000010,分析得出這是一個(gè)減法操 作,有3個(gè)地址,分別是兩個(gè)源操作數(shù)地址和一個(gè)目的地址。于是,CPU就到內(nèi)存地址00000100處取出被減數(shù),到00000001處取出減數(shù),送到 ALU中進(jìn)行減法運(yùn)算,然后把結(jié)果送到00000110處。
這只是一個(gè)相當(dāng)簡單化的例子,實(shí)際情況要復(fù)雜的多。
2、 指令的分類與尋址方式
一般說來,現(xiàn)在的指令系統(tǒng)有以下幾種類型的指令:
(1)算術(shù)邏輯運(yùn)算指令
算術(shù)邏輯運(yùn)算指令包括加減乘除等算術(shù)運(yùn)算指令,以及與或非異或等邏輯運(yùn)算指令。現(xiàn)在的指令系統(tǒng)還加入了一些十進(jìn)制運(yùn)算指令以及字符串運(yùn)算指令等。
(2)浮點(diǎn)運(yùn)算指令
用于對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算。浮點(diǎn)運(yùn)算要大大復(fù)雜于整數(shù)運(yùn)算,所以CPU中一般還會(huì)有專門負(fù)責(zé)浮點(diǎn)運(yùn)算的浮點(diǎn)運(yùn)算單元。現(xiàn)在的浮點(diǎn)指令中一般還加入了向量指令,用于直接對(duì)矩陣進(jìn)行運(yùn)算,對(duì)于現(xiàn)在的多媒體和3D處理很有用。
(3)位操作指令
學(xué)過C的人應(yīng)該都知道C語言中有一組位操作語句,相對(duì)應(yīng)的,指令系統(tǒng)中也有一組位操作指令,如左移一位右移一位等。對(duì)于計(jì)算機(jī)內(nèi)部以二進(jìn)制不碼表示的數(shù)據(jù)來說,這種操作是非常簡單快捷的。
(4)其他指令
上面三種都是運(yùn)算型指令,除此之外還有許多非運(yùn)算的其他指令。這些指令包括:數(shù)據(jù)傳送指令、堆棧操作指令、轉(zhuǎn)移類指令、輸入輸出指令和一些比較特殊的指令,如特權(quán)指令、多處理器控制指令和等待、停機(jī)、空操作等指令。
對(duì)于指令中的地址碼,也會(huì)有許多不同的尋址(編址)方式,主要有直接尋址,間接尋址,寄存器尋址,基址尋址,變址尋址等,某些復(fù)雜的指令系統(tǒng)會(huì)有幾十種甚至更多的尋址方式。
3、 CISC與RISC
CISC,Complex Instruction Set Computer,復(fù)雜指令系統(tǒng)計(jì)算機(jī)。RISC, Reduced Instruction Set Computer,精簡指令系統(tǒng)計(jì)算機(jī)。雖然這兩個(gè)名詞是針對(duì)計(jì)算機(jī)的,但下文我們?nèi)匀恢粚?duì)指令集進(jìn)行 研究。
(1)CISC的產(chǎn)生、發(fā)展和現(xiàn)狀
一開始,計(jì)算機(jī)的指令系統(tǒng)只有很少一些基本指令,而其他的復(fù)雜指令全靠軟件編譯時(shí)通過簡單指令的組合來實(shí)現(xiàn)。舉個(gè)最簡單的例子,一個(gè)a乘以b的操作就 可以轉(zhuǎn)換為a個(gè)b相加來做,這樣就用不著乘法指令了。當(dāng)然,最早的指令系統(tǒng)就已經(jīng)有乘法指令了,這是為什么呢?因?yàn)橛糜布?shí)現(xiàn)乘法比加法組合來得快得多。
由于那時(shí)的計(jì)算機(jī)部件相當(dāng)昂貴,而且速度很慢,為了提高速度,越來越多的復(fù)雜指令被加入了指令系統(tǒng)中。但是,很快又有一個(gè)問題:一個(gè)指令系統(tǒng)的指令數(shù)是受指令操作碼的位數(shù)所限制的,如果操作碼為8位,那么指令數(shù)最多為256條(2的8次方)。
那么怎么辦呢?指令的寬度是很難增加的,聰明的設(shè)計(jì)師們又想出了一種方案:操作碼擴(kuò)展。前面說過,操作碼的后面跟的是地址碼,而有些指令是用不著地址碼或只用少量的地址碼的。那么,就可以把操作碼擴(kuò)展到這些位置。
舉個(gè)簡單的例子,如果一個(gè)指令系統(tǒng)的操作碼為2位,那么可以有00、01、10、11四條不同的指令。現(xiàn)在把11作為保留,把操作碼擴(kuò)展到4位,那么 就可以有00、01、10、1100、1101、1110、1111七條指令。其中1100、1101、1110、1111這四條指令的地址碼必須少兩 位。
然后,為了達(dá)到操作碼擴(kuò)展的先決條件:減少地址碼,設(shè)計(jì)師們又動(dòng)足了腦筋,發(fā)明了各種各樣的尋址方式,如基址尋址、相對(duì)尋址等,用以最大限度的壓縮地址碼長度,為操作碼留出空間。
就這樣,慢慢地,CISC指令系統(tǒng)就形成了,大量的復(fù)雜指令、可變的指令長度、多種的尋址方式是CISC的特點(diǎn),也是CISC的缺點(diǎn):因?yàn)檫@些都大大 增加了解碼的難度,而在現(xiàn)在的高速硬件發(fā)展下,復(fù)雜指令所帶來的速度提升早已不及在解碼上浪費(fèi)點(diǎn)的時(shí)間。除了個(gè)人PC市場(chǎng)還在用x86指令集外,服務(wù)器以 及更大的系統(tǒng)都早已不用CISC了。x86仍然存在的唯一理由就是為了兼容大量的x86平臺(tái)上的軟件。
(2)RISC的產(chǎn)生、發(fā)展和現(xiàn)狀
1975年,IBM的設(shè)計(jì)師John Cocke研究了當(dāng)時(shí)的IBM370CISC系統(tǒng),發(fā)現(xiàn)其中占總指令數(shù)僅20%的簡單指令卻在程序調(diào)用中占了80%,而占指令數(shù)80%的復(fù)雜指令卻只有20%的機(jī)會(huì)用到。由此,他提出了RISC的概念。
事實(shí)證明,RISC是成功的。80年代末,各公司的RISC CPU如雨后春筍般大量出現(xiàn),占據(jù)了大量的市場(chǎng)。到了90年代,x86的CPU如pentium和k5也開始使用先進(jìn)的RISC核心。
RISC的最大特點(diǎn)是指令長度固定,指令格式種類少,尋址方式種類少,大多數(shù)是簡單指令且都能在一個(gè)時(shí)鐘周期內(nèi)完成,易于設(shè)計(jì)超標(biāo)量與流水線,寄存器 數(shù)量多,大量操作在寄存器之間進(jìn)行。由于下文所講的CPU核心大部分是講RISC核心,所以這里就不多介紹了,對(duì)于RISC核心的設(shè)計(jì)下面會(huì)詳細(xì)談到。
RISC目前正如日中天,Intel的Itanium也將最終拋棄x86而轉(zhuǎn)向RISC結(jié)構(gòu)。
二、CPU內(nèi)核結(jié)構(gòu)
好吧,下面來看看CPU。CPU內(nèi)核主要分為兩部分:運(yùn)算器和控制器。
(一) 運(yùn)算器
1、 算術(shù)邏輯運(yùn)算單元ALU(Arithmetic and Logic Unit)
ALU主要完成對(duì)二進(jìn)制數(shù)據(jù)的定點(diǎn)算術(shù)運(yùn)算(加減乘除)、邏輯運(yùn)算(與或非異或)以及移位操作。在某些CPU中還有專門用于處理移位操作的移位器。
通常ALU由兩個(gè)輸入端和一個(gè)輸出端。整數(shù)單元有時(shí)也稱為IEU(Integer Execution Unit)。我們通常所說的“CPU是XX位的”就是指ALU所能處理的數(shù)據(jù)的位數(shù)。
2、 浮點(diǎn)運(yùn)算單元FPU(Floating Point Unit)
FPU主要負(fù)責(zé)浮點(diǎn)運(yùn)算和高精度整數(shù)運(yùn)算。有些FPU還具有向量運(yùn)算的功能,另外一些則有專門的向量處理單元。
3、通用寄存器組
通用寄存器組是一組最快的存儲(chǔ)器,用來保存參加運(yùn)算的操作數(shù)和中間結(jié)果。
在通用寄存器的設(shè)計(jì)上,RISC與CISC有著很大的不同。CISC的寄存器通常很少,主要是受了當(dāng)時(shí)硬件成本所限。比如x86指令集只有8個(gè)通用寄存 器。所以,CISC的CPU執(zhí)行是大多數(shù)時(shí)間是在訪問存儲(chǔ)器中的數(shù)據(jù),而不是寄存器中的。這就拖慢了整個(gè)系統(tǒng)的速度。而RISC系統(tǒng)往往具有非常多的通用 寄存器,并采用了重疊寄存器窗口和寄存器堆等技術(shù)使寄存器資源得到充分的利用。
對(duì)于x86指令集只支持8個(gè)通用寄存器的缺點(diǎn),Intel和AMD的最新CPU都采用了一種叫做“寄存器重命名”的技術(shù),這種技術(shù)使x86CPU的寄 存器可以突破8個(gè)的限制,達(dá)到32個(gè)甚至更多。不過,相對(duì)于RISC來說,這種技術(shù)的寄存器操作要多出一個(gè)時(shí)鐘周期,用來對(duì)寄存器進(jìn)行重命名。
4、 專用寄存器
專用寄存器通常是一些狀態(tài)寄存器,不能通過程序改變,由CPU自己控制,表明某種狀態(tài)。
(二) 控制器
運(yùn)算器只能完成運(yùn)算,而控制器用于控制著整個(gè)CPU的工作。
1、 指令控制器
指令控制器是控制器中相當(dāng)重要的部分,它要完成取指令、分析指令等操作,然后交給執(zhí)行單元(ALU或FPU)來執(zhí)行,同時(shí)還要形成下一條指令的地址。
2、 時(shí)序控制器
時(shí)序控制器的作用是為每條指令按時(shí)間順序提供控制信號(hào)。時(shí)序控制器包括時(shí)鐘發(fā)生器和倍頻定義單元,其中時(shí)鐘發(fā)生器由石英晶體振蕩器發(fā)出非常穩(wěn)定的脈沖信號(hào),就是CPU的主頻;而倍頻定義單元?jiǎng)t定義了CPU主頻是存儲(chǔ)器頻率(總線頻率)的幾倍。
3、 總線控制器
總線控制器主要用于控制CPU的內(nèi)外部總線,包括地址總線、數(shù)據(jù)總線、控制總線等等。
4、中斷控制器
中斷控制器用于控制各種各樣的中斷請(qǐng)求,并根據(jù)優(yōu)先級(jí)的高低對(duì)中斷請(qǐng)求進(jìn)行排隊(duì),逐個(gè)交給CPU處理。
(三) CPU核心的設(shè)計(jì)
CPU的性能是由什么決定的呢?單純的一個(gè)ALU速度在一個(gè)CPU中并不起決定性作用,因?yàn)锳LU的速度都差不多。而一個(gè)CPU的性能表現(xiàn)的決定性因素就在于CPU內(nèi)核的設(shè)計(jì)。
1、超標(biāo)量(Superscalar)
既然無法大幅提高ALU的速度,有什么替代的方法呢?并行處理的方法又一次產(chǎn)生了強(qiáng)大的作用。所謂的超標(biāo)量CPU,就是只集成了多個(gè)ALU、多個(gè)FPU、多個(gè)譯碼器和多條流水線的CPU,以并行處理的方式來提高性能。
超標(biāo)量技術(shù)應(yīng)該是很容易理解的,不過有一點(diǎn)需要注意,就是不要去管“超標(biāo)量”之前的那個(gè)數(shù)字,比如“9路超標(biāo)量”,不同的廠商對(duì)于這個(gè)數(shù)字有著不同的定義,更多的這只是一種商業(yè)上的宣傳手段。
2、流水線(Pipeline)
流水線是現(xiàn)代RISC核心的一個(gè)重要設(shè)計(jì),它極大地提高了性能。
對(duì)于一條具體的指令執(zhí)行過程,通常可以分為五個(gè)部分:取指令,指令譯碼,取操作數(shù),運(yùn)算(ALU),寫結(jié)果。其中前三步一般由指令控制器完成,后兩步 則由運(yùn)算器完成。按照傳統(tǒng)的方式,所有指令順序執(zhí)行,那么先是指令控制器工作,完成第一條指令的前三步,然后運(yùn)算器工作,完成后兩步,在指令控制器工作, 完成第二條指令的前三步,在是運(yùn)算器,完成第二條指令的后兩部……很明顯,當(dāng)指令控制器工作是運(yùn)算器基本上在休息,而當(dāng)運(yùn)算器在工作時(shí)指令控制器卻在休 息,造成了相當(dāng)大的資源浪費(fèi)。解決方法很容易想到,當(dāng)指令控制器完成了第一條指令的前三步后,直接開始第二條指令的操作,運(yùn)算單元也是。這樣就形成了流水 線系統(tǒng),這是一條2級(jí)流水線。
如果是一個(gè)超標(biāo)量系統(tǒng),假設(shè)有三個(gè)指令控制單元和兩個(gè)運(yùn)算單元,那么就可以在完成了第一條指令的取址工作后直接開始第二條指令的取址,這時(shí)第一條指令 在進(jìn)行譯碼,然后第三條指令取址,第二條指令譯碼,第一條指令取操作數(shù)……這樣就是一個(gè)5級(jí)流水線。很顯然,5級(jí)流水線的平均理論速度是不用流水線的4 倍。
流水線系統(tǒng)最大限度地利用了CPU資源,使每個(gè)部件在每個(gè)時(shí)鐘周期都工作,大大提高了效率。但是,流水線有兩個(gè)非常大的問題:相關(guān)和轉(zhuǎn)移。
在一個(gè)流水線系統(tǒng)中,如果第二條指令需要用到第一條指令的結(jié)果,這種情況叫做相關(guān)。以上面哪個(gè)5級(jí)流水線為例,當(dāng)?shù)诙l指令需要取操作數(shù)時(shí),第一條指 令的運(yùn)算還沒有完成,如果這時(shí)第二條指令就去取操作數(shù),就會(huì)得到錯(cuò)誤的結(jié)果。所以,這時(shí)整條流水線不得不停頓下來,等待第一條指令的完成。這是很討厭的問 題,特別是對(duì)于比較長的流水線,比如20級(jí),這種停頓通常要損失十幾個(gè)時(shí)鐘周期。目前解決這個(gè)問題的方法是亂序執(zhí)行。亂序執(zhí)行的原理是在兩條相關(guān)指令中插 入不相關(guān)的指令,使整條流水線順暢。比如上面的例子中,開始執(zhí)行第一條指令后直接開始執(zhí)行第三條指令(假設(shè)第三條指令不相關(guān)),然后才開始執(zhí)行第二條指 令,這樣當(dāng)?shù)诙l指令需要取操作數(shù)時(shí)第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會(huì)停頓。當(dāng)然,流水線的阻塞現(xiàn)象還是不能完全避免的, 尤其是當(dāng)相關(guān)指令非常多的時(shí)候。
另一個(gè)大問題是條件轉(zhuǎn)移。在上面的例子中,如果第一條指令是一個(gè)條件轉(zhuǎn)移指令,那么系統(tǒng)就會(huì)不清楚下面應(yīng)該執(zhí)行那一條指令?這時(shí)就必須等第一條指令的 判斷結(jié)果出來才能執(zhí)行第二條指令。條件轉(zhuǎn)移所造成的流水線停頓甚至比相關(guān)還要嚴(yán)重的多。所以,現(xiàn)在采用分支預(yù)測(cè)技術(shù)來處理轉(zhuǎn)移問題。雖然我們的程序中充滿 著分支,而且哪一條分支都是有可能的,但大多數(shù)情況下總是選擇某一分支。比如一個(gè)循環(huán)的末尾是一個(gè)分支,除了最后一次我們需要跳出循環(huán)外,其他的時(shí)候我們 總是選擇繼續(xù)循環(huán)這條分支。根據(jù)這些原理,分支預(yù)測(cè)技術(shù)可以在沒有得到結(jié)果之前預(yù)測(cè)下一條指令是什么,并執(zhí)行它。現(xiàn)在的分支預(yù)測(cè)技術(shù)能夠達(dá)到90%以上的 正確率,但是,一旦預(yù)測(cè)錯(cuò)誤,CPU仍然不得不清理整條流水線并回到分支點(diǎn)。這將損失大量的時(shí)鐘周期。所以,進(jìn)一步提高分支預(yù)測(cè)的準(zhǔn)確率也是正在研究的一 個(gè)課題。
越是長的流水線,相關(guān)和轉(zhuǎn)移兩大問題也越嚴(yán)重,所以,流水線并不是越長越好,超標(biāo)量也不是越多越好,找到一個(gè)速度與效率的平衡點(diǎn)才是最重要的。
三、CPU的外核
1、解碼器(Decode Unit)
這是x86CPU才有的東西,它的作用是把長度不定的x86指令轉(zhuǎn)換為長度固定的類似于RISC的指令,并交給RISC內(nèi)核。解碼分為硬件解碼和微解 碼,對(duì)于簡單的x86指令只要硬件解碼即可,速度較快,而遇到復(fù)雜的x86指令則需要進(jìn)行微解碼,并把它分成若干條簡單指令,速度較慢且很復(fù)雜。好在這些 復(fù)雜指令很少會(huì)用到。
Athlon也好,PIII也好,老式的CISC的x86指令集嚴(yán)重制約了他們的性能表現(xiàn)。
2、一級(jí)緩存和二級(jí)緩存(Cache)
以及緩存和二級(jí)緩存是為了緩解較快的CPU與較慢的存儲(chǔ)器之間的矛盾而產(chǎn)生的,以及緩存通常集成在CPU內(nèi)核,而二級(jí)緩存則是以O(shè)nDie或OnBoard的方式以較快于存儲(chǔ)器的速度運(yùn)行。對(duì)于一些大數(shù)據(jù)交換量的工作,CPU的Cache顯得尤為重要。
GPU:
Graphic Processing Unit簡稱GPU距離那場(chǎng)革命已經(jīng)5年了還記得最早由偉大的nVIDIA在1999年8月31日提出
一,GPU
GPU全稱是Graphic Processing Unit—圖形處理器,其最大的作用就是進(jìn)行各種繪制計(jì)算機(jī)圖形所需的運(yùn)算。包括頂點(diǎn)設(shè)置,光影,像 素操作等。GPU實(shí)際上是一組圖形函數(shù)的集合,而這些函數(shù)由硬件實(shí)現(xiàn),主要用于處理3D游戲中物體移動(dòng)時(shí)的坐標(biāo)轉(zhuǎn)換及光源處理。以前,這些工作都是由 CPU配合特定的軟件來做的。GPU從某種意義上來講就是為了取代CPU在圖形處理過程中充當(dāng)主角而出現(xiàn)的,一塊標(biāo)準(zhǔn)的GPU主要包括 2D Engine,3D Engine ,Video Processing Engine,F(xiàn)SAA Engine,顯存管理單元等等,其中,3D運(yùn) 算中起決定作用的是3D Engine,這是現(xiàn)代3D顯卡的靈魂,也是區(qū)別GPU等級(jí)的重要標(biāo)志。3D Engine在各公司的產(chǎn)品中都是宣傳攻勢(shì)的重點(diǎn) 照顧對(duì)象,名字叫的一個(gè)比一個(gè)響,像nVidia的nFinitFX系列,CineFX系列,ATI的SmoothVision系列,一個(gè) 3D Engine通常包含著T&L單元,Vertex Processing Engine,Setup Engine, Piexl Shader等
二,API
說到API,也許很多人不容易理解。在計(jì)算機(jī)行業(yè)中,所有軟件的程序接口,包括3D圖形程序接口在內(nèi),統(tǒng)稱為API (Application Program Interface)—應(yīng)用程序接口。過去,如果您想讓它們發(fā)揮最大功效,必須做的一件事,就是記錄相關(guān)硬件 設(shè)備的地址。現(xiàn)在,API已成為軟、硬件之間一種連接的橋梁,這道工序就可以省略了。顯卡芯片廠商根據(jù)標(biāo)準(zhǔn)來設(shè)計(jì)自己的硬件產(chǎn)品,以達(dá)到在API調(diào)用硬件 資源時(shí)最優(yōu)化,獲得更好的性能。有了這個(gè)橋梁,便可實(shí)現(xiàn)不同廠家的硬件、軟件最大范圍兼容。目前PC游戲與顯卡之間的橋梁主要有兩個(gè)—DirecX和 OpenGL。可能會(huì)有人認(rèn)為DriectX是一個(gè)專門的圖形API,其實(shí),DirectX并不局限于顯示領(lǐng)域。目前的DirectX中包含有 Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、 Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個(gè)組件,它提供了一整套的 多媒體接口方案。其中,Direct Graphics主要負(fù)責(zé)3D圖形部分
初代的DriectX并不成功,技術(shù)上也不成熟,這種情況一直持續(xù)DriectX5.0,DirectX 5版本在D3D上有很大改善,對(duì)D3D的內(nèi)容做 了徹底修改,除此之外,許多應(yīng)用程序接口的細(xì)節(jié)部分也得到了改進(jìn)。加入了霧化效果、Alpha混合等3D特效,使3D游戲中的空間感和真實(shí)感得以增強(qiáng)。因 此,DirectX發(fā)展到DirectX 5才真正走向了成熟。而真正顯現(xiàn)出DirectX的王者霸氣并且的版本是革命的DirectX7.0
DirectX 7.0加入了硬件幾何轉(zhuǎn)換與光源處理,及T&L技術(shù)。雖然OpenGL中已有相關(guān)技術(shù),但此前從未在娛樂級(jí)顯卡中出現(xiàn)。 T&L技術(shù)將多邊形設(shè)置,光影轉(zhuǎn)換等大計(jì)量消耗CPU運(yùn)算能力的工作轉(zhuǎn)移給了GPU內(nèi)的T&L單元進(jìn)行,從而在一定程度上將CPU從繁重 的勞力中解放了出來
隨后的DirectX 8.0中,T&L被Shader所取代,各種Shader單元的應(yīng)用帶來了圖形特效的質(zhì)的飛躍,DirectX 8.0使 GPU真正成為了可編程的處理器。而DirectX 9.0則將各種Shader效果帶入了FLOAT運(yùn)算的時(shí)代在GPU出現(xiàn)的以前,顯卡和CPU的關(guān)系 有點(diǎn)像“主仆”,簡單的說這時(shí)的顯卡就是畫筆,根據(jù)各種由CPU發(fā)出的指令和數(shù)據(jù)進(jìn)行著色,材質(zhì)的填充,渲染,輸出等等。所以較早的娛樂用3D顯卡又稱 “3D加速卡”,由于大部分坐標(biāo)處理的工作及光影特效需要由CPU親自來執(zhí)行,占用了CPU太多的運(yùn)算時(shí)間,從而造成整體畫面不能非常流暢地表現(xiàn)出來。隨 著時(shí)間的推移,CPU進(jìn)行各種光影運(yùn)算的速度變的越來越無法滿足游戲開發(fā)商的要求,更多多邊形以及特效的應(yīng)用壓榨光了幾乎所有的CPU性能,矛盾產(chǎn)生 了……如果說不堪忍受的游戲速度催生了GPU的話,那么為GPU準(zhǔn)備“產(chǎn)床”的則是我們這個(gè)世界上唯一的軟件帝國:微軟—當(dāng)矛盾接近臨界點(diǎn)時(shí), DriectX7.0來了。接著,1999年8月31日,NV10(就是GeForce)誕生了伴隨著DriectX版本的變化,GPU的發(fā)展也經(jīng)歷了3 個(gè)階段:
1、剪除,變形,光照—T&L以及第一代GPU
第一代GPU的最重要的特點(diǎn)就是在硬件級(jí)別上實(shí)現(xiàn)了T&L運(yùn)算,其代表有:NV10/15(Geforce256/2GTS/MX),R100 (Radeon256/LE),Savage2000等,由于這一代GPU的基本工作原理相同,所以這里我們以Geforce2GTS為例,來看看第一代 的GPU是如何工作的首先,CPU將數(shù)據(jù)傳遞給GPU進(jìn)行處理,數(shù)據(jù)先進(jìn)入T&L單元中的Transform Engine,在這里,數(shù)據(jù)將以頂 點(diǎn)的形式接受視野范圍的判斷,當(dāng)處理單元判斷某部分頂點(diǎn)處于觀察者的視線范圍以外時(shí),Transform Engine將把這部分頂點(diǎn)“剪除”以使其不會(huì) 干擾后續(xù)的流水線操作, 具個(gè)簡單的例子:當(dāng)你在某FPS游戲中突然打開狙擊槍的狙擊鏡,視野變成了一個(gè)圓形的空洞,而其他部分則為黑色,這時(shí) Transform Engine將去除這個(gè)圓形視野范圍以外的所有頂點(diǎn),不過,這里進(jìn)行的只是視野范圍的判斷,Transform Engine去除在 你的視線范圍內(nèi)但是被其它東西擋住了的物體,另外,每一個(gè)三角形可能被旋轉(zhuǎn),放大/縮小,上升,下降,左偏,右移等。 這就是多邊形轉(zhuǎn)換轉(zhuǎn)換。 Transform Engine根據(jù)你的視角,改變了由程序提供的組成3D物體的頂點(diǎn)的坐標(biāo)。經(jīng)過Lighting Engine處理后的圖象經(jīng)過判斷 處理后的數(shù)據(jù)將流入T&L單元中的Lighting Engine,根據(jù)光源的類型,距離,角度,數(shù)目,應(yīng)用方式等不同參數(shù),每一個(gè)多邊形都會(huì)有 不同的光影表現(xiàn)和光影關(guān)系,因而需要不同的光線函數(shù)予以表征,在Lighting Engine中,處理單元將根據(jù)軟件提出的光源分布情況為每個(gè)頂點(diǎn)計(jì)算 出它所具有的光線矢量,以便后續(xù)進(jìn)行的光線紋理貼圖,著色等操作
經(jīng)過Lighting Engine處理的畫面
其實(shí),經(jīng)由T&L單元處理過的數(shù)據(jù)還只是抽象的數(shù)據(jù),并不是具體的圖形,上面兩副圖僅僅是方便讀者進(jìn)行想象的示意圖。
接下來數(shù)據(jù)將流入Setup Engine,在這里,運(yùn)算單元將進(jìn)行三角形的設(shè)置工作,這是整個(gè)繪圖過程中最重要的一個(gè)步驟,Setup Engine甚 至直接影響著一塊GPU的執(zhí)行效能。三角形的設(shè)置過程是由一個(gè)一個(gè)的多邊形組成的,或者是用更好的三角形代替原來的三角形。在三維圖像中可能會(huì)有些三角形 被它前面的三角形擋住,但是在這個(gè)階段3D芯片還不知道哪些三角形會(huì)被擋住。所以三角形建立單元接收到的是一個(gè)個(gè)由三個(gè)頂點(diǎn)組成的完整三角形。三角形的每 個(gè)角(或頂點(diǎn))都有對(duì)應(yīng)的X軸、Y軸和Z軸坐標(biāo)值,這些坐標(biāo)值確定了它們?cè)?D景物中的位置。同時(shí),三角形的設(shè)置也確定了像素填充的范圍
經(jīng)過Setup Engine處理的畫面
最終著色完畢的畫面
在三角形設(shè)置完畢后,T&L單元的全部運(yùn)算就完成了。接下來數(shù)據(jù)將進(jìn)入NV15獨(dú)有的NSR像素處理單元進(jìn)行一定的像素處理,接著流入像素流水線 進(jìn)行后續(xù)的紋理像素填充等操作,這部分操作在DriectX7.0中的變化并不明顯,基本的渲染填充過程與過去的顯卡幾無二異
T&L雖然再一定程度上緩解了CPU運(yùn)算能力的不濟(jì)所帶來的瓶頸,使得系統(tǒng)在圖形方面的資源得到了再分配和增強(qiáng),但同時(shí),T&L也將新的矛盾轉(zhuǎn)到了GPU上
T&L是一組相對(duì)固定的簡單的圖形函數(shù),所實(shí)現(xiàn)的特效受到了函數(shù)本身語句的限制,雖然這種固定的指令集設(shè)計(jì)可以帶來比較高的執(zhí)行效率,但這種設(shè)置 使得DX7下所能實(shí)現(xiàn)的特效受到了指令集的約束,許多逼真的特效無法實(shí)現(xiàn),程序員的思想也被限定在一個(gè)相對(duì)狹窄的范圍內(nèi)。
2、我要看到你飄逸的秀發(fā)和迷人的微笑—可編程Shader以及第二代GPU
DriectX8.0在傳統(tǒng)T&L的基礎(chǔ)上加入了兩個(gè)新的概念—可編程的Vertex Shader和Piexl Shader,同樣的,第二代 GPU的標(biāo)志就是硬件級(jí)別的可編程Shader運(yùn)算,代表產(chǎn)品為NV2X(Geforce3/4Ti),R2XX(Radeon8500)等
可編程Shader的復(fù)雜程度遠(yuǎn)非T&L可比,為了方便大家理解第二代GPU的特點(diǎn),我們先來認(rèn)識(shí)一下什么是可編程Shader,以及可編程Shader運(yùn)算單元
可編程Vertex Shader及頂點(diǎn)處理器:
可編程Vertex Shader讓程序員能夠?qū)μ囟ㄎ矬w,甚至整個(gè)畫面的每一個(gè)頂點(diǎn),指定特別的運(yùn)算程序,卻不需要CPU介入。每一個(gè)頂點(diǎn)都攜帶相當(dāng)多 的信息,比如坐標(biāo),重量,法線,顏色,紋理坐標(biāo),霧和點(diǎn)大小數(shù)據(jù)。頂點(diǎn)處理器能夠以簡短的程序來改變上述這些信息。 這些小程序直接由頂點(diǎn)著色引擎本身執(zhí) 行,不必勞駕CPU。 典型的T&L引擎將程序員限制在3D運(yùn)算的光影轉(zhuǎn)換之前, 在有了頂點(diǎn)處理器的支持之后,游戲設(shè)計(jì)師對(duì)游戲場(chǎng)景里的3D物 體能夠?yàn)樗麨榈牟倏v變化,而且不需要用到中央處理器。
這導(dǎo)致了一場(chǎng)革新,程序可以改變頂點(diǎn)的坐標(biāo),這樣基本上改變物體的形狀,以達(dá)到更接近真實(shí)的移動(dòng)、移動(dòng)殘影、混色、內(nèi)插(在兩種外型間轉(zhuǎn)換),以及變形, 比如改變角色臉部的骨骼和皮膚一個(gè)產(chǎn)生一個(gè)適時(shí)的微笑。也可改變頂點(diǎn)上的顏色數(shù)據(jù)和紋理坐標(biāo),物體表面的顏色達(dá)到設(shè)計(jì)師所想要的色彩效果、投影、凹凸貼圖 設(shè)置(如Blinn Bump mapping)或者其它投射的紋理。光源也可以為程序員隨心所欲的調(diào)整,不再像過去那樣需要對(duì)光源的效果進(jìn)行笨拙的光線 紋理貼圖,而這些在以前是不可想象的。這一切都?xì)w功于可編程Vertex Shader和頂點(diǎn)處理器的出現(xiàn)
Blinn Bump mapping
可編程Piexl Shader以及像素處理器
在NV15中,nVidia曾經(jīng)嘗試加入一個(gè)叫NSR的像素處理單元,它可以在數(shù)據(jù)進(jìn)入像素流水線之前對(duì)每個(gè)像素進(jìn)行一系列運(yùn)算操作,雖然同為每像素操 作,但NSR與Piexl Shader可不能同日而語, NSR對(duì)于像素的運(yùn)算只有7種,同T&L一樣,它依然是固定模式的,程序員依然要依照 規(guī)定好的條條框框?qū)懗龀绦颍鳳iexl Shader則不同,我們可以用許多不同方式去編程,以實(shí)現(xiàn)不同的特效,下面就是一般的像素處理器所具備的特 性:
· 陰影貼圖
· 快速紋理載入
· 影像乘法,對(duì)稱核心
· 支持4096x4096或512x512x512 紋理
· 立方體貼圖每邊可4096x4096x32-位
· 支持YUYV的紋理(自動(dòng)轉(zhuǎn)換成RGB三原色)
· 支持全景貼圖
可以指向任何一個(gè)圖像,如背景緩沖區(qū)(back buffer),而可直接當(dāng)作紋理使用
· 邊緣色彩及邊緣紋理
· 硬件同步化讀/寫
對(duì)同一張紋理的讀及寫允許全流水線操作。
可以對(duì)背景緩沖區(qū)著色,然后馬上能當(dāng)作紋理使用
· Pass through colors
· 支持DX6規(guī)格的環(huán)境凹凸/亮度貼圖(就是環(huán)境凹凸貼圖)
· 簡單的紋理,S,T 在alpha/紅(AB)及藍(lán)/綠 (BG)
· 等向的雙方向性反射分布功能光源
· 內(nèi)積產(chǎn)生色彩貼圖或Z坐標(biāo)
· 真實(shí)反射凹凸貼圖
這看起來似乎有點(diǎn)抽象,簡單的說,可編程Piexl Shader實(shí)現(xiàn)了一個(gè)非常重要的特效—真實(shí)的毛發(fā)
古老街道上昏暗燈光中的狼人
在3D渲染中,渲染真實(shí)的毛發(fā)一直是一件非常困難的事情,大量的多邊形給多邊形生成帶來了嚴(yán)峻的考驗(yàn),而每一根毛發(fā)之間復(fù)雜多變的即時(shí)光影關(guān)系更不是幾個(gè)簡單固定的指令所能實(shí)現(xiàn)的。Piexl Shader的可編程性和運(yùn)算能力很好的解決了這個(gè)問題
好啦,現(xiàn)在讓我們來看看第二代GPU是如何完整處理一個(gè)畫面的吧
首先,來自CPU的各種物理參數(shù)進(jìn)入GPU,Vertex Shader將對(duì)頂點(diǎn)數(shù)據(jù)進(jìn)行基本的判斷,如果沒有需要處理的Vertex效果,則頂點(diǎn)數(shù)據(jù)直 接進(jìn)入Transform&Lighting Unit進(jìn)行傳統(tǒng)的T&L操作以節(jié)約時(shí)間提高效率,如果需要處理各種Vertex效果,則 Vertex Shader將先對(duì)各種Vertex Programs的指令進(jìn)行運(yùn)算,一般的Vertex Programs中往往包含了過去轉(zhuǎn)換,剪 切,光照運(yùn)算等所需要實(shí)現(xiàn)的效果,故經(jīng)由Vertex Shader處理的效果一般不需要再進(jìn)行Transform&Lighting操作;另 外,當(dāng)遇到涉及到曲面鑲嵌(把曲面,比如弓形轉(zhuǎn)換成為多邊形或者三角形)的場(chǎng)合時(shí),CPU可以直接將數(shù)據(jù)交給Vertex Shader進(jìn)行處理
另外,在DX8.0的Transform過程中,Vertex Shader可以完成Z值的剔除,也就是Back Face Culling—陰面隱去,這就意味著除了視野以外的頂點(diǎn)外,視野內(nèi)被前面頂點(diǎn)遮住的頂點(diǎn)也會(huì)被一并剪除,這大大減輕了需要進(jìn)行操作的頂點(diǎn)數(shù)目
接下來,經(jīng)由Vertex Shader處理完成的各種數(shù)據(jù)將流入Setup Engine,在這里一如既往的進(jìn)行三角形的設(shè)置工作,到這里為止,Vertex Shader的工作就完成了
過去,設(shè)置好的三角形本來應(yīng)該帶著各自所有的參數(shù)進(jìn)入像素流水線內(nèi)進(jìn)行紋理填充和渲染,但現(xiàn)在則不同,在填充之前我們還需要進(jìn)行Piexl Shader的操作
其實(shí)Piexl Shader并非獨(dú)立存在的,它位于紋理填充單元之后,數(shù)據(jù)流入像素流水線后先進(jìn)入紋理填充單元進(jìn)行紋理填充,然后便是 Piexl Shader單元,經(jīng)由Piexl Shader單元進(jìn)行各種處理運(yùn)算之后再進(jìn)入像素填充單元進(jìn)行具體的著色,再經(jīng)由霧化等操作后,一個(gè)完整 的畫面就算完成了
值得注意的是,第二代GPU中普遍引入了獨(dú)立的顯示數(shù)據(jù)管理機(jī)制,他們位于Vertex Shader,Setup Engine以及像素流水線之間,負(fù) 責(zé)數(shù)據(jù)的更有效率的傳輸、組合,各種無效值的剔除,數(shù)據(jù)的壓縮以及寄存器的管理等工作,這個(gè)單元的出現(xiàn)對(duì)整個(gè)GPU的工作效率的保證其到了至管重要的作 用。
HyperZ系列:HyperZ技術(shù)本身就是一種類似nVIDIA的“Z-封閉甄別”的技術(shù),但是比nVIDIA還更進(jìn)一步。它的主要功能簡單說來就是分 析在Z軸上的場(chǎng)景,被遮擋的就會(huì)被忽略掉,只渲染我們能看到的部分場(chǎng)景;然后對(duì)渲染過的Z軸場(chǎng)景進(jìn)行壓縮處理,數(shù)據(jù)的壓縮可減少他所占用的空間,從而在存 取Z-Buffer數(shù)據(jù)的時(shí)候可以保留更多的顯存帶寬。而且這是一種畫面質(zhì)量沒有損害的壓縮算法,并不影響畫面質(zhì)量。最后一步就是把經(jīng)過渲染的場(chǎng)景中的Z -Buffer信息立刻清除掉,這樣就更加大了顯存帶寬的利用率。
LMA(光速顯存架構(gòu))系列:光速顯存架構(gòu)采用的第一個(gè)技術(shù)是“顯存交錯(cuò)控制”技術(shù), LMA中的顯存控制器劃分成了4個(gè)獨(dú)立的顯存控制單元,每個(gè)單元最 大可以進(jìn)行32bit圖形相關(guān)數(shù)據(jù)的存取工作,并且這4個(gè)單元之間以及它們和圖形處理單元之間都保持密切的通訊聯(lián)系,并隨時(shí)協(xié)調(diào)平衡各個(gè)子單元之間的數(shù)據(jù) 流量,因此整體來看LMA的顯存控制單元還是可以進(jìn)行128bit數(shù)據(jù)的存儲(chǔ),但是保證了顯存帶寬的充分利用。光速顯存架構(gòu)采用的第二個(gè)技術(shù)是“無損Z壓 縮算法”。傳統(tǒng)的圖形芯片對(duì)于每個(gè)待渲染的圖形象素都要進(jìn)行Z軸數(shù)據(jù)的讀寫工作,因此存儲(chǔ)這些數(shù)據(jù)的Z緩存一向是消耗顯存帶寬的大戶。LMA中集成了硬件 “無損Z壓縮”單元,采用“無損Z壓縮算法”對(duì)Z-緩存數(shù)據(jù)進(jìn)行4:1的完全無損壓縮。 光速顯存架構(gòu)采用的第三個(gè)技術(shù)是“Z-封閉甄別”。排除了圖象中 被遮蓋住而不可見的部分,這樣GPU就不做隱面模型構(gòu)建(節(jié)省處理器的多邊形運(yùn)算資源),并且渲染管線也不對(duì)隱面進(jìn)行渲染(無需從幀緩存中讀寫隱面資料數(shù) 據(jù),節(jié)省渲染管線的象素和紋理生成資源并完全消滅了隱面資料對(duì)顯存帶寬的占用)。最后,LMA還包括了4組高速Cache,對(duì)數(shù)據(jù)傳輸進(jìn)行緩沖。
3、夢(mèng)中的鏡花水月—可編程Shader2.0以及第三代GPU
當(dāng)你第一次看到3Dmark03中的MotherNature時(shí),你有沒有感覺到震撼?
更加寬泛的色彩范圍能夠使得圖形的逼真度上升,這就是Shader2.0的由來,Shader2.0的核心實(shí)際上就是以擴(kuò)大指令數(shù)目以及FLOAT數(shù)據(jù)形 式的應(yīng)用來提高色彩表達(dá)的精確度,而第三代GPU的Shader單元也由此而具備了高精度FLOAT色彩數(shù)據(jù)的運(yùn)算能力。從一般角度來講,第三代GPU同 第二代GPU相比在基本的操作控制形式等方面并沒有本質(zhì)的區(qū)別,但是由于Shader2.0更大的指令長度和指令個(gè)數(shù),以及通用程序+子程序調(diào)用的程序形 式等使得第三代GPU在處理高精度的龐大指令時(shí)效率上有了明顯的提升,同時(shí)也使得第三代GPU的可編程性躍上了一個(gè)新的臺(tái)階
讓我們來看看第三代GPU到底有哪些改進(jìn)吧
Vexter Shader部分
第三代GPU的頂點(diǎn)處理器部分除了一般的操作功能外還具備流程控制能力,包括循環(huán),跳躍以及子程序調(diào)用等,這些控制指令以及更多向量(或標(biāo)量)寄存器的應(yīng) 用使得頂點(diǎn)處理器能夠以更高的效率執(zhí)行Vertex Programs,提高了Vertex的處理速度。同時(shí),加大的指令長度和指令數(shù)量使得頂點(diǎn)處理器的 功能得到了進(jìn)一步的強(qiáng)化。另外,在第三代GPU中,傳統(tǒng)的T&L數(shù)據(jù)將完全交由頂點(diǎn)處理器來執(zhí)行,Transform& Lighting Unit將徹底被頂點(diǎn)處理器“吞并”,這也是第三代GPU的一個(gè)重要特點(diǎn)
Piexl Shader部分
第二代GPU的Piexl Shader只能實(shí)現(xiàn)INT數(shù)據(jù)的運(yùn)算,這勢(shì)必會(huì)帶來最終運(yùn)算結(jié)果的不精確,而數(shù)據(jù)的不精確導(dǎo)致了顏色表現(xiàn)的不準(zhǔn)確,干擾了最 終畫面的質(zhì)量以及效果的表現(xiàn),第三代GPU的重點(diǎn)改進(jìn)就是運(yùn)算單元和寄存器所支持的運(yùn)算格式,現(xiàn)在Piexl Shader可以進(jìn)行更高精度的FLOAT 運(yùn)算和輸出,從而使得圖形的色彩顯示更加精確
暴光正確的圖象
數(shù)據(jù)精度不當(dāng)而無法實(shí)現(xiàn)的特種暴光
另外,第三代GPU的像素處理器每周期所能處理的材質(zhì)以及指令也分別增加了數(shù)倍,這些新特性使得第三代GPU可以處理各種復(fù)雜程度的效果,營造一個(gè)更為真實(shí)的3D畫面,比如更加真實(shí)的水面效果
INT Piexl Shader所表現(xiàn)的水面效果
FLOAT Piexl Shader所表現(xiàn)的水面效果
傳統(tǒng)的INT無法表現(xiàn)寬泛的波浪效果,程序員害怕數(shù)據(jù)精度范圍狹窄引起的上溢或者下溢的發(fā)生而不得不在一個(gè)很小的物理參數(shù)范圍內(nèi)控制漣漪水面所需的波長、 波浪的大小、移動(dòng)速度以及反射和折射效果等,現(xiàn)在,由于數(shù)據(jù)精度的提升,像素處理器完全可以處理一個(gè)非常寬泛的數(shù)據(jù)精度范圍,避免數(shù)據(jù)的溢出,這就使得更 加真實(shí)的水面效果得以被表現(xiàn)。第三代GPU的代表是NV3X系列,R3XX系列等,其中R3XX系列的基本處理方式和順序與第二代GPU在本質(zhì)上基本相 同,僅僅是Vertex Shader和Piexl Shader的具體操作細(xì)節(jié)和運(yùn)算精度上有些許不同,而NV3X雖然在基本原理上也與之大略相同,但 從流水線的角度來看則與完全不同,應(yīng)該算是個(gè)“異類”。產(chǎn)生過程,只分析一下NV3X
以NV35為例:
首先,他具有8個(gè)紋理帖圖單元,但8個(gè)紋理貼圖單元并不在固定分布于每一條Piexl流水線,而是集簇在一起,根據(jù)情況來搭配,可以是4*2、8*1。
其次,他具有12條Shader流水線,但沒有全盤采用浮點(diǎn)渲染流水線,而只是把12條Shader流水線中的8條做成具備浮點(diǎn)處理能力;不過全部12條Shader流水線都具備Fixed-Point Shader的執(zhí)行能力。
另外,NV3X將流水線后部的各種渲染單元,如霧化,Alpha混合等大幅削減,使得流水線在一定程度上公用這些單元
NV30的構(gòu)架組成形式基本上與之相當(dāng),只是數(shù)目上略有不同
由于這個(gè)構(gòu)架并不是傳統(tǒng)意義上的4*2或者8*1的固定構(gòu)架,我們不能象過去那樣說NV35“每個(gè)流水線具有2個(gè)紋理帖圖單元”或者“每條管線具有3個(gè)Shader流水線”……我們只能說“NV35單位周期可以完成8次左右的紋理貼圖或者12次Shader操作”
另外,由于NV3X對(duì)于Fixed-Point Shader的支持精度是FP16和FP32,同時(shí)NV3X的Shader流水線的單位Fixed- Point Shader處理精度是16位,所以當(dāng)遇到32位Fixed-Point Shader數(shù)據(jù)時(shí),能進(jìn)行Fixed-Point Shader 數(shù)據(jù)處理的8條Shader流水線也會(huì)根據(jù)情況進(jìn)行搭配來運(yùn)算32位的Fixed-Point Shader數(shù)據(jù)
Pixel Programs往往是由多條指令構(gòu)成的,不同的指令需要不同的執(zhí)行時(shí)間來完成,每個(gè)像素必須在應(yīng)用在它“身上”的Pixel Shader 操作完成后才能由像素流水線寫入到幀緩存里。故此,對(duì)于應(yīng)用了Piexl Shader的像素實(shí)際上是需要多個(gè)以上的周期才能寫入到幀緩存里,如果采用8 條完整的渲染流水線的話, 流水線后面的霧化、色彩混合等單元很多時(shí)候都會(huì)處在等待階段,這部分單元需要占用的晶體管數(shù)量不在少數(shù),如果這樣浪費(fèi)就怪可惜 的,砍掉后其中的霧化等單元后,對(duì)整體的性能雖然有一些影響,但是卻可以把節(jié)省下來的晶體管用于加強(qiáng)Pixel Shader的功能和性能上來,同時(shí)可以 保證比較高的多重紋理效率,利大于弊。
簡單的,這個(gè)有點(diǎn)詭異的體系節(jié)省晶體管的同時(shí)能確保相對(duì)較好的Pixel Shader效能,同時(shí)還有極高的多重貼圖效能
nVidia本指望4條Pixel管線+ 12條Shader流水線的設(shè)計(jì)能夠在現(xiàn)在以及未來較長的一段時(shí)間的游戲里提供超過4條甚至8條 Pixel Pipeline顯卡的效能。不過,實(shí)際情況卻與nVidia的初衷有些背道而馳,Shader的完美應(yīng)用帶來的一個(gè)結(jié)果就是越來越好的非多 紋理光效果,傳統(tǒng)的多紋理貼圖才能表現(xiàn)的很好的光效果現(xiàn)在只需要進(jìn)行一次貼圖或者直接使用Shader就可以達(dá)到,這使得NV3X的設(shè)計(jì)成為了空架子,實(shí) 用意義大大降低,而在單紋理處理過程中由于NV3X的后續(xù)效果單元被削減,它的渲染效能注定沒有傳統(tǒng)的完整流水線高,另外,由于DX9中的最終FP精度被 定義為FP24,這導(dǎo)致了NV3X的相對(duì)低下的FP效能。最終,本來“先進(jìn)”的NV3X構(gòu)架落的個(gè)整體效能低下的下場(chǎng)
從本質(zhì)上來講,圖形數(shù)據(jù)在NV3X中的實(shí)際處理過程依然是沿著頂點(diǎn)處理器—Setup Engine—像素流水線的順序進(jìn)行的,這與R3XX以及所有的第二代GPU是相同的
天堂的入口—可編程Shader3.0,DriectX Next以及未來的GPU
在微軟剛剛公布的Driect9.0C中,Vertex Shader和Piexl Shader已經(jīng)具有了幾乎相同的能力,而在nVidia新發(fā)布的第 四代GPU—NV40中,我們發(fā)現(xiàn)Vertex Shader包含了4個(gè)紋理取樣器,可以使用texld指令進(jìn)行查表操作, NV40可以在一個(gè) shader pass里完成4個(gè)紋理的讀取,這個(gè)對(duì)于通用替換貼圖而言相當(dāng)?shù)闹匾辛藇ertex texturing功能后, vertex shader就能讀取紋理信息直接映射到頂點(diǎn)上,以實(shí)現(xiàn)displacement mapping(位移映射)等等效果,用不同的紋理和較 少的頂點(diǎn)傳輸時(shí)間就能實(shí)現(xiàn)外形復(fù)雜、平滑的模型,這表明GPU中Vertex Shader的功能正在逐漸接近Piexl Shader。隨著GPU的發(fā) 展,未來GPU中的Vertex Shader和Piexl Shader最終將被合并成一個(gè)統(tǒng)一的處理單元—Intergrated Shader,兩 種處理單元將使用完全相同的語法以及指令集,Shader的統(tǒng)一將帶來完全不同與現(xiàn)在的數(shù)據(jù)執(zhí)行處理方式,GPU的內(nèi)部結(jié)構(gòu)將發(fā)生本質(zhì)的變化, Intergrated Shader帶來了更低晶體管數(shù)目的解決方案,以更少的晶體管數(shù)目來完成現(xiàn)在需要數(shù)億晶體管才能完成的功能,同時(shí)統(tǒng)一 Shader將引出類似全通用I/O接口的設(shè)計(jì)以利資源的更合理的傳輸和分配,同時(shí),為了解決越來越龐大的數(shù)據(jù)量,虛擬顯存、無限資源訪問以及幀緩沖操作 等技術(shù)的引入也勢(shì)在必行。另外,我們?cè)贒irectX Next中還發(fā)現(xiàn)了整數(shù)指令集,處理器等特殊的定義,這些新穎的設(shè)計(jì)為我們勾勒出了未來GPU的輪 廓
整數(shù)指令集
在編程中不必在擔(dān)心指令限制是一個(gè)很大的進(jìn)步,不過想使得GPU更為通用還需要更多的工作。一個(gè)需要提高的主要區(qū)域就是整數(shù)處理能力。目前基于在著色器中 處理的所有數(shù)據(jù)都是浮點(diǎn),這對(duì)于大多數(shù)顯卡操作而言是沒有問題的,不過不適合動(dòng)態(tài)分支預(yù)測(cè)、非內(nèi)插式顯存搜索(如頂點(diǎn)緩沖的索引)等操作。在目前的GPU 中,唯一的內(nèi)存尋址就是紋理查找,使用的也是浮點(diǎn)值。這樣的情況對(duì)于紋理定位而言沒有什么問題,不過對(duì)于通用內(nèi)存尋址而言就不合適了,這里的連續(xù)內(nèi)存塊可 以完全彼此沒有關(guān)聯(lián),采用內(nèi)插式查找沒有任何意義。微軟對(duì)于這樣的情況,在4.0版的Shader模型中引入了全新的、完整的整數(shù)指令集。拓?fù)涮幚砥鲗?shí)際 上,目前的顯卡可以在某些情況下新生成三角形,比如在用到直線以及點(diǎn)的時(shí)候。大多數(shù)的娛樂級(jí)顯卡只具備對(duì)三角形進(jìn)行光柵化處理的能力,這也就意味著所有的 點(diǎn)、線就必須轉(zhuǎn)化為三角形。點(diǎn)和線在最后都將以2個(gè)三角形結(jié)束,這樣就需要用到2-6個(gè)頂點(diǎn)(根據(jù)索引方式的不同而變化)。從本質(zhì)上來說,這樣的做法是有 益處的,通過可編程的管線,顯示先前應(yīng)該遮蔽的場(chǎng)景也就無需通過CPU,而可以通過微軟的“拓?fù)涮幚砥鳌敝苯油瓿伞倪壿嬌蟻碚f,這個(gè)拓?fù)涮幚砥骱丸偳秵?元是相互獨(dú)立的,這個(gè)處理器在兩種操作集中均可以使用。由目前的趨勢(shì)來看,未來的GPU將向著高運(yùn)算能力,高精度,高通用性的方向發(fā)展,GPU在工作方式 上將越來越接近CPU,由于高通用性等CPU特性的引入,GPU可能在一定程度上替代一部分CPU在非繪圖領(lǐng)域的工作,也許在未來我們會(huì)看到由全GPU組 成的圖形工作站。盡管未來GPU需要面對(duì)由于這些改進(jìn)而帶來得的諸多問題,尤其是通用性導(dǎo)致的效率低下,比如Intergrated Shader的效率 低下,但隨著時(shí)間的推移,各種問題都將會(huì)得到妥善的解決。