麦斯科技 · 2023年03月26日 · 四川

Arm Immortalis-G715开发者概述

https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-blog/posts/arm-immortalis-g715-developer-overview
作者:Peter Harris 2023年3月20日

新款Arm®Immortalis™ - G715 GPU及其较小的兄弟产品Arm Mali现在可以在消费类设备中使用,开发者可以访问。每一代Arm GPU都会带来改进,提供更快、更节能的内核,以及新的功能和扩展。这篇博客探讨了今年有哪些新的和令人兴奋的功能,以及如何有效地使用这些功能。

光线追踪

Immortalis-G715最大的新功能是硬件加速的光线追踪。光线追踪为开发人员提供了创建效果的自由,例如非平面反射镜和多层折射,这些效果很难单独使用光栅化来模拟。硬件支持Vulkan光线查询和完整的Vulkan管线追踪管道,尽管一些早期驱动程序可能只公开光线查询扩展。

immortalis pic 1.png-1265x0.png

光线查询(VK_KHR_Ray_query)允许从现有管线阶段(pipeline stages)访问光线追踪功能。这是我们期望大多数移动内容在开始使用光线追踪时选择的方法。它允许开发人员创建一个可在所有设备上使用的渲染器,但可以在合适的设备上使用光线追踪效果进行增强。

光线追踪管线(VK_KHR_ray_tracing_pipeline)将替换API中现有的图形管道模式。它允许开发人员创建一个完全光线追踪的渲染器,使用光线生成而不是光栅化来触发像素着色。绕过传统的基于光栅化的管线提供了一些创造性的功能,但也有一些缺点,例如丢失帧缓冲区压缩。我们建议从光线查询开始,因为它可能会在移动设备上提供最佳性能。

