xucvai · 2022年07月07日

Mali-G710开发者概览(一、新的GPU前端)

太长不看版:

可以考虑在移动端使用Vulkan的Secondary Command Buffer,IndirectDraw特性。

tile大小从16x16变成了32x32!

多了一条硬件compute队列。

IDVS的多视图支持,或许对VR应用有用。


原文链接:https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-blog/posts/mali-g710-developer-overview


新的Arm Mali-G710 GPU进行了很多硬件上的改进来提升渲染性能。基于这些改进,我们之前提出的最佳实践也要进行修改。本文的主要内容就是对这些改进进行说明,帮助大家最大程度地利用硬件能力。

架构概览

新的GPU架构和之前Mali GPU架构看上去结构上相似。

GPU前端(GPU Frontend)负责将驱动提交的任务分发给对应的GPU处理单元。Tiler负责协调顶点处理,进行图元分配,驱动Mali的基于瓦片的渲染架构。然后是一个或多个可以处理所有类型着色任务的着色器核心。最后是一个或多个用来存储外部数据的二级缓存。总之,结构上看上去和之前的Mali GPU类似。

但实际上,有两个较大改进没有在硬件结构图上体现出来。

更大的着色器核心

最明显的改进是使用了一个更大、更快的着色器核心,吞吐量是之前的Mali-G78 GPU两倍。新的着色器核心每时钟周期可以执行64次32位FMA计算(浮点乘加计算),8次双线性纹理采样,4次片段混合,4次像素写入。为了充分利用高性能着色器核心,现在着色器核心支持2048个线程,Tile的大小也增加到了32x32像素。这是自2005年以来,Mali GPU首次增加Tile大小!

更大的着色器核心意味着达到之前相同的性能要求所需的着色器核心数量更少,也意味着散热性能更好。

新的GPU前端

第二个明显改进是使用了一个全新的GPU前端(为驱动程序提交任务给GPU提供的硬件接口)。新的GPU前端使用指令流前端(Command Stream Frontend,CSF)替代了之前Job Manager(任务管理器),让程序有了处理硬件指令流的能力。

驱动程序写入指令流(包含状态更新,渲染请求,同步操作等指令)到可以被程序和GPU硬件共同访问的着色器内存缓冲区。CSF处理驱动程序写入的指令流,提交任务给GPU硬件队列,保证指令的执行顺序正确。

指令流前端(The Command Stream Frontend)

CSF的使用为开发者带来了多个明显提升。

更低的驱动代价

驱动程序的CPU使用因为CSF而明显减少。几乎所有高频的,每绘制使用的指令都可以作为指令流处理,驱动只需要每次绘制更新状态变化,不需要重新发送整个状态。CSF可以处理大部分的流调度和同步,减轻了驱动的负担。驱动所减少的CPU使用,开发者可以用来省电,或是用来进行更复杂的计算。

流操作

CSF的使用让Mali可以原生支持Vulkan假定是硬件在执行指令流的那部分。

新的GPU硬件可以直接执行secondary command buffer的内容,并且可以正确处理与之相关联的状态。而在之前,我们的最佳实践是最好不用secondary command buffer。

新的GPU硬件原生支持OpenGL ES和Vulkan的间接绘制(indirect draw)和计算任务(compute dispatch)分发。对于Vulkan,Mali现在支持vkCmdDrawIndirect使用drawCount大于1的参数,vkCmdDrawIndirectCount在运行时使用来自缓冲中的drawCount。而在之前,我们的最佳实践是尽量不要用间接绘制(indirect draw)。

新的硬件队列

GPU前端的最后一个改进是使用了一个专用的计算任务队列,也就是说现在硬件有了3条队列,CSF会向这3条硬件队列提交任务:

  • 计算任务队列(Compute workload queue)
  • 顶点和分块任务队列(Vertex and tiling workload queue)
  • 片段任务队列(Fragment workload queue)

顶点和计算任务使用不同的队列,可以让一些本身没有依赖关系,但因为硬件缘故不能并发(并行)的操作可以并发(并行)执行。这也允许开发者使用我们的Streamline分析器区分两种类型的任务进行分析。需要注意的是,这里是硬件队列和Vulkan队列是两个概念,暴露给Vulkan的队列API是没有变化的。

几何管线改进

Mali-G71和Bifrost架构引入了IDVS管线(optimized index-driven vertex shading,优化后的索引驱动顶点着色)。IDVS技术将顶点着色过程分为位置(position)和非位置(non-position)两部分,非位置部分只在顶点经过剔除后可见时执行。IDVS在大多数常见的渲染操作上已经被使用,但在一些情况下需要回退到过去单一的顶点着色过程,无法使用IDVS。

Mali-G710对IDVS的支持进行了改进。支持Vulkan的layer渲染和OpenGL ES的多视图渲染时顶点着色器产生多个位置(postion)信息时的IDVS。对于AR和VR这类需要渲染多个视图的应用场景可能会有不错的性能提升。为了获得最佳的IDVS性能表现,推荐开发者将顶点位置属性和其它属性分开,紧密地将所有顶点位置属性放在一起,让位置计算尽可能地利用缓存。这样做也明显得减少了顶点带宽需求,即使精心布置的场景,通常也会有一般的图元会在正面/背面剔除时被剔除,而IDVS提前避免了大量这种浪费。


作者:fangcun
原文:知乎

推荐阅读

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