(原标题:碎裂 GPU 瓶颈)
公众号谨记加星标,第一时候看推送不会错过。
着手 :骨子编译自interplayoflight,谢谢。
GPU哄骗率和性能改良
长远推敲 GPU 的架构,你会发现其中枢包含大宗的SIMD 单位,这些单位的作用是读取数据,实行矢量或标量 ALU(VALU 或 SALU)运算,并将赶走写入渲染瞎想或缓冲区。这些单位存在于 Nvidia 所谓的流多处理器 (SM) 和 AMD 所谓的责任组处理器 (WGP) 中。充分哄骗 SIMD 单位和 VALU 蒙眬量(即保抓它们忙于责任)对于晋升渲染任务的性能至关紧迫,尤其是在 GPU 越来越宽、SIMD 单位越来越多的时间。
为了读写其操作的数据,SIMD 单位通过一些“固定功能”单位与 GPU 的其余部分进行交互,举例用于处理数据肯求的 TEX 单位、用于存储临时数据 (VGPR) 的寄存器文献、用于写入渲染瞎想的 ROP 单位,以及用于存储和读取数据的多个缓存。举例,这是 Blackwell 架构的 SM,展示了 VALU (FP32/INT32) 单位与之交互的一些单位。
固定功能单位由于其责轻易质浅显而速率很快,但它们仍然可能成为瓶颈,导致 VALU 单位无法责任,或遮挡其输出赶走。因此,图形门径员的一个紧迫责任是分析渲染责任负载(画图调用和改动),并尝试扬弃由上述固定功能单位以过甚他单位(举例输入汇编器 (IA)、光栅单位以及内存带宽等)变成的瓶颈,因为这些单位会镌汰 VALU 的哄骗率。
恐怕,由于渲染责任的性质,镌汰 VALU 哄骗率/蒙眬量的瓶颈更难扬弃,举例暗影贴图通谈在 VALU 责任上会很松驰,而况受到 IA(World Pipe)和内存(VRAM)的瓶颈,为其提供至极数据,因此 SM 蒙眬量(代码实行)会很低:
另一个例子是经营着色器通谈,它会复制渲染瞎想或创建深度mipchain,此时着色器中的责任量不及以让VALU单位保抓忙绿。在这种情况下,为了获得最好赶走,咱们需要退一步,从举座上注释GPU性能,温存的不是单个渲染任务(画图调用/改动)的性能,而是跨渲染任务,并臆测通盘帧的改良。在这篇博文中,我将商量一些可以用来已矣这少许的时间。免责声明:任何性能优化责任的灵验性在很猛进度上取决于瞎想GPU、着色器编译器、渲染器和渲染骨子,很难一概而论。一如既往,请严慎对待任何无情,并长久分析您的用例。
倏得休息一下,商量一下瓶颈。我屡次提到了瓶颈,但何如才智细目果然的瓶颈是什么以及需要措置哪些问题呢?像 Nsight Graphics(GPU Trace)、AMD Radeon Profiler和PIX这么的性能分析器具王人是可以的采用。使用性能分析器具,最浅显的顺次是画图每个 GPU 单位的哄骗率图表来可视化瓶颈。对于 GPU Trace,也等于我上头发布的截图,它画图的是各式“蒙眬量”。通过这么的视图,咱们很容易看出,举例,暗影贴图通谈主要受 VRAM(内存带宽)和至极输入(World Pipe)的不断(这意味着它最常使用阿谁单位/资源)。GTAO 通谈受 L2 缓存的不断,而 ShadowMask 通谈(用于经营后光跟踪暗影)受 RT 中枢的不断。这意味着,若是咱们念念要晋升任何一个通谈的性能,那么主要的瓶颈是咱们最初应该措置的问题。
因此,最初值得强调的是,咱们应该尽可能镌汰单个高支出 Drawcall 的资本/提高 VALU 的哄骗率,并针对其特定的瓶颈。举例,若是 Drawcall 受内存蔓延收尾,即 VALU 教导需要恭候内存到达,那么可以通过减少 VGPR(矢量寄存器)分派来提高内存占用率,概况再行瞎想着色器,以便在内存读取和内存使用之间留出更多教导,举例部分伸开轮回,这些王人是值得尝试的顺次。此外,通过打包/压缩着色器的输入和输出来增多数据流以撤废 VALU 禁锢(这适用于悉数类型的着色器,包括至极着色器,因为其导出属性的数目可能会成为某些 GPU 的瓶颈),以及不雅察数据访谒模式并调养所使用的数据结构(举例,在 Nvidia GPU 上,结构化缓冲区在当场访谒方面的证实优于常量缓冲区),这些顺次王人将获得到报。
若是瓶颈的性质决定了进一步晋升性能并非易事,那么进一步晋升仍有可能,但顺次可能违背直观。举例,若是着色器的占用率超过高,这可能会导致缓存抖动,因为不同的动手中的线程会尝试访谒缓存。在这种情况下,可以通过增多 VGPR 分派(一种顺次是创建一个长久不会被实行的杜撰大型动态分支)来镌汰占用率;概况,若是这是一个经营着色器,则可以通过实行杜撰组分享内存 (LDS) 分派来镌汰占用率。若是可能,最好使用 LDS 分派来收尾占用率,因为让 VGPR 保抓幽闲情状可能对与此任务并行动手的其他任务成心(在团结图形管谈上,但也使用异步经营,稍后会详备先容)。可是,增多 VGPR 分派可能会带来其他积极的影响,编译器可能会哄骗这少许,并在着色器启动时批量加载纹理,以减少内存蔓延。
另一件值得沟通的事情是,对于特定的责任负载,哪种着色器类型最合适。像素着色器是 GPU 几那儿理活水线的一部分,这意味着它依赖于固定函数单位的输入(光栅化器和至极着色器导出的数据)和输出,以及 ROP 单位写入渲染瞎想,因此它可能会受到其中任何一项的制约而成为瓶颈。屏幕空间、导出绑定的像素着色器(受 ROP 单位禁锢)或具有发散实行(即,warp/wave 中某些像素的早期输出)动作经营着色器可能会更有上风,因为经营着色器莫得悉数这些依赖项。此外,经营着色器可以访谒另一种类型的内存,即组分享内存(或土产货数据存储),它可以用作中间存储,在线程组线程之间分享数据,从而大幅加速实行速率。
另一方面,像素着色器管线可能领有经营着色器所不具备的快速旅途和功能。举例,GCN 在渲染后端单位中有一个专用缓存(“热情缓存”),可以径直与 DRAM 通讯以读取/写入热情值,从而绕过二级缓存。这意味着使用像素着色器写入渲染瞎想可能比经营着色器更快,因为它可以开释二级缓存用于其他用途。不外,其他架构上可能不存在这种专用缓存。像素着色器也可以受益于硬件 VRS,从而镌汰资本,这少许值得沟通(尽管经营着色器也可以接管“软件 VRS ”措置有瞎想)。像素着色器输出可以进行DCC 压缩,这可能会在后续将渲染瞎想动作纹理读取时提高内存带宽。此外,像素着色器(包括全屏着色器)可以受益于模板操作,致使深度操作,以加速处理速率。不生成波形比生成波形并提前拒绝(由于某种情况而住手着色器实行)更快。
在决定将责任迁徙到那儿时,还应试虑每种着色器类型之间的责任散播各异。举例,GPU 会将通盘线程组分派给特定的 SM 或 WGP,而况其悉数 warp/wave 王人将在团结个 SM/WGP 上实行。这对于缓存一致性和数据局部性超过有用,而况可以充分哄骗组分享内存,尤其是对于大型线程组而言。另一方面,大型线程组在 SM/WGP 上生成之前需要更多可用资源(VGPR/LDS),这可能会导致争用和蔓延。像素着色器 wave 的生成更具臆测性,会证据屏幕位置以平铺格式生成。
并可能提高实行速率。将 VALU 责任移超过端着色器,以减弱受 VALU 不断的像素着色器的压力,是一种采用,但需要防备:由于波辐射模式(举例,在 GCN 上每个经营单位一个波辐射模式),至极着色器的缓存一致性和数据局部性可能不太好;为剔除的三角形/像素完成的至极着色器责任被滥用;此外,将数据从至极着色器导出到像素可能会成为某些 GPU 架构的瓶颈。沟通到面前的三角形数目和密度,将责任移超过端着色器可能不太勾引东谈主。
在某些架构上,举例在 RDNA 上,可以采用 wave 大小,着色器类型也可能会影响实行和性能。在 RDNA 上,经营着色器每个 wave 以 32 个线程动手(wave32),而像素着色器则以 64 个线程动手(wave64)。对于严重依赖 wave intrinsic 的着色器,采用 wave64 像素着色器可能会更有上风,因为它可以完成更多责任(64 个责任项,而非 32 个)。此外,与前边提到的组分享内存比拟,wave intrinsic 是一种更好的线程间数据分享格式,因为它存储在 VGPR 中,这是 SIMD 可用的最快存储格式。另一方面,对于实行格式不同的着色器(举例(当场)屏幕空间反射),采用 wave32 经营着色器可能会证实更好,因为 wave 更有可能在线程数较少的情况下提前完成并退出。值得一提的是,由于SM6.6 HLSL 为经营着色器界说了 WaveSize,因此在赞成的情况下,也可以采用增多其大小。
将责任负载改动为经营着色器还有另一个潜在的庞杂上风,它为使用异步经营与图形管谈并行动手开荒了谈路(即重复至极着色器、像素着色器,致使其他经营着色器的实行)。异步经营是提高 VALU 哄骗率的绝佳器具,因为它可以重复其他可能存在固定功能单位瓶颈的通谈,并哄骗它们无法使用的资源。举例,缓存和 SM 瓶颈通谈(GTAO),
可以与 RT Core 绑定通谈 (Shadowmask) 好意思满搭配
使用通谈无法使用的 GPU 资源。异步经营还可能与其他 VALU 哄骗率较低的通谈重复,举例 z-prepass 或暗影通谈,这些通谈可能主要受到几何蒙眬量或像素着色器导出绑定通谈(屏幕空间,但也可能填充 gbuffer,具体取决于材质着色器的复杂性)。这里有几件事值得沟通,当今莫得 API 公开的顺次来范围异步经营任务的实行,在优先级、节流以减少对图形管谈的影响等方面(在 DirectX 12 上,我笃信 Vulkan 公开了 VK_AMD_wave_limits),因此异步经营可能会对图形管谈产生负面影响,这可能是可以经受的,独一并行动手的两个任务的总资本低于在图形管谈上串行动手时的资本。杜撰 LDS(概况不太保举使用 VGPR,因为它更有可能影响图形管谈上的 wave 启动)分派和线程组大小也可用于影响异步经营任务的实行,举例,袖珍线程组可能比大型线程组重复得更好,而况需要进行一些推行才智找到符合特定用例的正确设立。临了,对于经营着色器重复的问题,在某些 GPU 架构上,独一莫得樊篱,图形管谈上的经营责任可以与像素/至极着色器责任重复。
为了已矣精良的渲染性能,扬弃固定函数和其他瓶颈,并允许 GPU 实行有用的责任至关紧迫。咱们有许多器具和时间可以已矣这少许,无论是单次画图调用/改动优化,还是重复责任以哄骗未使用的经营资源,即使这会增多单个渲染任务的资本。由于市集上 GPU 架构种类粘稠,很难细目哪种顺次最灵验,而且需要反复磨真金不怕火才智细目哪种顺次在每种用例中赶走最好,因为并非悉数顺次在悉数 GPU 上王人能相似出色地动手。
*免责声明:本文由作家原创。著作骨子系作家个东谈主不雅点,半导体行业不雅察转载仅为了传达一种不同的不雅点,不代表半导体行业不雅察对该不雅点赞同或赞成,若是有任何异议,接待关系半导体行业不雅察。
今天是《半导体行业不雅察》为您分享的第4141期骨子,接待温存。
加星标第一时候看推送,小号防走丢
求保举