自 Alchemist系列显卡推出以来,英特尔的独立显卡战略就一直强调附加功能。从一开始,英特尔就大力投入研发专用的矩阵乘法单元、光线追踪加速器以及硬件视频编解码器。Battlemage系列延续了这一趋势。光线追踪技术值得关注,因为光线追踪效果在越来越多的游戏中变得愈发重要。
在此,分析启用路径追踪功能后,英特尔 Arc B580 显卡渲染《赛博朋克 2077》单帧画面的表现。与以往一致,重点在于架构如何处理负载而非绝对性能表现。
在 1080P 原生分辨率下截取单帧画面,帧率显示为 12FPS。英特尔图形性能分析器生成的占用时间轴显示,光线追踪调用占据帧时间主体,但意外的是,游戏仍有部分时间用于小规模光栅化渲染。
重点分析持续时间最长的光线追踪调用,其负责处理特定光照效果。该 DispatchRays 调用输出的场景呈现高噪点特征,类似于 Blender 渲染时采用极低采样率的中断画面:大型物体可识别,但小型物体难以分辨。
DispatchRays调用的输出,如GPA所示
在英特尔提升光线追踪性能的努力中,Battlemage 的光线追踪加速器发挥着核心作用。光线追踪加速器从执行单元接收消息以启动光线遍历。然后,它会在无需光线生成着色器进一步干预的情况下处理遍历操作,而光线生成着色器在与光线追踪加速器交互后不久便会终止运行。边界体积层次结构数据格式与硬件实现紧密相关。英特尔继续沿用与上一代相同的包围盒节点格式和三角形节点格式。包围盒节点和三角形节点的大小均保持为 64 字节,因此能够恰好适配一个缓存行。
光线追踪的大致运作流程。当然,一级缓存请求存在未命中的可能性。
和 Alchemist以及英特尔酷睿 Ultra相比,Battlemage的光线追踪加速器把遍历流水线的数量从 2 条增加到了 3 条。这使得包围盒测试速率达到每个周期 3 个节点,也就是 18 次包围盒测试。三角形相交测试速率同样提高了一倍。由于更高的 RTA 吞吐量可能会给内存子系统带来更大压力,所以 RTA 的边界体积层次结构(BVH)缓存容量从 8KB 翻倍至 16KB。
在路径追踪 DispatchRays 调用期间,B580 实现每秒处理 4.679 亿条光线(即每个 Xe 核心每秒处理 2340 万条光线)。每条光线平均需 39.5 次遍历步骤。整个 GPU 的光线追踪加速器每秒处理略超 160 亿个边界体积层次结构节点,与遍历步骤数基本匹配。英特尔采用带重启路径的短栈遍历算法,与简单深度优先搜索相比减少了栈空间,使栈能保留在低延迟寄存器中。但该算法可能需要通过重启路径从根节点重新遍历,导致同一条光线多次访问上层 BVH 节点,增加指针追踪访问量。不过 RTA 似乎能避免对已访问节点重复进行相交测试。
每个遍历流水线都保存着光线状态,可能是针对多条光线的状态。前端会将光线分配到各个遍历流水线中。
GPA和指标分别表明射线箱和射线三角形单位的利用率为 1.55% 和 1.04%。英特尔并不受限于ray-box或ray-triangle的吞吐量。即使每个节点都需要进行相交测试,ray-box单元或光ray-triangle的利用率也会低于10%。Battlemage沿用之前的两个ray-box单元和一个triangle单元可能也没问题。我怀疑英特尔发现,复制遍历流水线是一种简单的方法,可以让光线追踪加速器同时处理更多任务,进而改善延迟隐藏问题。
英特尔从未记录过他们所说的光线追踪前端具体指什么。也许光线追踪加速器是由一个接收来自执行单元消息的前端部分,以及一个进行边界体积层次结构遍历的后端部分组成。前端出现停顿可能意味着它已经接收到来自执行单元的消息,但后端的遍历流水线中没有一个能够接受更多的工作任务。添加一条额外的遍历流水线可能是一种简单的方法,以便并行处理更多的光线。而且额外的流水线当然会有它自己的ray-box单元。当然,可能还有其他工作负载会从更高的相交测试吞吐量中受益。英特尔添加了一个额外的三角形测试单元,而这些单元并不属于遍历流水线的一部分。
边界体积层次结构的遍历对延迟很敏感。英特尔的短栈算法比简单的深度优先搜索需要更多的指针追踪步骤,这使得它对内存延迟更加敏感。但它也为通过缓存进行优化创造了空间。使用重启路径涉及到重新访问不久前访问过的节点。缓存可以利用这种时间局部性,这很可能就是英特尔为光线追踪加速器配备一个边界体积层次结构缓存的原因。至强核心已经有一个一级数据缓存,但必须通过至强核心的消息架构来访问它。一个与光线追踪加速器紧密耦合的小缓存更易于针对延迟进行优化。
Battlemage的 16KB 边界体积层次结构缓存的表现比前几代的 8KB 缓存要好得多。除了降低延迟外,BVH 缓存还减轻了一级缓存的压力。每秒访问 160.3 亿个 BVH 节点需要约 1.03TB/s 的带宽。Battlemage的一级缓存可以轻松应对这一需求。但尽量减少数据移动能够降低功耗。BVH 遍历也应该与执行单元上的命中 / 未命中着色器并发运行,减少这些一级缓存使用方之间的资源竞争是有益的。
游戏提供的命中 / 未命中着色器程序处理遍历的命中 / 未命中结果。光线追踪加速器通过向至强核心的线程调度器发送消息来启动这些着色器程序,当执行单元上有可用的线程槽时,线程调度器会将这些程序分配到执行单元上。线程调度器有两个用于非像素着色器工作的队列,以及一个像素着色器工作队列。光线追踪工作仅使用其中一个非像素着色器队列(队列 0)。
在 81.95% 的时间里,队列 0 中有线程在排队等待。它有 79.6% 的时间处于停顿状态,等待执行单元上出现空闲的线程槽。这表明光线追踪加速器生成遍历结果的速度比着色器阵列处理结果的速度要快。
大多数与光线追踪相关的线程启动操作都是针对任意命中或最近命中着色器的。未命中着色器的调用频率则较低。总体而言,英特尔Alchemist Arc B580 上的所有光线追踪加速器每秒启动的线程数略超过 10 亿个。尽管英特尔的光线追踪方法会启动大量的着色器程序,但其中大部分操作都在至强核心内部完成,不会给更高级别的调度硬件带来负担。就如同英特尔酷睿 Ultra一样,英特尔的分层调度设置是使其光线追踪加速器能够良好运行的关键。
GPU 的常规着色器单元运行用于处理光线追踪结果的命中 / 未命中着色器程序。在 “DispatchRays” 调用期间,B580 的执行单元几乎所有的线程槽都处于激活状态。如果你能在任务管理器中把执行单元的线程槽(共 1280 个)视为逻辑核心,你会看到其利用率达到了 93.8%。从算术逻辑单元 0的利用率细分情况来看,大部分工作来自任意命中和最近命中着色器。未命中着色器的调用并非罕见,但或许未命中着色器所承担的工作并不多。
就如同任务管理器中的高利用率并不能显示出你的 CPU 核心在底层实际工作的速度有多快一样,高占用率也并不意味着执行单元的利用率就高。更多的线程只是为 GPU 提供了更多的线程级并行性,以便隐藏延迟,这就好比在 CPU 核心上加载更多的同步多线程线程一样。在这种工作负载下,即使是高占用率也不足以实现良好的硬件利用率。整体来看,执行单元的使用率较低,算术逻辑单元 0和算术逻辑单元 1的运算流水线忙碌的时间不到 20%。
英特尔可以分析出在执行单元无法执行任何指令的周期内,线程停顿的原因。在同一周期内,多个线程可能会因不同原因而停顿,因此这些原因的占比总和会超过 100%。简单查看一下就会发现,内存延迟是一个重要因素,因为即使不把 “发送写操作” 停顿计算在内,“scoreboard ID” 停顿在各项原因中也居于首位。现代的 CPU 和 GPU 通常会有很多时间处于执行单元闲置状态,等待从内存中获取数据。但《赛博朋克 2077》的路径追踪着色器似乎比平常的情况要更难处理一些。
执行延迟也会造成影响,这表明《赛博朋克 2077》的光线追踪着色器没有太多的指令级并行性。如果编译器无法在依赖指令之间放置足够多的独立指令,线程就会停顿。GPU 通常可以通过在线程之间切换来隐藏执行延迟,并且在此工作负载下,执行单元确实有大量的线程级并行性可供利用。但这还不够,所以很可能存在许多高延迟指令和较长的依赖链。
最后,线程常常会在指令获取时停顿。指令缓存的命中率仅为 92.7%,所以一些着色器程序会出现一级指令缓存未命中的情况。指令缓存带宽可能也是个问题。如果我的计算没错的话,每个至强核心的指令缓存每个周期能处理 1.11 次命中,所以指令缓存有时每个周期必须处理不止一次访问请求。如果每次访问的是一个 64 字节的缓存行,那么每个至强核心消耗的指令带宽超过 200GB 每秒。英特尔的至强核心设计似乎确实需要大量的指令带宽。每个至强核心有八个执行单元,每个执行单元每个周期可以发出多条指令。要同时为算术逻辑单元 0和算术逻辑单元 1提供指令,每个核心需要达到 2 条指令每周期的速率,即整个至强核心达到 16 条指令每周期的速率。相比之下,AMD 的 RDNA 2 架构仅需要指令缓存以 4 条指令每周期的速率来为其向量执行单元提供指令。
已执行的着色器代码通常使用 32 位数据类型,一些 16 位数据类型只占次要地位。64 位整数指令也会出现,可能用于地址计算。特殊功能单元(数学运算)使用频率很高,这可能是导致上述算术逻辑单元写操作停顿的原因之一。
32 位整数指令和 32 位浮点数指令的紧密结合很适合执行单元的流水线布局,因为这些指令类型是在不同的端口上执行的。然而,性能还受到执行单元吞吐量和流水线布局之外的其他因素的限制。
Battlemage的至强核心内部的缓存难以应对这项路径追踪工作负载的内存访问需求。尽管一级缓存容量从 192KB 增加到了 256KB,Battlemage的一级缓存命中率仍然低于 60%。英特尔通过一个单独的缓存来处理纹理访问,从延迟测试来看,这个缓存的容量似乎为 32KB。纹理缓存的命中率不尽人意,不到 30%。
GPU 的流量情况
很多内存访问操作都落到了二级缓存上,英特尔Alchemist Arc B580 的 18MB 二级缓存最终处理的流量超过了 1TB 每秒。二级缓存的命中率很不错,超过了 90%,所以 18MB 的二级缓存容量对于这项工作负载来说是足够的。Arc B580 的 192 位 GDDR6 显存配置可以提供 456GB 每秒的带宽,而这项工作负载平均使用了 334.27GB 每秒的带宽。英特尔图形性能分析器显示,内存请求队列在不到 1% 的时间里是满的,所以 B580 的 GDDR6 显存子系统在带宽方面表现良好。奇怪的是,二级缓存未命中计数表明存在 122.91GB 每秒的二级缓存未命中带宽。有某些数据在消耗显存带宽,但却没有经过二级缓存。
3DMark 的《光追港都》基准测试使用了光线追踪反射和阴影效果。它仍然使用光栅化来渲染场景的大部分内容,而不像《赛博朋克 2077》的路径追踪模式那样以光线追踪为主。这使得《光追港都》更能代表一种在中高端显卡上实际运行的光线追踪工作负载。我正在研究一个似乎是处理反射效果的 “DispatchRays” 调用。
“DispatchRays” 调用的输出结果
在《光追港都》中,光线需要更多的遍历步骤。较高的边界体积层次结构缓存命中率有助于保持快速遍历,所以光线追踪加速器能够维持与《赛博朋克 2077》中相近的每秒光线处理数量。尽管如此,《光追港都》对光线追踪加速器施加了相对更大的压力。光线追踪遍历停顿更频繁地发生,这表明光线追踪加速器接收到遍历工作的速度比它生成结果的速度要快。
与此同时,当遍历结束时,光线追踪加速器为着色器阵列生成的任务量较少。《光追港都》中只有未命中着色器和最近命中着色器,所以当光线穿过透明物体时,不会启动多个任意命中着色器。《赛博朋克 2077》的路径追踪模式还会启动任意命中着色器,这使得可以实现更复杂的效果,但也带来了更多的任务量。在《光追港都》中,至强核心线程调度器很少有任务排队等待执行单元的空闲线程槽。从执行单元的角度来看,占用率也更低。综合这些指标来看,表明 B580 的着色器阵列处理遍历结果的速度比光线追踪加速器生成结果的速度要快。
就如同一个对缓存非常友好的工作负载,其单线程在运行时能够实现的每周期指令数,可能会高于在有大量缓存未命中情况的工作负载下两条同步多线程线程一起运行时的每周期指令数一样,尽管《光追港都》平均处于活动状态的线程较少,但它实现了更高的执行单元利用率。指令获取导致的停顿情况基本消失了。内存延迟始终是个问题,但没有那么严重了。这使得一些停顿原因转变为执行延迟,但这是件好事,因为数学运算的延迟通常比内存访问的延迟要低。
这在很大程度上归结于《光追港都》对缓存更加友好。B580 的一级缓存能够处理更多的内存访问请求,从而减少了二级缓存和显存的流量。
英特尔的Battlemage架构在光线追踪方面比其前代产品更为强大,这得益于增强后的光线追踪加速器,它们拥有更高的吞吐量和更好的缓存性能。光线追踪所涉及的远不止边界体积层次结构遍历,因此英特尔经过改进的着色器阵列也为光线追踪带来了好处。这一点在《赛博朋克 2077》的路径追踪模式中体现得尤为明显,该模式试图实现的不仅仅是简单的反射和阴影效果,这给着色器阵列带来了很大压力。《光追港都》有限的光线追踪效果则带来了不同的挑战。简单的效果意味着执行单元的工作较少,重点就转移到了光线追踪加速器上。
光线追踪工作负载多种多样,工程师们必须在固定功能的边界体积层次结构遍历硬件和常规向量执行单元之间合理分配晶体管资源。不禁想起了 DirectX 9 时代的 GPU,它们要在顶点着色器核心数量和像素着色器核心数量之间寻求平衡。更多的顶点着色器有助于处理复杂的几何图形,更多的像素着色器则有助于实现更高的分辨率。同样地,边界体积层次结构遍历硬件处理几何图形,命中 / 未命中着色器则会影响屏幕上像素的颜色,不过它们是基于采样进行操作,而不是直接为指定的像素坐标计算颜色。
光栅化和光线追踪都对内存子系统有着很高的要求,而内存子系统也一直制约着性能的提升。因此,英特尔对其缓存进行了改进,以便为性能提升后的光线追踪加速器和执行单元提供数据支持。16KB 的边界体积层次结构缓存和更大的通用一级缓存在《光追港都》中发挥了很大作用。但在应对《赛博朋克 2077》的路径追踪时,它们的表现就没那么出色了。也许英特尔可以把至强核心的缓存做得更大。但就像芯片上的所有设计一样,工程师们必须在有限的晶体管资源下做出权衡取舍。
多个 “DispatchRays” 调用的输出结果,通过手动相加,并在 GIMP 软件中调整了曝光度。未应用降噪处理。
《赛博朋克 2077》的路径追踪模式是一个很酷的展示,但无论如何,对于像 B580 这样的中端显卡来说,它并不能很好地使用。至少如果不进行大量的画面放大处理,或许再加上帧生成技术的话,是无法流畅运行的。B580 的缓存在像《光追港都》这样更简单的工作负载中表现更好。也许英特尔在调校Battlemage架构的缓存时,就考虑到了这类工作负载。考虑到《赛博朋克 2077》的路径追踪模式甚至对高端 GPU 都是个挑战,这是一个不错的权衡。
就像英特尔瞄准 GPU 市场的主流需求区间的策略一样,也许Battlemage架构的光线追踪实现方案瞄准的是支持光线追踪的游戏的主流需求,这些游戏使用一些光线追踪效果来增强一个以光栅化为主的场景。展望未来,英特尔计划继续推进其光线追踪技术的发展。Xe3 架构增加了带有相关新数据结构的子三角形不透明度剔除功能。虽然目前英特尔的编译器代码只引用了Panther Lake,Xe3,但期待看到英特尔在独立显卡的光线追踪技术方面接下来的进展。
本文转自媒体报道或网络平台,系作者个人立场或观点。我方转载仅为分享,不代表我方赞成或认同。若来源标注错误或侵犯了您的合法权益,请及时联系客服,我们作为中立的平台服务者将及时更正、删除或依法处理。