本文翻译自: https://www.anandtech.com/show/14385/arm-announces-malig77-gpu
温馨提示:由于译者能力有限,所以读者最好参看原文。当然也可以看完译文再看原文,也许有所帮助。
Arm在2019年5月推出了最新的Valhall架构,一起发布的还有最新的GPU:Mali-G77。距离上一代Bifrost架构的发布,已经过去了三年。
Mali-G77之前的Mali-G76对Execution Engine做了重大改变,而Mali-G77继续对其进行了大幅改动。
Bifrost回顾
众所周知,过去几年Arm的GPU IP供应并不是很好。
Bifrost是Arm2016年推出的GPU架构,一起推出的GPU是Mali-G71。
Bifrost是Arm的第一款标量架构的GPU(scalar GPU architecture),而之前的Midgard采用的是向量指令设计(vector instruction design)。这种改变是根本性的改变,类似于AMD推出GCN架构、NVIDIA推出Tesla架构。
不幸的是,Bifrost的前两款GPU,Mali-G71和Mali-G72的表现并不好。HiSilicon和Samsung作为排名前二的IP购买者,集成了这两款GPU的SOC之后,表现令人失望。麒麟960和970的表现尤其差,这对华为荣耀的产品计划和市场也产生了一定的影响。
Bifrost的最后一代GPU(Mali-G76)是一次重大的改变,因为它解决了前代的很多严重的问题。这在Exynos 9820和麒麟980上都有所体现。
在Bifrost忙着修正GPU的问题时,竞争对手们也没闲着。高通的Adreno GPU已然称霸移动GPU市场好几年,尽管今年推出的Adreno 640没有什么令人印象深刻的提升,但其各方面仍然碾压Arm的GPU。更值得一提的是,苹果集成在A12中的GPU性能已经超过高通最好的GPU,更别提Arm的了。
Valhall的主要改进
Valhall,来自古老的挪威语:Valhöll,也就是Valhalla,北欧神话中死亡之神奥丁款待阵亡将士英灵的殿堂。
Valhall推出了新的指令集架构(ISA)和计算核(compute core)以解决之前Bifrost架构的缺陷。
Valhall架构的第一款GPU是Mali-G77,它的很多改进我们将在后文中逐一介绍。
Mali-G77(Valhall)相较于Mali-G76(Bifrost)能耗效率提升了30%;性能密度提升了30%;机器学习的性能提升了60%.
Valhall:新的指令集架构
Valhall架构的核心是执行核(execution core),与之前Bifrost的执行核相比,Valhall做出了重大的改变。相同的是Valhall还是标量设计,不同的是Bifrost的执行核是4线程或者8线程的设计(narrow 4 and 8-wide design),而Valhall采用了类似于桌面级GPU的设计,具体在下面介绍。
在Bifrost的第一代GPU中(Mali-G71、Mali-G72)执行单元由一个四线程宽的标量SIMD单元(a 4-wide scalar SIMD units)组成,Warp/Wavefront的大小也是四。在G76中,变成了两个四线程宽的标量SIMD单元,而Warp/Wavefront的大小也提升到了八。
Bifrost设计中采用这种四线程大小的Warp和四线程宽度的SIMD单元的出发点是减少ALU空闲的时钟数。这样做使得后面的任务无法及时填充更多的线程,从而warp中线程的数量也提不上去。这样做的好处是,提升了ALU的利用率,虽然是以更多的控制逻辑为代价。
但是随着时间的推移,计算任务(wrokload)不断增加,Arm的这种实现方式不太管用了。如今的很多游戏,其计算量不断增加,尤其是近两年,原先在PC上的游戏都能在手机上看到了。
随着着色程序计算复杂度的不断提升,给Warp设置更多的执行线程也变得更加合理。对于Valhall而言,16个线程为一个Warp,这虽然比不上NVIDIA的32个线程,亦或者是AMD的64个线程,但与Arm自己之前的4个线程已经提升了许多了。
Valhall也改变了ISA。简化了很多指令。当前没有这方面的详细资料,但是可以知道的是,新的ISA对编译器更加友好,而且与Vulkan的契合度更高。
Valhall之前的Bifrost和Midgard的一个核里面包含三个执行引擎(Execution Engine)。每个执行引擎都有独立的datapath控制逻辑、调度逻辑、指令Cache、寄存器文件和消息处理模块,这些自然就产生了很多重复的芯片逻辑。而且执行引擎的数量是不可配置的。
Valhall将之前的三个执行引擎合并成了一个大的,共享控制逻辑。然而,新的执行引擎仍然有重复的部分:ALU的流水线分成了两个簇(cluster),每一个簇由十六线程宽的FMA单元以及其他执行单元组成。
与Bifrost的指令集相比,Valhall的新的指令集更加规整,摒弃了Clause、Tuple以及fixed issue scheduling(不知道怎么翻译)。
Bifrost中,指令调度交给了编译器来做,编译器将指令组织成Clause的结构,这中做法挺有成效,因为有效降低了延时和优化了数据访问,但这给编译器增加了不少的负担。
Valhall中,指令调度完全由硬件完成。通常乱序执行的CPU都是这么做的。这种方式也使得ISA更加独立于GPU执行核的微架构实现,这是更具前瞻性的一种选择。
新的指令集还重点优化了纹理相关的指令。这与新的架构很大程度提升了纹理处理能力是相关联的。
其他的变化包含改进已有的技术、数据组织方式,比如几何处理流程、AFBC(Arm frame-buffer compression)等。
我们进一步来看Valhall的Execution Engine,它可以分为四个部分:
- 前端(Frontend)。包含warp调度和指令缓存
- 两个完全相同的data path cluster,成为处理单元(Processing unit)
- 消息处理模块。与Load/Store等其他固定功能模块连接
前端最多支持64个Warp,也就是1024个线程。每个处理单元有三个ALU:FMA、CVT(Convert)单元和SFU。FMA和CVT都是十六线程宽的处理,而SFU是四线程宽的处理。
前端负责创建和销毁(retire)Warp、维护执行过程中的一些状态。前端中的调度器负责决定那个Warp中的哪条指令可以执行。
前端的指令缓存是共享的。它是四路组相连的结构,共16KB大小,可以存放2048条指令。一个时钟可以发射四条指令。
处理单元(Processing Unit)有4个取指模块,每个取指令模块都绑定了一个寄存器文件以及一个前向缓存(Forward Buffer)。前向缓存用来减少访问寄存器文件的延迟。
FMA(Fused Multi-Add)单元每个时钟可以处理16个单精度的乘加操作、32个半精度、64个八位的点乘操作(dot-product)。
CVT(Convert)单元负责基本的整型操作、数据类型的转换、分支处理(serves as the branch port)。
SFU(Special Function Unit)采用四线程宽度而非16线程宽的的原因是,它处理的指令很少被用到,不需要很大的数据吞吐率。
Mali-G77和Mali-G76的执行引擎相比,把三个归并成了一个。这个大的引擎增加了主要数据通路的数量,减少了控制逻辑和指令缓存的数量,提升了芯片面积的利用率。
ALU的数据通路(datapath)由原先的八时钟深度变为四时钟深度,提升了性能。
总的来说,新的核的发射类似于超标量。这也是为什么编译器会简单很多的原因之一,编译器不再需要去找可以并行发射的指令。
Mali-G77的微架构
前面提到执行引擎(Execution Engine)负责算术运算,而执行引擎只是执行核(Shader Core)的一小部分。执行核的设计整体来说和之前的保持一致,但是有几个地方仍然做了重要改变。
执行核仍然由以下部分组成:
- Execution Engine,执行引擎
- Load/Store单元,里面包含了Cache
- Attribute Unit,属性单元
- Varying Unit,插值单元
- Texture Mapping Unit,纹理映射单元
- Pixel Backend,像素后端处理,由一些固定功能的3D处理硬件单元组成
最大的改变是纹理单元。G76已经将吞吐量提升了一倍,G77在G76的基础上又提升了一倍。
站在整体功能的角度来看,新的TMU(Texture Mapping Unit)似乎并未改变多少,但站在吞吐量的变化的角度来看,改变其实是很大的。
TMU的设计围绕着纹理缓存的命中和失靶两种情况。命中情况下的时延是经过优化的,会比较短。
纹理Cache大小是32KB,吞吐量为每个时钟16个纹素。纹理过滤也进行了改进,对于双线性过滤每个时钟可以处理4个纹素,对于三线性过滤每个时钟可以处理两个纹素。这都是G76的两倍。
在性能提升了两倍的前提下,TMU所占芯片的面积还和之前的基本保持一致,这也是很难得的。
与之前的性能提升思路不同,Valhall并不仅仅专注于提升ALU的计算能力,而是在纹理单元的性能提升上下足了功夫,这也与在渲染中越来越多的纹理任务相契合。
需要注意的是,虽然纹理过滤的吞吐能力翻番了,但是像素后端的吞吐能力并未改变。一个执行核(Shader Core)每个时钟可以输出两个像素,而每个时钟一个执行核可以输出4个纹素,也就是纹素和像素的比值为2:1。在之前的设计中这个比值为1:1
Load/Store中的Cache也做了改变,提升了吞吐量。在相同面积的情况下,pipeline的阶段数减少了一半,减少了核的操作延迟。带宽提升到了一个Cacheline的宽度,是之前架构的两倍。
Load/Store中的Cache大小为16KB,四路组相连的结构。据说对处理机器学习相关的任务很有用。
可以看到,Arm的Shader Core的个数是可配置的,配置的范围是1到32个。但G77目前只支持最多配置16个。Arm目前提供的IP(RTL ready)中最少的核的个数是7个。
L2 Cache的数量也是可配置的,最多可配置四个,每个的大小也是可配置的,最小256KB,最大1MB。大多数的供应商将其L2 Cache配置为2MB,目前应该没有配置为4MB的。
L2 Cache与Load/Store之间的数据带宽从每时钟32B提升到了64B(一个Cacheline的大小)。而L2 Cache和AXI接口之间的数据带宽取决于供应商将其实现为128比特宽度还是256比特宽度。
Performance Targets: 30% Better PPC and Efficiency
从资料上看,Valhall架构确实改进了许多,但我们更应关注的是性能、效率和面积上的数据。
比较有趣的是,Arm发布的性能数据的单位是每平方毫米的性能提升。这是因为Arm的GPU IP是可配置的,不同配置的GPU的性能无法对比。
G77与G76相比,每平方毫米的性能提升为1.2到1.4倍。G77与G76的Shader Core的大小基本一样。
Arm特别声明了G77对于纹理操作较多的场景渲染表现地非常好,所以特别期待基于该GPU IP的设备的实际表现会怎样。
另一种提升GPU性能的方法是提高它的时钟频率。将GPU芯片封装到智能手机中之后,对功耗的最基本的要求是4-5W。据说,G77在完成同样的工作任务的情况之下,功耗降低了17%到29%。也就是说,每瓦的性能提升了1.2到1.39倍。Arm还声称G76和G77的时钟频率不会变化太大,大概在850MHz。
Arm预计明年搭载G77的SoC会有1.4倍的性能提升。如果拿搭载G76的Samsung’s Exynos 9820作为参考,这意味着明年搭载G77的SoC的性能将接近苹果A12的GPU性能,并且功耗表现更加出色。这将让高通陷入比较尴尬的境地,因为这很明显超出了高通最新的Adreno 640。当然,我们也希望高通能够迅速推出新一代的GPU。
机器学习的性能是G77值得自豪的点。G77在机器学习方面的性能是G76的1.6倍。这得益于在核中多加入了33%的处理单元、大幅优化的Load/Store、数据带宽的提升。
Arm将Valhall与其之前的两代架构做了个大致的对比。在相同处理任务和相同性能的前提下,功耗效率的提升同比(year-to-year)增长30%,G77比G72的功耗减少了50%。
总结
Arm此次激动地宣布了新一代GPU Mali-G77以及新一代架构Valhall,因为相比于以前Arm的GPU IP,这是一次较大的飞跃。
Valhall对Execution Core做了根本性的改变,旨在与桌面级的GPU架构对其。这是一次期待已久的转变,G77已经称得上是一个非常好的GPU,而之前的G71和G72不是。
如果资料上所述没有问题的话,G77应该可以在性能和效率上赶上苹果和高通,而且可以赶超高通的当前GPU。