美文网首页
ARM Mali GPU - Bifrost架构(G71)

ARM Mali GPU - Bifrost架构(G71)

作者: QiHangkong | 来源:发表于2020-05-21 13:37 被阅读0次
Mali GPU

在过去的几年里,SoC GPU领域走出了一条很有趣的路。在开始的十年中,SoC级GPU领域的竞争非常多样,从Nvidia到Broadcom的所有厂商都参与其中,所以SoC GPU领域的整合是不可避免的,而在之后短短的六年间,在高端Android手机中占据主要地位的GPU厂商仅剩2家:垂直集成的高通公司和IP授权的ARM公司。

目前ARM的GPU IP授权已经占据了大量的市场,ARM进入市场的道路是非常传统的,一开始收购了一家不知名的GPU厂商,并且将其发展到现在巨大的体量。ARM在IP许可方面的专业知识,再加上不同寻常的GPU架构是该公司的强大竞争力,使它的产品从高端到低端都很有竞争优势。

ARM快速增长的很大一部分是建立在ARM公司Midgard的GPU架构基础上。 Midgard最初于2012年推出,一直是ARM Mali 600、700和800系列设计的基础。Midgard作为ARM的第一个统一着色设计的GPU,经过多年扩展,可支持几何细分着色器、10bpc颜色等新功能,以及OpenGL ES 3.1 / 3.2和Vulkan等API。

经过4年的发展,Midgard也将结束。在Computex 2016会议上,ARM发布新的Cortex-A73 CPU和最新下一代GPU架构Bifrost。Bifrost是ARM GPU体系结构一次重大的升级,同时也发布Bifrost架构的第一代GPU:ARM G71。

ARM Mali的三代GPU

1. 历史- 回顾Mali和VILW

SoC GPU与分离GPU的发展形成了鲜明的对比,在于分离GPU上出现新的创新和变更将在之后的几年中出现在SoC GPU中。一个主要的原因是制造工艺的升级使这些功能能够适应SoC级别的面积和功耗的要求。同时移动游戏/图形的开发也类似,移动开发的渲染技术也是一开始用在其他地方的技术。

ARM的体系结构的发展也是类似这样的路径。非统一渲染的Utgard架构在2012年过渡到统一渲染的Midgard架构,是在分离GPU首次过度的6年之后。Midgard也是一款非常适合当时渲染特性的体系结构。

Mali Midgard 算数管线

Midgard的着色器核(Shader Core)是以指令并行(ILP,Instruction Level Parallelism)为主的设计,采用的是超长指令字(VLIW)指令格式。为了最大程度地利用Midgard的Shader Core,需要能够提取大量的ILP(4条并发指令),以便填充Shader Core中的所有槽。这种设计非常适合基本的图形工作负载,因为4种颜色分量RGBA非常适合VLIW-4设计的4条通道。此外,VLIW设计是非常节省空间,因为开销相对较少,这就很符合SoC空间严格约束的条件。

回到之前所说的SoC GPU跟随着离散GPU脚步,VILW存在的时间很短。因为较新的渲染特性通常一次只处理1个或2个组件,这就需要去填充空白的通道以实现GPU的充分利用。通常情况下,一个好的着色器编译器可以解决这个问题。但是随着时间的推移,编译器会成为不断升级的技术之战,因为获得良好的性能变得越来越以编译器为中心,而编写可以提取必要的ILP的编译器本身就是一个挑战。历史向我们展示的以及移动市场将再次发生的是,渲染工作负载将继续从适合VLIW的方式向其他方式转移。

2 Bifrost Quad:用TLP取代ILP

随着移动GPU技术的发展,解决方案逐渐向标量处理转移 - 以线程级并行(TLP,Thread Level Parallelism)为中心的体系结构设计。这也正是ARM和Bifrost发展的方向。

Bifrost 特性

ARM延续了以北欧风格命名体系结构的方式,Bifrost是一种以TLP设计为中心的体系结构。在设计Bifrost时,ARM的GPU小组喜欢开玩笑的说他们只是将旧的着色器核心向左旋转了90°。新的设计不会从单个线程中提取4条指令的ILP,而是将4个线程组合在一起并从每个线程中执行一条指令。

Midgard的SIMD 向量化 Bifrost的Quad 向量化

这与AMD在2011年使用Graphics Core Next(GCN)所做的过渡非常相似,此举显著提高了AMD的GPU吞吐量和对现代渲染特性的适用性。对于ARM,我们将看到很多相同的东西。

