圖形與計(jì)算那些事 AMD次世代架構(gòu)解析
隨著Tesla在高性能計(jì)算領(lǐng)域日漸深入人心,NVIDIA也在與科研工作者們進(jìn)行深入的溝通,傾聽一線用戶的需求,以便在下代GPU核心中做出相應(yīng)的優(yōu)化改進(jìn)。當(dāng)時(shí)用戶最大的需求有兩點(diǎn):第一,科學(xué)家和超級(jí)計(jì)算只看重64bit雙精度浮點(diǎn)運(yùn)算能力,GT200性能太低,只有單精度的1/8;第二:企業(yè)級(jí)用戶對(duì)穩(wěn)定性要求更高,傳統(tǒng)的顯卡不支持顯存ECC(錯(cuò)誤檢查和糾正),計(jì)算出錯(cuò)后效率較低。
這就是下一代GPU的設(shè)計(jì)目標(biāo)。而且,這次GF100不僅要滿足并行計(jì)算的需求,還要兼顧DX11游戲性能,針對(duì)DX11新增的曲面細(xì)分、幾何運(yùn)算做出相應(yīng)的改進(jìn),時(shí)間緊、任務(wù)重、壓力大。
過于追求完美往往結(jié)果就會(huì)不完美,NVIDIA在GPU架構(gòu)設(shè)計(jì)部分做到了近乎完美,但是在芯片制造端掉了鏈子——由于GPU核心太大,臺(tái)積電40nm工藝還不夠成熟,導(dǎo)致GF100核心良率低下,沒能達(dá)到設(shè)計(jì)預(yù)期,最終的產(chǎn)品不僅功耗發(fā)熱很大,而且規(guī)格不完整。所以雖然當(dāng)時(shí)GTX480顯卡的評(píng)價(jià)不是很高,但GF100核心的架構(gòu)極其優(yōu)秀的。等到工藝成熟之后的GF110核心以及GTX580顯卡,就毫無(wú)疑問的站在了游戲與計(jì)算的巔峰!
GF100是“四核心”設(shè)計(jì):4個(gè)光柵化引擎
GF100/110可以看作是四核心設(shè)計(jì)
如果我們把Cayman看作是雙核心的設(shè)計(jì),那GF100就是四核心的設(shè)計(jì),它擁有四個(gè)GPC(圖形處理器集群)模塊,每個(gè)GPC都有各自的光柵化引擎(Raster Engine),而在以往都是整顆GPU共享一個(gè)Raster Engine。
GF100擁有16個(gè)多形體引擎
GF100與GT200最大的不同其實(shí)就是PolyMorph Engine,譯為多形體引擎。每個(gè)SM都擁有一個(gè)多形體引擎,GF100核心總共有多達(dá)16個(gè)。那么多形體引擎是干什么用的呢?為什么要設(shè)計(jì)如此之多?
為什么要這么多的多形體引擎?
之前的GPU架構(gòu)一直都使用單一的前端控制模塊來(lái)獲取、匯集并對(duì)三角形實(shí)現(xiàn)光柵化。無(wú)論GPU有多少個(gè)流處理器,這種固定的流水線所實(shí)現(xiàn)的性能都是相同的。但應(yīng)用程序的工作負(fù)荷卻是不同的,所以這種流水線通常會(huì)導(dǎo)致瓶頸出現(xiàn),流處理器資源未能得到充分利用。
實(shí)現(xiàn)光柵化并行處理的同時(shí)還要保持API的順序是非常困難的,這種難度阻礙了這一領(lǐng)域的重大創(chuàng)新。雖然單個(gè)前端控制單元的設(shè)計(jì)在過去的GPU中曾有過輝煌的歷史,但是隨著對(duì)幾何復(fù)雜度的需求不斷增長(zhǎng),它現(xiàn)在已經(jīng)變成了一個(gè)主要障礙。
Tessellation的使用從根本上改變了GPU圖形負(fù)荷的平衡,該技術(shù)可以將特定幀中的三角形密度增加數(shù)十倍,給設(shè)置于光柵化單元等串行工作的資源帶來(lái)了巨大壓力。為了保持較高的Tessellation性能,有必要重新平衡圖形流水線。
為了便于實(shí)現(xiàn)較高的三角形速率,NVIDIA設(shè)計(jì)了一種叫做“PolyMorph”的可擴(kuò)展幾何引擎。每16個(gè)PolyMorph引擎均擁有自己專用的頂點(diǎn)拾取單元以及鑲嵌器,從而極大地提升了幾何性能。與之搭配的4個(gè)并行光柵化引擎,它們?cè)诿總€(gè)時(shí)鐘周期內(nèi)可設(shè)置最多4個(gè)三角形。同時(shí),它們還能夠在三角形獲取、Tessellation、以及光柵化等方面實(shí)現(xiàn)巨大性能突破。
這是Cayman的圖形引擎,是雙核心設(shè)計(jì)
AMD的Cayman核心是不分光柵化引擎和多形體引擎的,都可以算作是雙核心設(shè)計(jì),GF100與Cayman相比,光柵化引擎是4:1,多形體引擎(包括曲面細(xì)分單元)是16:2,GF100的幾何圖形性能有多么強(qiáng)大已經(jīng)可以想象。
當(dāng)NVIDIA的工程師通過計(jì)算機(jī)模擬測(cè)試得知幾何引擎將會(huì)成為DX11新的瓶頸之后,毫不遲疑的選擇了將單個(gè)控制模塊打散,重新設(shè)計(jì)了多形體引擎和光柵化引擎,并分散至每組SM或每個(gè)GPC之中,從而大幅提升了幾何性能,徹底消除了瓶頸。
GF100流處理器部分的改進(jìn)
每一個(gè)CUDA核心都擁有一個(gè)完全流水線化的整數(shù)算術(shù)邏輯單元(ALU)以及浮點(diǎn)運(yùn)算單元(FPU)。GF100采用了最新的IEEE754-2008浮點(diǎn)標(biāo)準(zhǔn),2008標(biāo)準(zhǔn)的主要改進(jìn)就是支持多種類型的舍入算法。新標(biāo)準(zhǔn)可以只在最終獲取數(shù)據(jù)時(shí)進(jìn)行四舍五入,而以往的標(biāo)準(zhǔn)是每進(jìn)行一步運(yùn)算都要四舍五入一次,最后會(huì)產(chǎn)生較大的誤差。
GF100能夠?yàn)?2bit單精度和64bit雙精度運(yùn)算提供FMA(Fused Multiply-Add,積和熔加)指令,而GT200只在64bit時(shí)才能提供。FMA不僅適用于高性能計(jì)算領(lǐng)域,事實(shí)上在渲染緊密重疊的三角形時(shí),新的FMA算法能夠最大限度的減少渲染誤差。
ATI所有的流處理器在執(zhí)行整數(shù)型加、乘指令時(shí)僅支持24bit精度,而NVIDIA CUDA核心支持所有整數(shù)指令全32位精度,符合標(biāo)準(zhǔn)編程語(yǔ)言的基本要求。整數(shù)ALU還經(jīng)過了優(yōu)化,可有效支持64位以及更高精度的運(yùn)算,這一點(diǎn)是對(duì)手無(wú)法比擬的。
GF100擁有雙Warp調(diào)度器可選出兩個(gè)Warp,從每個(gè)Warp發(fā)出一條指令到16個(gè)核心、16個(gè)載入/存儲(chǔ)單元或4個(gè)特殊功能單元。因?yàn)閃arp是獨(dú)立執(zhí)行的,所以GF100的調(diào)度器無(wú)需檢查指令流內(nèi)部的依存關(guān)系。通過利用這種優(yōu)秀的雙指令執(zhí)行(Dual-issue)模式,GF100能夠?qū)崿F(xiàn)接近峰值的硬件性能。
GF100首次引入一級(jí)緩存與動(dòng)態(tài)共享緩存
GF100核心擁有很多種類的緩存,他們的用途不盡相同,其中一級(jí)緩存、共享緩存和紋理緩存位于SM內(nèi)部,二級(jí)緩存則是獨(dú)立的一塊,與光柵單元及顯存控制器相連。
以往的GPU都是沒有一級(jí)緩存的,只有一級(jí)紋理緩存,因?yàn)檫@些緩存無(wú)法在通用計(jì)算中用于存儲(chǔ)計(jì)算數(shù)據(jù),只能用于在紋理采樣時(shí)暫存紋理。而在GF100當(dāng)中,NVIDIA首次引入真正的一級(jí)高速緩存,而且還可被動(dòng)態(tài)的劃分為共享緩存。
在GF100 GPU中,每個(gè)SM除了擁有專用的紋理緩存外,還擁有64KB容量的片上緩存,這部分緩存可配置為16KB的一級(jí)緩存+48KB共享緩存,或者是48KB一級(jí)緩存+16KB共享緩存。這種劃分方式完全是動(dòng)態(tài)執(zhí)行的,一個(gè)時(shí)鐘周期之后可自動(dòng)根據(jù)任務(wù)需要即時(shí)切換而不需要程序主動(dòng)干預(yù)。
一級(jí)緩存與共享緩存是互補(bǔ)的,共享緩存能夠?yàn)槊鞔_界定存取數(shù)據(jù)的算法提升存取速度,而一級(jí)緩存則能夠?yàn)橐恍┎灰?guī)則的算法提升存儲(chǔ)器存取速度。在這些不規(guī)則算法中,事先并不知道數(shù)據(jù)地址。
對(duì)于圖形渲染來(lái)說(shuō),重復(fù)或者固定的數(shù)據(jù)比較多,因此一般是劃分48KB為共享緩存,當(dāng)然剩下的16KB一級(jí)緩存也不是完全沒用,它可以充當(dāng)寄存器溢出的緩沖區(qū),讓寄存器能夠?qū)崿F(xiàn)不俗的性能提升。而在并行計(jì)算之中,一級(jí)緩存與共享緩存同樣重要,它們可以讓同一個(gè)線程塊中的線程能夠互相協(xié)作,從而促進(jìn)了片上數(shù)據(jù)廣泛的重復(fù)利用并減少了片外的通信量。共享存儲(chǔ)器是使許多高性能CUDA應(yīng)用程序成為可能的重要促成因素。
GF100擁有一個(gè)768KB容量統(tǒng)一的二級(jí)高速緩存,該緩存可以為所有載入、存儲(chǔ)以及紋理請(qǐng)求提供服務(wù)。二級(jí)緩存可在整個(gè)GPU中提供高效、高速的數(shù)據(jù)共享。物理效果、光線追蹤以及稀疏數(shù)據(jù)結(jié)構(gòu)等事先不知道數(shù)據(jù)地址的算法在硬件高速緩存上的運(yùn)行優(yōu)勢(shì)尤為明顯。后期處理過濾器需要多個(gè)SM才能讀取相同的數(shù)據(jù),該過濾器與存儲(chǔ)器之間的距離更短,從而提升了帶寬效率。
統(tǒng)一的共享式緩存比單獨(dú)的緩存效率更高。在獨(dú)享式緩存設(shè)計(jì)中,即使同一個(gè)緩存被多個(gè)指令預(yù)訂,它也無(wú)法使用其它緩存中未貼圖的部分。高速緩存的利用率將遠(yuǎn)低于它的理論帶寬。GF100的統(tǒng)一共享式二級(jí)高速緩存可在不同請(qǐng)求之間動(dòng)態(tài)地平衡負(fù)載,從而充分地利用緩存。二級(jí)高速緩存取代了之前GPU中的二級(jí)紋理緩存、ROP緩存以及片上FIFO。
GF100的緩存架構(gòu)讓各流水線之間可以高效地通信,減少了顯存讀寫操作
統(tǒng)一的高速緩存還能夠確保存儲(chǔ)器按照程序的順序執(zhí)行存取指令。當(dāng)讀、寫路徑分離(例如一個(gè)只讀紋理路徑以及一個(gè)只寫ROP路徑)時(shí),可能會(huì)出現(xiàn)先寫后讀的危險(xiǎn)。一個(gè)統(tǒng)一的讀/寫路徑能夠確保程序的正確運(yùn)行,同時(shí)也是讓NVIDIA GPU能夠支持通用C/C++程序的重要因素。
與只讀的GT200二級(jí)緩存相比,GF100的二級(jí)高速緩存既能讀又能寫,
而且是完全一致的。NVIDIA采用了一種優(yōu)先算法來(lái)清除二級(jí)緩存中的數(shù)據(jù),這種算法包含了各種檢查,可幫助確保所需的數(shù)據(jù)能夠駐留在高速緩存當(dāng)中。
關(guān)注我們
