11

xucvai · 2022年07月08日

Mali-G710开发者概览(二、着色器核心改进)

着色器核心改进

着色器核心进行了大量开发者不可见的改进,这里我们着重介绍其中两个对开发者来说比较有用的改进。

Tile访问同步

第一个改进是对有依赖关系的片段线程调度。这种情况通常发生在不同layer访问同一个像素时,无论是硬件混合操作还是可编程操作(framebuffer fetch,pixel local storage(PLS)或subpass等等)。硬件需要保证着色器获取到正确的数据。具体来说,晚执行的片段在读取之前需要保证没有其它片段在进行写入,并且在写入之前需要保证没有其它片段写入和读取。如果一个片段尝试访问一个被其它片段访问中的位置,这一片段就会被挂起,直到另一片段完成访问。

在旧的Mali架构上,对于color/PLS数据,每个像素位置只有一个依赖追踪。一个片段会在第一次访问tile数据时挂起,直到它成为该像素位置最老的片段,才能访问到tile数据。这对于较为复杂的,在tile存储有多个资源的情况比如多渲染目标(multiple-render targets),OpenGL ES的pixel local storage存储、Vulkan的合并subpass附着,只有一个依赖追踪是不够的,大量片段会被阻塞,导致明显得串行现象,造成shader的执行性能降低。

在Mali上使用PLS或multiple subpasses,因为大量数据交换在tile内进行,可以明显降低带宽需求。但因为layer间保守的依赖处理,导致layer间执行串行化,性能表现可能并不好。

下图给出了图示,可以看出,晚来的layer的访问(橘色)直到之前layer的最后一次tile访问结束前都是挂起的:

新的硬件使用更细的粒度进行依赖追踪,让这种跨layer的访问管线化,只有很少的挂起,对于tile内的数据交换拥有更好的性能。下图图示了新的layer调度方式,新的调度是完全自动的,不需要我们修改任何代码,所以赶快尝试使用片上(tile)着色技术吧!

因为现有的渲染管线改用Vulkan的multiple subpasses技术较为困难,我们提供了一个新的Vulkan扩展VK_ARM_rasterization_order_attachment_access以过去的编程方式使用新的技术,这一扩展在2022年晚些时候在设备上可用。

Bindless资源访问

从2020年发布的Mali-G77开始,我们通过VK_EXT_descriptor_indexing扩展支持了Vulkan的Bindless资源访问。Bindless资源访问允许着色器在运行时通过一个动态索引替代在绘制时绑定的常量数据访问资源。通过Bindless技术,我们可以让材质资源动态化,从而减少draw call的数量,进而减少CPU负载。

最新的Mali驱动对于Bindless的支持已经做了很大改进,减小了同一个warp下索引值动态统一情况下的着色器的bindless查询开销。因为改进主要源自代码改进,所以Mali-G77和Mali-G78设备通过更新驱动,也可以看到这部分的提升。

对于Bindless的最佳实践,没有变化:

  • 尽量减少Bindless索引的差异,在一个warp内使用尽量使用动态统一的索引值。
  • 对于Bindless的buffer,尽量使用SSBO而不是UBO,如果要使用UBO,也应该先考虑使用Dynamic UBO。

帧缓冲压缩改进

新的硬件为fp16渲染目标(render target)引入了AFBC无损压缩支持,对于使用浮点数的HDR渲染管线可以减少帧缓冲的带宽需求。

但需要注意的是,压缩后的fp16附着仍然比紧凑颜色格式压缩后要大。所以如果要求性能最佳,带宽需求低,需要使用32-bpp格式,比如RG11B10f。

总结

Mali-G710进行了大量改进,让开发者们拥有了更大的使用灵活性。期待大家使用新的GPU架构为用户带来更好的体验。

作者:fangcun
原文:知乎

推荐阅读

更多Arm Mali GPU相关技术干货请关注Arm Mali GPU技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
101
内容数
18
Arm Mali GPU系列相关技术干货
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息