为什么“性能暴涨”?
那么达成这种性能暴涨的原因是什么?Imagination PowerVR产品管理和技术营销高级总监Kristof Beets在接受我们采访时,首先提到的就是“完全重构的ALU(算术逻辑单元),我们对其进行了大量精简,现在其内部就是相当简单、干净的MAD管线(MAD是指乘法累加单元)”,执行单元从过去的2个MAD单元,变为现在的1个MAD(而且还抛弃了Furian架构中的MUL乘法单元),也就是说每个时钟周期单条管线的执行能力实际是下降的——这也是ALU拓宽的重要前提。
A-Series在架构上也因此有了“128条ALU管线同时并行”,也就是128-wide ALU。128线程宽度是什么概念呢?早前的Rogue架构采用的是32线程宽度wavefront(wavefront是GPU代码的最小可执行单元,SIMD过程中数据处理的最小单元,在所有线程中同时执行同一指令,Nvidia称其为warp),不过单个SIMD仅支持16-wide;Furian架构则真正加宽到了32-wide,即单个时钟周期执行32-wide wavefront。
作为对比,Arm Mali G77的SIMD宽度是16-wide,这还是相较G76的一倍拓宽。所以A-Series单就ALU结构来看,显然是独占鳌头的。这也表明Imagination真正开始从指令级并行彻底转往线程级并行(TLP),实现ALU的更高利用率。这么做理论上能够极大提升性能密度。Beets补充说由于管线精简,“compiler也大幅简化了,它只需要在管线中找乘法累加实现100%运算即可,架构中也更容易实现高利用率,是设计中实现性能密度和能效提升的重要组成部分。”
不过有这么宽的ALU,如何改进整个架构的前端,去喂饱这么宽的执行单元就成为一个问题了。前端调度效率低的话,这么宽的ALU管线只会出现大量闲置,以及效率的下降。
针对这部分,Beets在演讲着重介绍了data master(数据管理)——各种不同的data master将工作负载分配到GPU中去,比如有Geometry Data Master负责几何数据管理;还有2D Data Master、3D Data Master,以及Compute Data Master(负责通用型计算数据管理)。这些不同的data master基于内存的命令队列中读取数据,驱动任务负载进入GPU。
比如3D Data Master,还执行一些其他的固定功能预处理,包括HSR(隐面消除,是GPU的核心技术之一)、针对shader的工作负载生成。随后进入到“Triangle Task Merging”(三角形合并)——Beets表示这是一个关键模块;PDS(Programmable Data Sequencer,可编程数据定序器)再对资源进行分配管理,为工作负载和管理任务预留寄存器空间——这个组件能够针对未来的线程从cache中预取数据。
接下来是指令scheduler(调度器)和decoder(解码器),分发解码后才正式进入到执行单元。然后就是128-wide的ALU了,这里值得一提的是,在主ALU管线之外还有一个副ALU线路方案(Secondary ALU),如上图所示。这部分管线仅有主ALU管线1/4的宽度,每周期并行执行32个线程,不过有一些更为复杂的指令,执行任务包括各种操作与迭代、数据转换、超越指令等。Beets表示,在更低的速率上工作,是基于对真实应用场景各种工作负载所做的权衡。“针对ALU结构,我们分析了大量应用,去理解其中的平衡点,实现最高的效率。”
弹性化扩展
以上是对单个ALU簇的大致理解,也是A-Series获得性能暴涨的主要原因。我们往更高层级看一看其架构变化。在多年前的Rogue架构分享中,Imagination曾有一度将每个USC(Unified Shading Cluster)算作一个核心。到A-Series看来,大概已经不能这么算了,因为其性能扩展方式比较“模块化”。
前文谈到的这样一个主体128-wide ALU管线实际就是一个USC。这样一个USC,加上周边的固定功能单元,比如TPU(纹理处理单元)、HSR(隐面消除)、各种针对不同数据的管线(如针对几何数据处理、光栅处理、混合处理等),以及可实现更高层级共享的cache,也就共同组成了一个真正意义上的“核心”,只不过这个核心比较大型。下面这张图就是一个完整的核心,在A-Series的弹性架构中构成真正的、完整的一个IP方案。
在AXM 8-256方案中,这样的一个GPU“核心”内部有一个ALU簇(即一个USC),一个TPU纹理处理单元,以及其他专用单元。而在更高配置的AXT 16-512产品中,一个“核心”则包含了两个128-wide的ALU簇(达成每个时钟周期512次浮点运算),两个TPU(达成每个时钟周期采样16个双线性过滤texel)。
作为对比,Mali G77标称每个时钟周期 64 FLOPs、2 texels,也就是说一个AXM 8-256核心就相当于8个Mali G77核心的性能水平。这其实也表明了Mali仍在走GPU的小核心、多核心路线,而Imagination在走宽核心路线。
而如果是性能更高的AXT 32-1024,就是将这样一个GPU核心“复制”一份,实现性能翻番;那么达到最高配的AXT 64-2048实际上就是四个这样的核心。与此同时,针对各种单元的调度和监控,有一个小型的固件处理器(firmware processor),这一点将在后文中进一步提及。
Beets说这样的弹性架构,可以方便地选择性能提升,或者通过减少并行管线、纹理单元的方式,实现符合自身应用所需的配置。
尤为值得一提的是,他特别列举了各种操作类型在流经GPU时的全套逻辑。比如上面这张图就是几何图形处理过程(geometry processing flow)的例子,绿色模块表示的是需要处理这些数据和操作所涉及的模块,箭头则表示整个流程方向:GPU获取到内存中的命令结构,Geometry Data Master首先检查内存中的命令队列,获取命令并将工作负载推到GPU内部;随后读取几何图形,各种各样的三角形就会填充到cache中,再进入几何图形管线(geometry pipeline),之后流经ALU,返回的结果还需要进入到Tiling Engine(因为Imagination的GPU IP是典型的Tile-based Rendering基于块渲染的架构),将这些三角形转换至应用于屏幕不同的tile区域,最终输出到内存。
不同类型的操作,整个流程及涉及的模块会有差别,比如像素处理对应3D Data Master,后续要做隐面消除、计算像素渲染等;还有比如一些内部操作(housekeeping operations)、2D操作等等。上图是像素处理流程(Pixel Processing Flow),以紫色示意。
全栈并发的HyperLane技术
以上提到的这些各类别操作,可以通过一种名为“HyperLane”的技术做硬件级并行,这也是Imagination这次随同A-Series GPU IP发布的一种技术。这种技术对内存做完全隔离,多任务同时提交给GPU,实现GPU的多任务执行,或者说GPU硬件的“全栈并发”。典型的比如说图形计算和AI计算同时进行。
实际针对前文提到的各种不同类型的操作,HyperLane可将GPU的所有任务负载切分成(subdivide)几份,这其中不仅包括了物理层面的隔离切分(模块层面的并发),还包括按照时间切分做负载资源切换。不同的Data Master可以同时保持活跃状态,在整个GPU硬件资源之间进行动态的工作执行,每个时钟周期不同的模块可以执行不同的任务,ALU可以做Compute操作、像素操作、几何图形操作、2D操作等。
多种颜色表示HyperLane激活的多种操作正在同时进行
另外,HyperLane还有优先级机制,Evans说:“比如有客户希望,在同时执行任务的时候,确保图形计算性能不会受到AI工作负载的影响,那么就可以调高图形计算优先级,即便芯片正在处理复杂的AI任务,图形性能也能被保护起来。”这部分操作需要借用到这次IP架构中的固件处理器(即前文提到的firmware processor)。
HyperLane技术包含了动态的8路切分(eight way split/multi-tasking),也就是至多8条hyperlane。“所有工作同时进行,在硬件层面完整隔离和实现虚拟化,硬件级别的高级调度机制实现灵活性。”
HyperLane的一个副产品是内容保护,每条hyperlane都是隔离的,彼此之间的内容就能实现隔离。Evans说:“比如有个流视频应用,带DRM,那么内容在整个GPU中都是完全隔离起来的,在多任务环境中受到保护。”这也算是种安全防护方案了。
Imagination PowerVR产品管理和技术营销高级总监Kristof Beets