以TLP为中心设计的优势在于它无需花费大量精力即可从线程中提取指令级并行性。图形渲染本身是一个令人尴尬的并行问题,多年来,屏幕分辨率的提高进一步增加了需要处理的像素(线程)的数量。因此,通过几乎消除对ILP的依赖,ARM GPU可以更轻松地实现其Shader Core的充分利用。

TLP设计的优势有两方面:对于图形,以TLP为中心的设计提高了利用率,尤其是对于只能同时在一个或两个组件上运行的较新的渲染程序。而越来越重要的是TLP设计也对计算更加友好,因为可靠的GPU计算性能已成为现代移动设备中越来越重要的组成部分。

利用率的提高还影响功耗,并最终影响面积效率。结合在其他地方进行的架构改进,Bifrost的平均利用率更高,这意味着设计应具有每mm2裸片空间更好的性能,这也是ARM服务市场的重要指标。该公司的体系结构更新还带来了一些其他方面的好处,例如L1指令高速缓存的带宽需求,这使得高速缓存和Shader Core之间的数据路径更低。

Bifroat 向量化:节省功耗

在Bifrost架构内,ARM将WaveFront称为Quad。顾名思义,它们本身具有4个线程宽度,并且每个时钟周期执行一个完整Quad的一行指令。 Bifrost的WaveFront大小在这里特别有趣,因为Quda的数量比竞争对手架构的小得多,后者通常在16-32线程范围内。一般来说,WaveFront设计反映了在资源/区域密度与性能之间寻求平衡的需求。宽的WaveFront尺寸需要较少的控制逻辑(例如:32个线程具有1个控制逻辑单元,然而4x8个线程需要8个控制逻辑单元),但同时WaveFront越宽,填充难度也越大。

Quad向量化:差异

总体而言,ARM的GPU理念一直致力于避免执行停顿,他们在WaveFront尺寸方面的选择反映了这一点。与较宽的WaveFront相比,通过使用较窄的WaveFront,可以使一组线程不太可能发散(通常是由于条件语句而选择不同的路径)。通常情况下差异也很容易处理(只需沿着两条路径进行),但会影响GPU的性能。

Bifrost 算数功能单元

Bifrost设计的一个特点是整数加法和SFU在同一个SIMD上(FP加法在FMA上)。因为大多数其他体系结构将所有加法和乘法放在同一条管道上。另一方面,这意味着与Midgard一样,Bifrost可以同时执行FMA乘法和单独的加法。这也是Bifrost不仅仅是TLP设计的原因。从技术上讲,ARM正在发布一个融合指令,即稍长指令字(Slightly Long Instruction Word),该字由FMA和ADD / SFU SIMD的单独指令组成。因此,为了最大程度地利用GPU,需要同时填充两个SIMD。因此与其他体系结构相比会对ILP有更大依赖。

同时,在SIMD中,与Midgard一样,Bifrost也能够进行指令分解/融合,这意味着单个SIMD通道可以打包不同的数据类型。对于浮点运算,一个通道每个时钟可以处理1个FP32或2个FP16,对于整数运算,每个时钟可以处理1个INT32、2个INT16或4个INT8。与其他设计相比,这仍然是ARM GPU架构的与众不同的功能,因为它们保持单个ALU,而其他一些供应商则使用专用的FP32和FP16 ALU,这也是在空间和功率效率之间进行权衡的选择。

Bifrost算术单元寄存器

ARM还确认,相对于Midgard,每个管道中的寄存器文件都已扩大。尽管未指定具体大小,但Bifrost的寄存器文件大小是Midgard的两倍。 ARM特别指出,这对于提高体系结构处理长而复杂的着色程序的能力非常重要,因为这些着色器可能会使Midgard上的寄存器文件溢出。

回到上一级,在深入介绍Bifrost之前,让我们先谈谈ARM实际上是如何为Bifrost调度线程的。除了将其着色器核心重组为Quad之外,ARM还增加了对一个有趣的功能支持,称为Clause。简而言之,Clause是一种受限制的WaveFront。Clause背后的设计思想是通过定义相关指令顺序的其他要求,并识别具有可变延迟的指令,ARM可以减少指令调度的开销。

Clause指令的执行

当WaveFront由编译器组织成Clause时,该WaveFront内的指令将获得一定的执行保证。所有指令的等待时间都是已知的,它们会依次执行到Clause末尾。从本质上讲,Clause是编译器知道的从头到尾运行而无需检查的绝对安全的指令块。