Arm Mobile Studio(https://developer.arm.com/mobile-studio)的评测工具套件完全支持光线追踪硬件。在我们的Streamline探查器中提供了大量的计数器检测,在使用Mali Offline Compiler时提供了着色器最佳实践静态分析。

RayTracing-Rate.png-759x282.png

光线追踪最佳实践

光线遍历是在per-warp的基础上处理的,因此通过保持每个扭曲的光线一致性可以获得最佳性能。通过保持光线指向相似的方向,并具有相似的光线原点和长度,最大限度地减少遍历发散。为了确保编译器能够静态分析遍历以获得扭曲一致性,我们建议每个rayQueryInitialize()执行一个rayQueryProceed()。我们还建议避免在循环或复杂的条件控制流中进行查询。

遍历标志也会影响光线遍历效率。如果在编译时无条件设置gl_RayFlagsSkipAABB和gl_RayflagsPaque,则遍历速度会更快。对于阴影(shadowing)和遮挡(occlusion)测试,我们只关心相交几何体(intersecting geometry)的存在,而不关心相交的几何体本身。对于这些用例,请使用gl_RayFlagsTerminateOnFirstHit标志,因为它允许在不解析特定最近命中(specific closest-hit)的情况下提前终止遍历。

加速结构的拓扑结构可能会影响光线追踪性能。要最大限度地减少必须遍历的节点数量,请尽量减少树中每个节点的边界体积。通过将包含大空间间隙的底层节点拆分为多个BLAS条目,最大限度地减少重叠的底层加速结构(BLAS)。通过确保几何体轴向对齐,使用BLAS变换应用任何必要的旋转,最大限度地减少每个BLAS内节点的边界体积。

可变比率着色(Variable Rate Shading)

今年的第二个重要功能是可变速率着色(VRS),它可用于Vulkan(VK_KHR_fragment_Shading_Rate) 以及OpenGL ES(GL_EXT_fragment_shading_rate)。使用VRS,应用程序可以降低碎片着色器的评估频率,从而提高着色器繁重工作负载的性能。单个片段着色器调用可以将输出写入大于单个像素的区域,同时保持精确的采样覆盖率以保持边缘精度。

Arm GPU实现了完整的VRS实现,相当于DirectX第2层功能集。这将暴露1x1、1x2、2x1、2x2、2x4、4x2和4x4像素区域的着色。可以按绘制、按图元或使用屏幕空间速率控制附件来提供速率选择。还提供了逻辑组合器,允许应用程序合并来自这三个来源的决策。

当使用VRS来降低包含很少高频数据的对象的着色率时,VRS可以获得最佳的视觉效果。这最大限度地减少了由于明暗处理率降低而引入的视觉误差。

一个不太详细的绘图调用的例子是一个skybox。这是管道级(pipeline-level)VRS的一个很好的候选者,因为细节的缺乏在整个对象上是一致的。然而,skyboxes倾向于使用简单的着色器,因此好处可能很小。

更有用的是,VRS可以用于已知在运行时具有动态较少细节的渲染对象,这取决于它们的使用方式。VRS可以用于降低无论如何都将被模糊的对象的成本,例如,由于景深或运动模糊。VRS也可以使用基于屏幕位置调整成本的速率控制图像附件来控制。这有助于降低光滑或深色区域的成本,因为这些区域可能看不到精细的细节。

可变比率着色最佳实践

VRS的好处将取决于您的内容。VRS保证着色器评估频率降低,但光栅化、ZS测试和混合仍以原始采样密度进行评估。使用简单着色器的应用程序应该可以从VRS中看到能源效率的提高,但可能看不到性能优势。VRS的好处不是线性的,而且随着非着色器成本开始成为瓶颈,随着区域大小的增大,它的效果往往会降低。

使用2x4、4x2或4x4区域时,具有复杂分层的内容有时会出现意外的速度减慢。为了避免这种情况,请尝试将VRS实现限制为2x2或更小的区域大小,使用由驱动程序静态确定的大小。

  • 分配管线范围的VRS速率时,请使用2x2或更小的区域大小。
  • 当使用gl_PimitiveShadingRateEXT分配每基元VRS速率时,分配可以在编译时被证明小于或等于2的值。
  • 当使用着色率图像指定VRS速率时,请使用带有OP_MIN的组合器来夹住管道上设置的2x2大小。

您可以使用我们的Streamline探查器中可访问的硬件计数器来测量您的实际内容着色率。新的着色率计数器以覆盖像素数的百分比报告着色的片段数。着色率为100%表示1:1的着色率,而着色率低于100%表示使用了VRS来降低着色率。请注意,此计数器中也将显示采样率着色的使用,超过100%的值表示在多采样帧缓冲区上使用采样率着色。

VRS-Rate.png-759x58.png

Arm固定比率压缩(Fixed Rate Compression)

今年,我们的高级GPU配置可以使用Arm固定比率压缩(AFRC),这是一种用于LDR图像的视觉无损固定比特率压缩。

我们现有的压缩方案,Arm 帧缓冲区压缩(AFBC),是一种无损压缩。这意味着,如果应用程序遵循有关API使用的最佳实践指南,我们可以透明地启用它。然而,由于它是无损的,因此压缩比是不可预测的。对于类似游戏的图像,我们通常使用AFBC实现大约2:1的压缩,但驱动程序必须假设没有压缩,并且始终为全尺寸图像分配足够的存储空间。

相比之下,AFRC是一种有损的固定速率压缩,允许高达4:1的压缩比。与AFBC相比,这使平均压缩比增加了一倍。固定速率的特性还意味着驱动程序可以保证较低的存储需求,从而与压缩比成比例地减少图像内存占用。AFRC可用于1-4个分量的每个分量的8位UNORM图像,同时支持线性和sRGB颜色格式。下表显示了今年Arm Immortalis-G715中可用的压缩比。

AFRCCompRatios.png-640x0.png

显而易见的问题是,“视觉无损”在实践中意味着什么?好消息是,尽管压缩是有损的,但所获得的图像质量非常高,具有良好的硬边缘和色度转换保存。即使使用最高压缩比side-by-side比较两个图像(高分辨率图像 https://community.arm.com/resized-image/__size/1265x720/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/Comparison.png),也很难看到差异。

immortalis pic 5.png-640x360.png

因为这是一种有损压缩方案,所以应用程序必须在per-image的基础上启用它,对于应用程序管理的图像使用VK_EXT_image_compression_control,对于swapchain管理的图像则使用VK_EXT_image_coempression_concontrol_swapchain。

DRAM内存访问是应用程序最耗电的操作之一,因此有效使用内存对于延长电池寿命至关重要。在现代高端内容中,中间渲染到纹理过程及其随后作为纹理的使用,通常是帧内存带宽的最大贡献者。我们认为AFRC的高压缩比是提高应用能效的重要因素,因此鼓励您尝试一下。

AFRC最佳实践

AFRC格式遵循与我们的AFBC格式相同的用例设计。它只能在片段路径上用于压缩,并使用纹理单元进行解压缩。要允许使用AFRC,图像必须符合以下API使用限制:

  • 必须使用VK_IMAGE_TLIING_OPTIMAL
  • 不得使用VK_IMAGE_USAGE_STORAGE_BIT
  • 不得使用VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT
  • 不得使用VK_IMAGE_CREATE_ALIAS_BIT

请注意,AFRC可能并不总是最有效的格式选择。由于固定的比特率,它总是提供最佳的内存占用空间,并保证在最坏情况下减少带宽。然而,如果压缩的图像非常简单,则AFBC可以在带宽方面胜过AFRC。对于写入高比例简单块颜色的渲染过程,您可能会发现AFBC提供了最佳的内存带宽效率。

着色器核心性能

任何GPU的关键都是着色器核心,今年推出了迄今为止最节能、性能最高的着色器核心。Immortalis-G715内核是Mali-G710内核的进化版本,在各种应用中平均性能提高了15%。

可编程内核的最大变化是融合乘累加(FMA)吞吐量的两倍。新的着色器核心支持每个时钟周期128 fp32 FMA或256 fp16 FMA,帮助高复杂度着色器真正发光。此外,子组运算(subgroup)和整数位运算从特殊函数单元(SFU)转移到主流水线中,这为这些指令类型提供了四倍的性能。

我们看到更多着色器使用来自均匀缓冲区和存储缓冲区的间接加载,例如通过材质ID索引特性。这一代硬件为动态扭曲均匀加载和扭曲顺序加载添加了新的优化加载路径。对于这些常见的访问模式,此路径的内存访问速度高达4倍。

我们还对cubemap查找和textureLod()查找的纹理路径进行了改进,具有统一的细节级别,两者的性能都高达2倍。我们已经看到,这一变化大大提高了使用小cubemaps 存储光探测器数据的内容的性能。

其他改进

除了主要功能外,还有一些较小的改进,以帮助提高性能和开发人员体验。根据我们在该领域看到的问题,并利用开发人员和我们的生态系统团队的反馈,对这些问题进行了优先排序。您的反馈确实会产生影响,请继续分享您的想法和遇到的任何问题。

我们继续看到高动态范围(HDR)渲染的稳步采用,其中内容渲染为浮点附件,用于后期处理和色调映射。这一代GPU为fp16格式引入了基于硬件的混合和多样本解析,补充了去年在Mali-G710中添加的AFBC压缩支持。

使用简单着色器对大体积几何体进行绘制调用,最终可能会受到tiler binning
性能的限制。这一代硬件支持速度快三倍的新tiler,使我们能够在位置结果可用于binning 后更快地完成vertex 处理阶段。

同时使用ZS附件的着色器程序,以及使用后期ZS或着色器访问ZS附件,可能会由于错误的依赖性而出现大量stalls。着色器ZS依赖项管理得到了改进,同时使用这两种方法的着色器将显著提高片段着色过程中的核心利用率。

当三角形击中像素但未击中像素内的所有采样点时,基于像素内传统采样点的光栅化可能会为某些技术留下数据漏洞。当使用光栅化来驱动需要无间隙覆盖的技术时,这可能会导致不正确的结果,如集群渲染器中的光平铺或体素化。这一代硬件获得了对Vulkan保守光栅化(VK_EXT_conservative_rasteration)的支持,这为着色提供了两个新的触发条件。如果基本体与像素相交,则高估模式会使整个像素变暗。只有当像素被基本体完全覆盖时,低估模式才会对像素进行着色。

开发人员知道,优化着色器以使用fp16数据类型对移动设备很重要。对于Arm GPU,使用较低的精度可以同时将更多的变量存储在寄存器中,并启用vec2 SIMD算术运算。从历史上看,检查着色器是否有效使用fp16的唯一方法是使用Mali脱机编译器。这一代硬件引入了一种新的硬件性能计数器,它允许您直接测量执行的狭义算术运算的数量。这在我们的Streamline探查器报告中进行了报告。

了解更多信息

这篇博客简要概述了新功能,以及一些最佳实践亮点,以获得最佳性能。为了获得更详细的建议,我们的《Mali最佳实践开发人员指南》(https://developer.arm.com/documentation/101897/)已经更新,包括了Immortalis-G715新一代硬件的所有建议。

来GDC看看我们

如果你参加了今年的游戏开发者大会,那么就来参加博览会吧。我们在South Hall#S550,在那里您可以了解更多关于Arm GPU和我们的Arm Mobile Studio开发工具的信息。你可以看到Arm Immortalis-G715的信息,在内置联发科天玑 9200 的vivo X90 Pro智能手机上运行了多个演示。

推荐阅读
关注数
5756
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息