NVIDIA Turing 架構解析:追光逐影,成敗未定
雷鋒網消息,自NVIDIA的Turing架構問世已經過去了一個多月時間,GeForce RTX 20系列的發佈以及實時光線跟蹤技術的推出,讓NVIDIA將使用多年的“GeForce GTX”更名為“GeForce RTX“,並徹底改變了遊戲顯卡。實時光線跟蹤、RT Core、Tensor核心、AI功能(即DLSS)、光線跟蹤API,所有這些都彙集在一起,為遊戲開發和GeForce顯卡的未來發展指明瞭新方向。
與過去推出的產品大不相同,NVIDIA已將其最新顯卡的介紹內容分為兩部分:架構和性能。近日,NVIDIA終於揭開了全新Turing架構細節的面紗,雖然一些有趣的方面尚未得到官方解釋,還有一些環節需要與客觀數據一起深入研究,但也讓我們有機會深入了解那項為GeForce RTX冠名的技術:光線追蹤。
雖然使用Turing的實時光線追蹤功能需要藉助DirectX的光線追蹤(DXR)API、NVIDIA的OptiX引擎或未發佈的Vulkan光線追蹤擴展,而用於遊戲的DXR還沒有發佈給終端用户,但鑑於NVIDIA傳統上具有開發人員和中間件(例如GameWorks)的強大生態系統,他們希望利用高端遊戲來激發消費者對混合渲染(光柵化+光線跟蹤)的支持。
正如之前所説,NVIDIA正在通過混合渲染來努力推動消費級GPU實現脱胎換骨的轉變。而使NVIDIA邁出這一步的背後原因,除開“實時光線追蹤是計算機圖形學的聖盃”這一點之外,還有很多超越了圖形純粹主義的其他潛在動機。
光線追蹤第一課:what&why
由於NVIDIA用於光線追蹤的RT Core是Turing架構的兩項技術基石之一,因此在我們深入了解Turing架構之前,最好先討論清楚什麼是光線追蹤,以及為什麼NVIDIA會在其上投入如此多的芯片資源。
簡而言之,光線追蹤是一種渲染方式,可模擬光在現實世界中的表現(反射、折射等)。實現它的最大問題在於它近乎於無底洞一樣誇張的性能的需求,如果使用最原始的方法來嘗試計算場景中每個光源發出的所有光線,將會在場景中追蹤到無窮無盡的光線。
多年以來,算法工程師們為光線追蹤開發了許多優化措施,其中最重要的是把“光照”這一簡單的概念顛倒過來,不是從光源開始追蹤光線,而是從屏幕、從觀測者的視點逆向追蹤光線,這樣便可以只計算實際到達屏幕的光線,大幅縮減所需的計算量。
然而即便使用了包括此法在內的許多優化方式,光線追蹤對性能的需求依然高的驚人。除了最基本、最粗糙的光線追蹤之外,其他任何情況都依然超出了實時渲染的範圍。這些優化技術僅僅是讓光線追蹤可以在計算機上以相對“合理”的時間完成,當然這個“合理”是以小時或天來衡量的,這要取決於場景的複雜程度以及你所期望達到的渲染效果。實際上到目前為止,光線追蹤一直被主要是3D動畫電影等“離線”場景。
光柵化渲染的是是非非
光線追蹤的高成本意味着它還不能用於實時圖像渲染,因此計算機行業從一開始便使用了一種名為光柵化的渲染方法。
雖然名字沾一個“光”字,但整個光柵化渲染中其實根本沒有“光線”的概念。光柵化(Rasterization)指的是3D幾何轉換為2D像素的過程,所有的畫面特效都只是針對一個個像素的操作。
當遊戲開始渲染一幀畫面時,首先由CPU生成遊戲場景中所有物體的頂點,然後把所有頂點的座標信息發送給GPU內的幾何單元。幾何單元以屏幕位置為基準構建出可視空間,將這些頂點按照座標安置到空間中,緊接着將頂點連接成線框,構造出物體的輪廓,然後在表面覆蓋上一層帶有帶光照信息的底層紋理作為蒙皮。到這一步,我們的遊戲畫面便初具幾何形態。
接下來便是整個光柵化渲染流程的核心:光柵化,GPU內的光柵化單元(Rasterizer)依照線透視關係,將整個可視空間從三維立體形態壓成一張二維平面。之後流處理器再根據場景中物體之間的幾何位置關係,通過各種渲染算法,確定哪些像素亮&有多亮,哪些像素暗&有多暗,哪些像素是高光,哪些像素是陰影。
在流處理器忙着計算像素信息的同時,GPU內的紋理單元也開始將預設的“整張”紋理材質剪裁成畫面所需的形狀。最後,流處理器和紋理單元分別把計算好的像素信息和剪裁好的紋理材質遞交給處於GPU後端的ROPs,ROPs將二者混合填充為最終畫面並輸出。除此之外,遊戲中霧化、景深、動態模糊和抗鋸齒等後處理特效,也是由ROPs完成的。
看到這裏應該明白,我們看到的每一幀遊戲畫面,都是GPU畫給你的一張3D立體畫而已。3D立體畫看起來真不真實,取決於繪畫者的水平如何;而光柵化渲染出來的畫面真不真實,取決於渲染算法是否先進和完善。
混合渲染,光線追蹤迴歸
光柵化的簡單和快速決定了其對現實世界中畫面的模擬是有限的,這也導致了光柵化普遍存在光照、反射和陰影不自然等缺陷。如果光柵化是如此不準確,遊戲如何進一步提高其圖像質量?
當然可以繼續這麼走下去,光柵化解決這些問題並非不可能,只是所需要的計算性能將會高速膨脹。就像撒一個謊要用十個謊來圓一樣,某些情況下想用光柵化渲染生成逼真的畫面,甚至比光線追蹤的自然過程更復雜。
換句話説,與其在光柵化這種本質是視覺欺騙的渲染方式上消耗這麼多性能,何不把這些努力投入另一種可以準確渲染虛擬世界的技術上?
2018年,整個計算機行業都在思考這一問題。而對於NVIDIA來説,前進的道路不再是純粹的光柵化,而是混合渲染:將光柵化與光線追蹤相結合,其想法是在有意義的地方使用光線跟蹤——用於照明、陰影和其他所有涉及光的相互作用的內容,然後使用傳統的光柵化來處理其他一切,這也正是Turing架構的核心思想所在。
這意味着開發人員可以兩全其美,根據需求平衡光柵化的高性能和光線追蹤的高質量,而無需立即從光柵化跳轉到光線追蹤並失去前者的所有性能優勢。到目前為止,NVIDIA及其合作伙伴所展示的案例都是很容易實現的,比如精確的實時反射和更好的全局光照,但顯而易見混合渲染可以擴展到任何與光照相關操作。
然而,NVIDIA、微軟和其他公司也不得不為其從零開始建立一個生態系統,他們不僅要向開發人員推銷光線追蹤的優點,而且還要教開發人員如何以有效的方式實現它。
不過我們現在依舊可以可以先來討論一下光線追蹤,看看NVIDIA如何通過構建專用硬件單元,將實時光線追蹤變為現實。
邊界體積層次結構
可以説,NVIDIA在Turing上下了很大的賭注,傳統的GPU架構可以高速處理光柵化渲染,但並不擅長光線追蹤這項任務。因此NVIDIA必須為光線追蹤增設專用硬件單元,而這些額外的晶體管和電力消耗卻對傳統的光柵化渲染沒有直接的助益。
這部分專用硬件單元很大程度上將被用於解決光線追蹤的最基本問題:判定光線與物體的相交情況。這個問題最常見的解決方案是將三角形存儲在一個非常適合光線追蹤的數據結構中,這種數據結構稱為BVH(邊界體積層次結構)。
從概念上講,BVH相對簡單,它並不是檢測每個多邊形以判斷是否與光線相交,而是檢測場景的一部分以查看是否與光線相交。如果場景某部分與光線相交,則將其細分為較小的部分並再次檢測,依次繼續下去直至單個多邊形,此時光線檢測得到解決。
對於計算機科學家來説,這聽起來很像二元搜索的應用,而且確實如此。每次檢測都允許丟棄大量選項(在光線追蹤中為多邊形)作為可能的答案,便可以在很短的時間內到達正確的多邊形。BVH反過來又存儲在本質上是樹數據結構的東西中,每次細分(邊界框)都存儲為其父邊界框的子節點。
現在BVH的問題是,雖然它從根本上減少了所需判斷的光線相交量,但這些針對的都是單獨一條光線,當每個像素都需要多條光線經過時,每條光線都需要進行大量檢測,它的計算量依然不低。這也是為什麼使用專門的光線追蹤單元進行硬件加速如此重要的原因。
繼承Volta精神的Turing架構
我們來看看這次的Turing架構,新的Turing SM看起來與上一代的Pascal SM非常不同,但了解Volta架構的人肯定能注意到Turing SM與Volta SM是非常相似的。
與Volta一樣,Turing SM被劃分為4個子核(或處理塊),每個子核具有單個warp調度器和調度單元,而Pascal的2個分區設置是每個子核的warp調度器具有兩個相對的調度端口。
從廣義上講,這樣的變化意味着Volta和Turing失去了在一個時鐘週期內從線程發出第二條非依賴指令的能力。Turing可能與Volta在兩個週期內執行指令相同,但調度程序可以在每個週期發出獨立指令,因此Turing最終可以通過這種方式維護雙向指令級並行(ILP),同時仍然具有兩倍於Pascal的調度程序數量。
正如我們在Volta中看到的那樣,這些變化與新的調度/執行模型緊密相連,而Turing也有獨立的線程調度模型。與Pascal不同的是,Volta和Turing都有每個線程的調度資源,有一個程序計數器和每個線程的堆棧來跟蹤線程的狀態,以及一個收斂優化器來智能的將活動的同warp線程分組到SIMT單元中。
就CUDA和ALU(算術邏輯單元)而言,Turing子核具有16個INT32單元,16個FP32單元和2個Tensor單元,與Volta子核的設置相同。使用像Volta這樣的拆分INT/FP數據路徑模型,Turing還可以同時執行FP和INT指令,而這與RT Core密切相關。Turing與Volta的不同之處在於Turing沒有FP64單元,其FP64的吞吐量只有FP32的1/32。
雖然這些細節可能更偏向於技術方面,但Volta的這種設計似乎是為了最大化Tensor Core的性能,而最大限度的減少了破壞性並行性或與其他計算工作負載的協調。對於Turing的第二代Tensor Core和RT Core來説情況也是如此,其中4個獨立調度的子核和粒度線程處理對於在混合遊戲導向工作負載下實現最高性能非常有用。
在內存方面,Turing的每個子核都有一個類似Volta的L0指令緩存,具有相同大小的64 KB寄存器文件。在Volta中,這對於減少Tensor Core的延遲很重要,而在Turing中這可能同樣有利於RT Core。Turing SM每個子核也有4個加載/存儲單元,低於Volta中的8個,但仍然保持4個紋理單元。
新的L1數據高速緩存和共享內存(SMEM)進一步向上擴展,它已被改進並統一為單個可分區內存塊,這是Volta的另一項創新。對於Turing來説,這看起來是一個組合的96 KB L1/SMEM,傳統圖形工作負載分為64KB專用圖形着色器RAM和32 KB紋理高速緩存和寄存器文件溢出區域。同時,計算工作負載可以將L1/SMEM劃分最多64 KB作為L1,其餘32 KB作為SMEM,反之亦然(Volta的SMEM最高可配置為96 KB)。
RT Core:混合渲染和實時光線跟蹤
在Turing上,光線追蹤並不能完全取代傳統的光柵化渲染,而是作為“混合渲染”的一部分而存在,而且“實時”也只能在每個像素只通過少量光線並輔以大量降噪的情況下實現。
出於性能原因,現階段開發人員將有意識和有針對性的利用光線追蹤來實現光柵化無法實現的部分逼真效果,例如全局照明、環境光遮蔽、陰影、反射和折射等。光線追蹤同樣也可以限於場景中的特定對象,並且使用光柵化和z緩衝代替主光線投射,而僅對次光線進行光線跟蹤。
憑藉光線追蹤在計算機圖形領域的重要性,NVIDIA Research相當長一段時間內一直在研究各種BVH實現,以及探索光線跟蹤加速的架構問題。不過NVIDIA並未透露有關RT Core或其BVH實現的許多細節。
RT Core與Tensor Core不同,Tensor Core更像是與FP和INT核心一起的FMA陣列,而RT Core更像是典型的卸載IP塊。與子核中的紋理單元非常相似,RT Core的指令被路由到子核之外,在從SM接收到光線探測器後,RT核心繼續自主遍歷BVH並執行光線相交檢測。
這種類型的“遍歷和交叉”固定函數光線追蹤加速器是一個眾所周知的概念,多年來已經有很多實現,因為遍歷和交叉檢測是計算密集程度最高的兩種任務。相比之下,在着色器中遍歷BVH將需要每條光線投射數千個指令槽,所有這些都用於檢測BVH中的邊界框交叉點。
RT Core還處理一些內存操作的分組和調度,以最大化跨多個光線的內存吞吐量。與許多其他工作負載一樣,內存帶寬是光線追蹤的一個常見瓶頸,也是NVIDIA Research多篇論文討論的焦點。考慮到光線追蹤會產生非常不規則和隨機的內存訪問,SIP塊中可能還有一些內存和光線緩衝區。
Tensor Cores:將深度學習推理用於遊戲渲染
儘管Tensor Cores是Volta的典型特徵,但此番Turing上搭載的第二代Tensor Core卻是青出於藍。
第二代Tensor Core的主要變化是增加了用於推理的INT8和INT4精度模式,通過新的硬件數據路徑啟用,並執行點積累積為INT32積。INT8模式的運算速度是FP16的兩倍,或每個時鐘2048次整數運算;INT4模式的運算速度是FP16速率的四倍,或每個時鐘4096次整數運算。
第二代Tensor Core仍然具有FP16模式,並且能夠支持純FP16模式而沒有FP32累加器。雖然CUDA 10還沒有出來,但增強的WMMA操作應該能夠解釋任何其他差異,例如操作數的額外可接受矩陣大小。
GeForce RTX和Turing所帶來的不僅是RTX這一全新品牌命名,還有將Turing的所有功能歸為一體的NVIDIA RTX平台,包括:
引用NVIDIA RTX平台:包含所有Turing功能的通用平台,包括高級着色器
NVIDIA RTX光線追蹤技術:RTX平台下光線追蹤技術的名稱
GameWorks Raytracing:光線追蹤降噪模塊的GameWorks SDK
GeForce RTX:使用NVIDIA RTX實時光線追蹤與遊戲相關的品牌
GeForce RTX:顯卡品牌
NGX在技術上隸屬於RTX平台,其最具代表性的是DLSS(深度學習超級採樣)技術。DLSS使用專為遊戲而設的DNN(深度神經網絡),使用超高質量的64倍超級採樣圖像或真實畫面進行訓練,進而通過Tensor Core來推斷高質量的抗鋸齒結果。標準模式下,DLSS以較低的輸入樣本推斷出高倍抗鋸齒的結果,在目標分辨率上可達到與TAA相似的效果。
由於涉及深度學習,NVIDIA正在將純粹的計算/專業功能推向消費者領域。在Turing上,Tensor Core可以加速DLSS等特性,也可以加速某些基於AI的降噪器,以清理和校正實時光線追蹤渲染的畫面。
雷鋒網(公眾號:雷鋒網)小結
Turing架構和Geforce RTX的發佈,標誌着計算機圖形學在消費級市場上開始從虛假的視覺欺騙向着真實的追光逐影發展。到目前為止,業界對它們的讚譽也一直是毫不吝惜。
雖然Turing架構增設了專用的光線追蹤單元RT Core,並輔以Tensor Core來進行AI降噪,但在冷靜客觀的思考下,根據雷鋒網的了解,在1080P分辨率下,光線追蹤具備基本可用性的入門門檻是每幀畫面包含1億條光線,如果以60fps為標準,就需要GPU達到每秒至少能處理60億條光線的計算能力。
回過頭來看剛剛發佈的Geforce RTX 2080Ti/2080/2070三款顯卡,它們的光線追蹤性能分別是每秒處理100億/80億/60億條光線,並且NVIDIA似乎表示未來更低的Geforce RTX/GTX 2060等顯卡將不再支持光線追蹤。
不知這是不是巧合,Geforce RTX 2070的光線追蹤性能剛剛好壓在了上面所述具備基本可用性的入門門檻上,這樣來看,更低端的顯卡不支持光線追蹤也是情有可原。
此外,也許是目前的光線追蹤算法過於追求簡化,對光影關係的還原仍有可能出現錯誤。例如在NVIDIA用戰地V這款遊戲演示RTX效果時,汽車對於火光的反射便出現了一處錯誤,紅框處的車燈罩是背對着車後的火光的,從角度上來看完全不應該有火光的反射:
且根據最近流出的性能測試來看,即便是最高端的Geforce RTX 2080Ti在開啟光線追蹤後,也僅能在1080P下將幀數維持45fps左右,顯然還要大幅低於理論性能。種種情況表明,現階段的光線追蹤依然徘徊在“有可用性”的門檻邊緣,Turing和Geforce RTX顯卡是否已經邁過了這一腳,真的還不好説……
via:Anandtech
雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。
資料來源:雷鋒網
作者/編輯:任然