Clause执行

使用Clause的好处在于:由于Clause具有执行保证,因此GPU调度程序可以避免频繁检查Quad执行引擎的开销,只有在完成Clause后才返回对其进行检查。这种开销减少则可以节省功耗。

Bifrost的好处并不止于此。当执行Clause时,Bifrost可以将需要连续访问同一寄存器的指令链接在一起,并且在某些情况下会绕过该寄存器访问。从功耗的角度来看,寄存器文件的访问相对昂贵,因此避免使用寄存器文件是另一种节省功耗的方法,最终它使ARM可以使用更简单的寄存器文件。

Clause执行

ARM将此实现称为临时寄存器,尽管它更像是一种助记符,而不是真正的寄存器,但其基本思想是将指令的结果立即馈入下一条指令的输入中。这种数据馈送的性质意味着它只能在一个Clause中发生,因为结果只能用于单个周期。这就是为什么临时寄存器实际上是临时的。数据必须在下一个周期使用,否则将丢失。

最后,ARM还说明了Clause是如何针对可变延迟指令(例如纹理访问)工作。Clause中允许进行可变等待时间操作,但只能在Clause的边界进行。本质上,可变等待时间操作将Clause分为两部分,访问标记为Clause的结尾,而使用访问资源的操作则标记为另一Clause的开头。

Clause调度

通过以这种方式拆分Clause,ARM能够围绕这些可变等待时间操作调度Clause。当Clause的后半部分尚未准备好开始时,可​​以将另一个不相关的Clause插入到Quad中。交错Clause是一种用于隐藏延迟的解决方案,因为它允许Quad在等待高延迟操作的同时保持与其他工作的活动,每个Clause/WaveFront都覆盖了其他Clause的延迟。在ARM的情况下,由于引入了Clause,Bifrost仅向前迈了一步,更严格地定义了何时进行交织。总体而言,ARM可以交错多达8个这样的Clause流。

Bifrost核心:解耦

我们了解了单个Bifrost核心的逻辑设计。到目前为止,我们已经在Quad(执行引擎)级别上叙述了我们讨论过的改变,ARM对体系结构其余部分的工作方式以及所有这些如何整合在一起进行了许多更改。

首先,一个Bifrost Core包含3个Quad执行引擎。这意味着单个Core可随时执行多达12(3*4)个FMA,分布在上述3个Quad上。这些Quad依次由Core的线程管理前端(现在称为Quad管理器)提供,该前端与其他前端结合在一起使整个Core的所有功能单元都能正常工作。

Bifrost Core设计

正如我们现在看到的Quad执行引擎一样,有的读者可能已经注意到,执行引擎非常稀疏。它们包含ALU,寄存器文件以及其他内容。在包括Midgard在内的大多数其他体系结构中,执行引擎中组织了更多的功能单元,而Bifrost并非如此。取而代之的是,Load/Store单元,纹理单元和其他单元已从执行引擎中取出,并作为单独的单元沿着控制结构放置。

与从Midgard相比,随着从ILP到TLP的转变,这是Bifrost更为重要的变化之一。就像TLP转移一样,大部分变化是由资源利用率驱动的。这些单元的使用频率不如ALU,尤其是随着着色器程序长度的增加而更是如此。因此,与其将这些硬件单元放置在执行引擎中而且有可能不能充分利用它,ARM将它们移至整个Core共享的单独单元中。

Load Store 单元

现在的一个风险是对于这些资源的争夺,但实际上,这并不是什么大问题。相对而言,这与NVIDIA SM设计相似,后者的多个ALU块共享Load/Store单元、纹理单元。同时这样也能简化Shader Core的设计,因为只有少数几个单元具有访问L2缓存数据的路径,并且所有这些单元都在执行引擎之外。

总体而言,这些独立的硬件单元与Midgard没有明显不同,这里最大的变化仅仅是他们与执行引擎的脱离。例如,纹理单元仍提供与Midgard相同的基本功能集和吞吐量。

同时,与Midgard相比,已经进行了重大改进的是ARM的几何子系统。 Bifrost仍使用分层的Tile将几何体合并到Tile中以对其进行处理。但是,ARM在此方面做了很多努力,以减少tiler的内存使用,因为高分辨率屏幕和更高的几何复杂度推动了tiler的内存使用,最终影响性能和功耗效率。

Bifrost 在Tile上的改变

Bifrost实现了一种更细粒度的内存分配系统,该系统也完全不需要最低的分配要求。通过减少原本过大的缓冲区的开销,可以降低内存消耗。

