与过去推出的产品大不相同,NVIDIA已将其最新显卡的先容内容分为两部分:架构和性能。
近日,NVIDIA终于揭开了全新Turing架构细节的面纱,虽然一些有趣的方面尚未得到官方阐明,还有一些环节须要与客不雅观数据一起深入研究,但也让我们有机会深入理解那项为GeForce RTX冠名的技能:光芒追踪

虽然利用Turing的实时光芒追踪功能须要借助DirectX的光芒追踪(DXR)API、NVIDIA的OptiX引擎或未发布的Vulkan光芒追踪扩展,而用于游戏的DXR还没有发布给终端用户,但鉴于NVIDIA传统上具有开拓职员和中间件(例如GameWorks)的强大生态系统,他们希望利用高端游戏来引发消费者对稠浊渲染(光栅化+光芒跟踪)的支持。

正如之前所说,NVIDIA正在通过稠浊渲染来努力推动消费级GPU实现洗手不干的转变。
而使NVIDIA迈出这一步的背后缘故原由,除开“实时光芒追踪是打算机图形学的圣杯”这一点之外,还有很多超越了图形纯粹主义的其他潜在动机。

光芒追踪第一课:what&why

解读|NVIDIA Turing 架构解析追光逐影成败不决

由于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