自 NVIDIA 的图灵(Turing)架构问世已过了一个多月,GeForce RTX 20 系列发表及即时光线追踪技术,让 NVIDIA 将使用多年的“GeForce GTX”更名为“GeForce RTX”,并彻底改变游戏显卡。即时光线追踪、RT Core、Tensor 核心、AI 功能(即 DLSS)、光线追踪 API,所有汇集在一起,为游戏开发和 GeForce 显卡的未来发展指明新方向。
与过去产品大不相同,NVIDIA 已将最新显卡的介绍内容分为两部分:架构和效能。近日,NVIDIA 终于揭开全新图灵架构细节的面纱,虽然一些有趣处未有官方解释,还有一些环节需要与客观资料一起深入研究,但也让我们有机会深入了解为 GeForce RTX 冠名的技术:光线追踪。
虽然使用图灵的即时光线追踪功能需要借助 DirectX 光线追踪(DXR)API、NVIDIA 的 OptiX 引擎或未发表的 Vulkan 光线追踪延伸,用于游戏的 DXR 还没推给终端机用户,但鉴于 NVIDIA 传统具有开发人员和中介软件(如 GameWorks)的强大生态系统,他们希望利用高阶游戏来激发消费者支持混合算图(光域化+光线追踪)。
正如之前所说,NVIDIA 透过混合算图努力推动消费级 GPU 达成转变。使 NVIDIA 迈出这步的背后原因,撇开“即时光线追踪是电脑图形学的圣杯”这点之外,还有很多超越图形纯粹主义的其他潜在动机。
光线追踪第一课:what & why
由于 NVIDIA 光线追踪的 RT Core 是图灵架构的两项技术基石之一,因此深入了解图灵架构之前,最好先讨论清楚什么是光线追踪,以及为什么 NVIDIA 会投入如此多芯片资源。
简而言之,光线追踪是一种计算绘图方式,可模拟光在现实世界的表现(反射、折射等)。最大问题在于近乎无底洞一样夸张的效能需求,如果使用最原始方法尝试计算场景中每光源发出的所有光线,将会追踪到无穷无尽的光线。
多年以来,算法工程师为光线追踪开发许多最佳化措施,其中最重要的是把“光照”简单概念复原,不是从光源开始追踪光线,而是从屏幕、从观测者的视点逆向追踪光线,这样便可只计算实际到达屏幕的光线,大幅缩减所需的计算量。
然而即便使用此法在内的许多最佳化方式,光线追踪对效能的需求依然高得惊人。除了最基本、最粗糙的光线追踪,其他任何情况都超出即时计算绘图的范围。这些最佳化技术仅让光线追踪在电脑上以相对“合理”的时间完成,当然这个“合理”是以小时或天来衡量,这要取决于场景的复杂程度及期望达到的算图效果。实际上到目前为止,光线追踪一直被主要是 3D 动画电影等场景“离线”使用。
光域化算图的是是非非
光线追踪的高成本意味着无法用于场景时影像计算着色,因此电脑业从一开始便使用名为光域化的算图方法。
虽然名字有“光”字,但整个光域化算图其实根本没有“光线”概念。光域化(Rasterization)指的是 3D 几何转换为 2D 画素的过程,所有画面特效都只针对一个个画素作业。
当游戏开始计算绘制一格画面时,首先由 CPU 生成游戏场景所有物体顶点,然后把所有顶点座标资讯传送给 GPU 内的几何单元。几何单元以屏幕位置为基准构建可视空间,将这些顶点按照座标安置到空间,紧接着将顶点连线成线框,构造出物体外框,然后在表面覆盖一层带有光照资讯的底层材质为蒙皮。到这步,游戏画面便初具几何形态。
接下来便是整个光域化算图流程的核心:光域化,GPU 内的光域化单元(Rasterizer)依照线透视关系,将整个可视空间从三维立体形态压成一张二维平面。之后处理器再根据场景物体之间的几何位置关系,透过各种算图算法,确定哪些画素亮和有多亮,哪些画素暗和有多暗,哪些画素是打光,哪些画素是阴影。
处理器忙着计算画素资讯的同时,GPU 的材质单元也开始将预设的“整张”材质剪裁成画面所需形状。最后,处理器和材质单元分别把计算好的画素资讯和剪裁好的材质递交给 GPU 后端的 ROPs,ROPs 将二者混合填补为最终画面汇出。除此之外,游戏中雾化、景深、动态模糊和抗锯齿等后处理特效,也是由 ROPs 完成。
看到这里应该明白,我们看到的每格游戏画面,都是 GPU 画给你的一张 3D 立体画而已。3D 立体画看起来真不真实,取决于绘画者的水准如何;而光域化算图的画面真不真实,取决于算图算法是否先进完善。
混合算图,光线追踪回归
光域化的简单和快速决定了模拟现实世界画面有限,这也导致光域化普遍有光照、反射和阴影不自然等缺陷。如果光域化如此不准确,游戏如何进一步提高影像品质?
当然可以继续这么下去,光域化解决这些问题并非不可能,只是所需的计算效能会高速膨胀。就像撒一个谎要用十个谎来圆,某些情况下想用光域化算图生成逼真画面,甚至比光线追踪的自然过程更复杂。
换句话说,与其在光域化这种本质是视觉欺骗的算图方式消耗这么多效能,何不把这些努力投入另一种可准确算图虚拟世界的技术?
2018 年,整个电脑业都在思考这问题。对 NVIDIA 来说,前进的道路不再是纯粹光域化,而是混合算图:将光域化与光线追踪相结合,是在有意义的地方使用光线追踪──用于照明、阴影和其他所有涉及光的相互作用内容,然后使用传统光域化处理其他,这正是图灵架构的核心。
这意味着开发人员可以两全其美,根据需求平衡光域化的高效能和光线追踪的高品质,而无需立即从光域化跳到光线追踪并失去前者的效能优势。到目前为止,NVIDIA 及合作伙伴展示的案例都很容易实现,比如精确的即时反射和更好的全域光照,但显而易见混合算图可延伸到任何光照相关作业。
然而,NVIDIA、微软和其他公司也不得不为从零开始建立新生态系统,不仅要向开发人员推销光线追踪的优点,还要教开发人员如何以有效的方式达成。
不过现在依旧可先讨论一下光线追踪,看看 NVIDIA 如何透过构建专属硬件单元,将即时光线追踪变成现实。
边界体积层次结构
可以说,NVIDIA 在图灵下了很大的赌注,传统 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 的三十二分之一。
虽然这些细节可能更偏向于技术面,但 Volta 的设计似乎是为了最大化 Tensor Core 的效能,而最大限度减少破坏性并列性或与其他计算工作负载的协调。对 Turing 的第二代 Tensor Core 和 RT Core 来说情况也是如此,其中 4 个独立排程的子核和粒度执行绪处理,对混合游戏导向工作负载下达成最高效能非常有用。
内存方面,Turing 每个子核都有一个类似 Volta 的 L0 指令缓冲区,有相同大小的 64KB 暂存器档案。Volta 中,这对减少 Tensor Core 延迟很重要,而 Turing 中这可能同样有利于 RT Core。Turing SM 每个子核也有 4 个加载/储存单元,低于 Volta 的 8 个,但仍然保持 4 个材质单元。
新的 L1 资料高速缓冲区和共用内存(SMEM)进一步向上延伸,被改进并统一为单个可割区内存块,这是 Volta 的另一项创新。对 Turing 来说,这看起来是一个组合的 96KB L1 / SMEM,传统图形工作负载分为 64KB 专属图形着色器 RAM 和 32KB 材质高速缓冲区和暂存器档案外溢区域。同时,计算工作负载可以将 L1 / SMEM 划分最多 64KB 为 L1,其余 32KB 为 SMEM,反之亦然(Volta 的 SMEM 最高可规格为 96KB)。
RT Core:混合算图和即时光线追踪
在图灵,光线追踪无法完全取代传统的光域化算图,而是当作“混合算图”的一部分,且“即时”也只能在每个画素只通过少量光线并辅以大量降噪的情况下做到。
出于效能原因,现阶段开发人员有将意识和针对性的利用光线追踪达成光域化无法做到的部分逼真效果,例如全域照明、环境光遮蔽、阴影、反射和折射等。光线追踪同样也可限于场景特定物件,并使用光域化和 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 的典型特征,但此番图灵搭载的第二代 Tensor Core 却青出于蓝。
第二代 Tensor Core 的主要变化是增加推理用的 INT8 和 INT4 精度模式,透过新硬件资料路径启用,并执行点积累积为 INT32 积。INT8 的运算速度是 FP16 的 2 倍,或每个时钟 2,048 次整数运算;INT4 的运算速度是 FP16 速率的 4 倍,或每个时钟 4,096 次整数运算。
第二代 Tensor Core 仍有 FP16,并支援纯 FP16 而没有 FP32 累加器。虽然 CUDA 10 还没有出来,但增强的 WMMA 作业应该能解释任何其他差异,例如算子的其余可接受矩阵大小。
GeForce RTX 和图灵带来的不仅是 RTX 全新品牌命名,还有将图灵所有功能归为一体的 NVIDIA RTX 平台,包括:
- NVIDIA RTX 平台:包含所有图灵功能的通用平台,包括进阶着色器。
- NVIDIA RTX 光线追踪技术:RTX 平台光线追踪技术名称。
- GameWorks Raytracing:光线追踪降噪模组的 GameWorks SDK。
- GeForce RTX:使用 NVIDIA RTX 即时光线追踪与游戏相关的品牌。
- GeForce RTX:显卡品牌。
NGX 技术上隶属 RTX 平台,最具代表性的是 DLSS(深度学习超级取样)技术。DLSS 使用专为游戏而设的 DNN(深度神经网络),使用超高品质的 64 倍超级取样影像或真实画面训练,进而透过 Tensor Core 推断高品质的抗锯齿结果。标准模式下,DLSS 以较低的汇入样本推断出高倍抗锯齿的结果,在目标分析度可达到与 TAA 相似的效果。
由于涉及深度学习,NVIDIA 正在将纯粹的计算/专业功能推向消费者领域。在图灵上,Tensor Core 可加速 DLSS 等特徴,也可以加速某些基于 AI 的降噪器,以清理和校正即时光线追踪算图的画面。
小结
图灵架构和 Geforce RTX 发表,标志了电脑图形学在消费级市场开始从虚假视觉欺骗向真实追光逐影发展。到目前为止,业界的赞誉也毫不吝啬。
虽然图灵架构增设专属光线追踪单元 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 用《战地风云 5》示范 RTX 效果时,汽车车身反射火光便出现了一处错误,红框处的车灯罩是背对车后火光,角度上来看完全不应该有火光反射:
根据最近流出的效能测试来看,即便是最高阶的 Geforce RTX 2080Ti 开启光线追踪后,也仅能在 1080P 下维持格数在 45fps 左右,显然大幅低于理论效能。种种情况表明,现阶段的光线追踪依然徘徊在“有可用性”的门槛边缘,图灵架构和 Geforce RTX 显卡是否过了第一关,还真的不好说……
- The NVIDIA Turing GPU Architecture Deep Dive: Prelude to GeForce RTX
(本文由 雷锋网 授权转载;首图来源:NVIDIA)