更重要的是ARM已在Bifrost中实现了微三角形丢弃加速器。通过消除早期看不到的亚像素三角形,ARM不再需要将这些三角形存储在tiler中,从而进一步减少了内存需求。总体而言,ARM报告说,Bifrost的tiler更改正在减少多达95%的tiler内存消耗。

与此类似,ARM还针对顶点着色内存消耗进行了优化。 Bifrost的新增功能是ARM称为Index-Driven Position Shading的功能,该功能利用了前面提到的一些tiler更改来减少在那里消耗的内存带宽。根据ARM的估计,假设仅可以优化流程的某些步骤,那么用于位置阴影的总带宽节省将达到40%左右。

Index-Driven Position Shading

最后,在渲染管线的另一端具有Bifrost的ROP,或者如ARM所标注的那样,是混合单元以及depth & stencil单元。尽管这些单元的方向与纹理单元的方向类似(此处没有大的改动)。ARM已经确认Bifrost的混合单元确实提供了Midgard所没有的一些新功能。 Bifrost的混合单元现在可以处理FP16目标,而Midgard仅限于整数目标。包含浮点混合不仅可以节省ARM的转换(Midgard必须将FP16转换为整数RGBA)而且FP16混合意味着还应该提高精度/质量。

FP16混合的吞吐量为1像素/时钟,就像整数混合一样,因此它们是全速的。需要注意的是,Bifrost的ROP硬件确实会随着内核数量的增加而扩展,因此,架构的几乎每个方面都将随着更大的配置而扩展。鉴于Mali-G71可以扩展到的水平,这意味着当前的Bifrost实现可以达到32px/clock。

Mali-G71

现在我们已经了解了Bifrost的Core的结构,是时候来看一下全局了。 Bifrost将要使用的第一个ARM GPU设计是高端的Mali-G71 GPU。

Bifrost GPU设计

像其他Mali设计一样,G71专为可变数量的着色器核心而设计,总共多达32个。这给ARM的客户提供了很大的可扩展性,并且ARM自己的幻灯片显示从G71MP4一直到完整的G71MP32的设计范围是8倍。同时,目前尚不完全清楚,至少在当前的流程上,全尺寸32核设计是否适用于移动设备。在这方面,Mali的核心数量可扩展性往往非常具有前瞻性。

Mali的可扩展性

将各种着色器核心连接在一起是Bifrost的新控制结构。新结构与我们讨论的核心设计的早期变更紧密结合,从而改变了将各种单元在结构上的布局。异构计算也有一些含义,我们稍后再讲。

同时,架构的另一端是G71的L2缓存子系统。与Midgard相比,L2缓存现在是单个逻辑L2缓存,而不是以前的完全分段缓存。此外,对缓存进行了一些重新设计,以减少刷新到内存中的部分行的数量。 LPDDR4使得分行成为一个更加紧迫的问题,LPDDR4引入了更大的预取大小,从而对分行的容忍度更低。

但是,这里最大的新闻是L2高速缓存适合ARM生态系统的整体情况,它将连接到SoC一致性互连的位置,例如ARM的新型CoreLink CCI-550互连或第三方专有互连。总体而言,G71现在为互连提供多达4个完整的ACE接口,而Midgard上只有两个ACE Lite接口。总而言之,得益于GPU级别,架构级别,缓存级别和互连级别的体系结构更改的组合,G71提供了与系统其余部分的完全缓存一致性。所以,当与合适的CPU内核配对时,G71能够进行异构计算。

存储系统

ARM表示打算在一段时间内逐步提供异构计算功能,而G71则是他们发布的首款支持该功能的GPU。这里的实现允许进行完整的“细粒度”计算,这意味着CPU和GPU都可以看到彼此的缓存,从而最大程度地提高了异构计算的潜在性能。

共享的虚拟内存

从软件的角度来看,有趣的是ARM采用了以OpenCL 2.0的方法,旨在通过该API和相关的(利用SPIR-V的)API(例如Vulkan)来访问该功能。尽管ARM是HSA基金会的成员,但G71不支持异构系统体系结构的HSAIL标准。 ARM在此问题上没有太多话要说,但表示他们从未“完全收购” HSAIL。相比之下,OpenCL 2.0是API级别上的一种更通用的实现,使ARM可以根据需要整理出低级别的细节。

随着发布的HSA 1.1规范,我回到ARM询问他们新规范是否完全影响公司的异构计算计划,尤其是考虑到其体系结构不支持1.0标准。事实证明,ARM的发展路线与AMD的ROCm平台非常相似:尽管该公司未使用HSAIL,因此从严格意义上来说并不是一个完整的HSA平台,但是他们在开发中使用HSA标准的硬件。

在硬件级别,HSA规范对硬件的​​多个方面进行了标准化,以实现通用的互操作性和更轻松的编程目的,包括信号,队列,浮点数处理以及有关异构执行应如何工作的其他低级细节。这与HSAIL是分开的,后者更关注异构编程的软件方面,尽管有用,但对于异构计算不是必需的。因此,虽然Mali-G71在技术上不是HSA平台,但实际上它是HSA硬件,它使用HSA规范作为一种为异构计算提供通用且易于理解的执行模型的手段。因此,ARM非常重视HSA的使用-实质上是提供第一个非AMD HSA 1.1硬件设计之一-即使他们本身并未使用HSAIL。

下一代异构计算

在这一点上,异构计算对于ARM来说仍然是长期的工作。在正确的情况下,潜在的性能改进非常重要。当有很多合适的并行工作要使用GPU时,使用GPU代替CPU再次是一个不错的选择,尤其是在功率效率至关重要的SoC中。但是,招募软件开发人员需要时间,因此虽然硬件即将推出,但赶上软件还需要一些时间。

Vulkan

也就是说,该过程的很大一部分将自然地迁移到更好地支持异构执行的更新的API。 ARM当然在Vulkan支持方面发挥了重要作用,虽然Vulkan首先是图形API,但随着图形和计算之间的界限越来越模糊,它也被纳入其计算计划中。即将发布的Vulkan 1.1规范旨在引入一些新的计算功能,这些功能将进一步弥合Vulkan 1.0和OpenCL 2.x之间的差异,而ARM将会准备利用它们。

但是,无论对计算有何影响,ARM都认为Vulkan对于软件开发的长期发展至关重要。 Vulkan较低的开销充分影响了移动设备的功率和散热需求;不必要的CPU工作不仅会消耗功率,还会吞噬可能留给GPU的散热空间。因此,期望在接下来的几个月中看到ARM与G71一起更加努力地推动Vulkan。

像ARM相关的Cortex-A73公告一样,今天的Mali-G71披露要比实际的芯片可用性要早。为此,ARM的许多预测都是基于制造过程的早期原型制作和架构仿真,尽管在后期,这些仿真往往非常接近。

Mali G71

ARM的G71官方编号要求它在能耗和密度方面都比同进程Mali-T880进行重大改进。对于前者,ARM期望G71的能效比T880好20%,而对后者的性能密度则要高40%,换句话说,相同的性能将使芯片空间减少40%。

从性能的角度来看,ARM期望基于G71的设备的性能大约是当前T880设备的1.5倍。这是一个有点模糊的指标(在相同的MP配置下,速度没有提高50%),而是结合了制造方面的改进、大量着色器核心和Bifrost体系结构的改进。


Mali命名

综上所述,在图形方面,G71的运行方式很像是当前Mali GPU的直接替代产品。 Bifrost是Mali的体系结构更新,而不是功能更新。 G71没有T880不支持的主要图形功能。两者都提供相同的OpenGL ES和Vulkan图形功能。另一方面,异构计算功能对一般计算任务(而不是图形)产生很大影响。

最终,这给ARM带来了重新调整其架构以适应未来的机会,从而更好地与软件开发人员正在编写的内容以及设备制造商的GPU所需的内容保持一致。 Bifrost是新型的现代Mali,基于我们对AMD和其他公司所做的转变,向TLP中心设计的转变将来应该可以很好地为ARM服务。同时,整体性能的提高将使ARM及其客户可以对4K手机和移动VR等产品进行押注,如果这些创新被证明很受欢迎,则可以为他们提供更合适的GPU设计。

图片.png

总结一下,虽然ARM今天只发布了Mali-G71,但该公司显然已为将来的GPU设计敞开了大门。作为高端GPU设计,G71是T880的直接后继产品,但我希望ARM能够及时生产出适合替代Mali T820等的GPU设计。 ARM始于G71,这很好地暗示了未来的发展;未来的Bifrost GPU将使用两位数的G编号方案,因此您可以轻松查看未来的GPU可能插入的位置。

参考资料:

相关文章

网友评论

      本文标题:ARM Mali GPU - Bifrost架构(G71)

      本文链接:https://www.haomeiwen.com/subject/fdlauhtx.html