高通 Adreno X2 GPU 架构解析
集成GPU已成为近年来笔记本芯片中至关重要的组成部分,这得益于超便携设备对图形性能的推动。近年来,AMD和英特尔都推出了令人印象深刻的集成显卡。
在当前环境下,高通的笔记本推广需要一块强大的集成显卡,而这正是骁龙X2 Elite的Adreno X2-90登场的地方。
Adreno X2 在骁龙 X Elite 的 Adreno X1 基础上进行了扩展,但带来了旨在提升吞吐量的增强架构。着色处理器(SP)是高通 Adreno GPU 的基本构建模块。
每个 SP 包含一对微着色器处理器纹理处理器(uSPTP),它们包含执行单元、寄存器文件和私有纹理缓存。在更高级层面上,高通将成对的 SP 分组为片。
完全启用的 X2-90 部分有八个 SPs,分为四个片,而 Adreno X1 上则是六个 SP,分为三片。高通还将时钟频率从 1.5 GHz 提升至 1.85 GHz。
更大且时钟更高的 GPU 会对内存子系统施加更大压力,因此高通在内存层级中扩展了缓存大小和带宽。
有了这些变化,Adreno X2的理论计算吞吐量几乎是前代的两倍。它远远不及AMD最高端的iGPU产品,后者涵盖了更多功能。AMD更标准的“Strix Point”芯片可能是更好的对比,但我手头没有,所以我会对一些有趣的设备进行性能比较。
特别感谢华硕提供Zenbook A16进行测试。
着色器处理器与uSPTP
高通的Adreno系列传统上强调基础FP32和FP16操作的高吞吐量。Adreno X2的uSPTPS延续了这一重点,拥有128条FP32通道,似乎被安排成两个执行单元分区。
FP16受益于许多现代GPU上的双倍执行速率。
其他指令类别未必享有同样高吞吐量,但Adreno X2在多个方面相比前作有所提升。INT32 插件似乎能以全速执行,尽管与 FP32 操作相比,理论吞吐量难以接近。
32 位整数乘法执行速度减半,与英特尔和 AMD GPU 架构相比表现良好,且与英伟达保持一致。整数性能总体提升显著,优于 Adreno X1 较差的情况,后者即使是基本整数运算也不到半速。
更好的 INT32 单元也有助于提升64位整数性能,因为GPU通过多次INT32操作实现这些。与之前的Adreno GPU一样,Adreno X2缺乏FP64支持。
使用Nemes基于Vulkan的套件测试显示,计算能力相较于Adreno X1有显著提升。Adreno X2的表现也优于旧款iGPU。如果AMD能使用VOPD双操作指令或wave64模式,AMD Radeon 780M可以实现更高的FP32吞吐量,但Adreno X2在这方面也差不多。
然而,Adreno X2似乎在飞行中需要大量工作才能接近理论计算吞吐量,甚至与AMD Strix Halo等更大GPU相比也难以实现。
OpenCL 对不同派遣大小的实验表明,Adreno X2 在 FP32 加法下可超过 TFLOPS,乘法加法则超过 6 TFLOPS。Adreno X2 只需大约 8 倍的并行性即可达到最大吞吐量。
在 OpenCL 进行大规模调度的进一步测试显示,Adreno X2 在浮点运算中接近理论吞吐量。然而,INT32 的吞吐量几乎没有优于 Vulkan。
Adreno X2 依然缺乏像前代那样的硬件融合乘法加法(FMA)功能。FMA 避免了乘法和加法之间的中间四舍五入,从而减少了数值误差。使用OpenCL内置的fma()函数要求实现这一点会导致吞吐量非常低。
AMD、英特尔和英伟达的GPU都配备了原生FMA硬件,能够在不损失吞吐量的情况下提供FMA行为。
为执行单位提供食物
每台Adreno X2 uSPTP 寄存器文件容量为128 KB,较 Adreno X1 的192 KB有所下降。寄存器文件设计通常较为复杂,因为它们必须提供庞大的带宽以供 GPU 宽向量单元使用。
较小的寄存器文件可能使高通在控制功耗和面积的同时提升时钟频率。Adreno X2 还取消了 Adreno X1 的 wave128 模式,仅支持 wave64。
较小的波形大小可以让寄存器文件容量更长,因为每个线程可以在理论占用率前分配更多寄存器。
随着寄存器文件容量的变化,Adreno X2的占用情况应该会像Adreno 730一样。
高通没有透露Adreno X2的理论占用率,但我尝试通过运行DRAM延迟测试,使用不同调度大小和所有工作项相同的访问模式来猜测。如果GPU能让所有工作项保持运行,延迟不会比单个工作项高多少。
然而,波形槽位耗尽会迫使部分工作项等待另一件完成且其波形槽位空出,从而增加观察到的运行时间。
我猜每个Adreno X2 uSPTP分区有6到8个波形槽,8个更可能是数字。延迟从12288个工作项调度开始增加(每个uSPTP分区6个wave64),从16384个工作点增加到18432个工作点时延迟翻倍以上。
高通也未披露指令缓存容量,但对越来越大循环的基础测试显示,单线程吞吐量保持较高,循环中最多可达8192个FP32加法语句。绝对吞吐量数据表明,Adreno X2无法从单线程双发FP32的添加,可能是因为每个wave64线程都锁定在单个uSPTP分区。
在更大指令占用下,吞吐量依然合理。
缓存与内存访问
Adreno X2相比前代拥有更强的内存层级结构,但仍继承了类似Adreno的内存子系统特性,使其在其他现代GPU中显得不同寻常。uSPTP依然拥有不提供计算全局内存访问的纹理缓存。
这些纹理缓存现在大小为4 KB,但仍非常小。我见过的除高通Adreno GPU外最小的纹理缓存是AMD的Terascale上的8 KB。
全局内存访问直接传输到 Adreno X2 的 128 KB 集群缓存。集群缓存访问的延迟略高于纹理缓存,但绝对合理。不过,这意味着高通在全局内存访问上的最小延迟比 AMD 高。
如果 AMD 能进行标量优化,差距尤其大。高通没有独立的标量缓存层级结构。即使我使用恒定内存类型,它似乎也由同一个集群缓存支持。
集群缓存在带宽方面表现不错,每个 uSPTP 可提供 64B/周期。
集群缓存后面有2MB的L2缓存,与AMD在Strix Halo和Strix Point上的2MB缓存相当。L2延迟相当不错,甚至比AMD更好。L2容量相比英特尔的表现很小,但高通确实有系统级缓存来捕捉L2未中,减少了对L2容量的依赖。
AMD的Strix Halo采用了类似的策略。
L2带宽略高于1 TB/s,或每个uSPTP每周期略高于32B/周期。与许多GPU的上层缓存类似,Adreno X2的集群缓存要么是写直通,要么只读。
写入数据传递到L2,L2以大约一半的读率进行服务。
原子操作通常在L2处理,因为这是GPU上第一个共享的缓存层。Adreno X2为INT32原子加法提供了不错的吞吐量。将每个加法计为两次4B访问(读-修改-写),有效带宽为632.64 GB/s。
在全局内存上用atomic_cmpxchg测试跨线程延迟,显示Adreno X2性能优异,且比Adreno X1有显著提升。Adreno X2的“核心到核心”延迟与AMD最新GPU架构相当,甚至优于Intel Meteor Lake的iGPU。
骁龙X2 Elite的8MB系统级缓存(SLC)延迟较高,略高于200纳秒,约比L2延迟高150纳秒。SLC带宽约为380 GB/s,舒适地高于DRAM带宽。
AMD高端的Radeon 8060S拥有更高的带宽和更低的延迟,而其SLC仅为32 MB。
对于DRAM而言,高通采用了相当激进的192位LPDDR5X-9523配置。我能从GPU获得略高于150 GB/s的DRAM带宽。这比典型的128位LPDDR5X配置更好,但低于理论值的70%。
一个潜在的优点是,GPU带宽需求不会像其他集成显卡那样对CPU端访问施加压力,因为其他集成显卡可能占用更多理论DRAM带宽。
Adreno X2的DRAM延迟情况有些奇怪。测试规模适中时延迟在约274纳秒左右趋于稳定,但当测试覆盖超过64 MB时延迟会大幅下降。用128B的stride测试会使表观集群缓存容量翻倍,表明Adreno X2的集群缓存有64B线路。
表观的L2容量在stride长度超过4 KB前保持不变,之后更大的stride会同时推开L2和64 MB的拐点。我的理解是,Adreno X2的L2是虚拟寻址的,使用4 KB的地址转换页面,L2后方放置一个16K条目TLB。
在大测试规模下高延迟意味着L2 TLB的失误惩罚非常高。除去地址转换代价的原始DRAM访问延迟,可能在合理的274纳秒左右。然而,在大内存占用范围内进行局部性较差访问的应用可能会经历更高的延迟。
Adreno 高性能存储器(HPM)
高通长期以来一直拥抱磁砖渲染,Adreno X2则加倍强调这一点,推出了一个名为“Adreno 高性能内存”的21 MB芯片存储块。该HPM承担了与之前Adreno GPU中GMEM(图形内存)相同的功能,并在图块光栅化过程中保持渲染目标的中间图块状态。
在规模化方面,Adreno X1拥有3 MB的GMEM,而骁龙8+ Gen 1的Adreno 730拥有2 MB GMEM。高通表示他们将HPM的尺寸用于处理QHD+帧,计算结果也没错。
一个1440P帧,32位每像素(RGBA,每通道8位)将占用14.7 MB。华硕为Zenbook A16配备了2880x1800的OLED屏幕。同样计算每帧20.7MB,几乎只能在HPM范围内。
高通似乎在尝试让整个屏幕变成一个图块,而不是传统意义上的拼贴渲染,每帧大约有十几个拼块。拼贴渲染存在潜在的低效。例如,一个重叠两个拼贴的三角形需要经过光栅化器两遍,这会产生额外的光栅化工作。
当一个拼接完成时,着色器阵列中的波形槽可能会开始释放。GPU可能有额外的像素工作,但必须保留,因为拼贴渲染的目的就是在拼贴层级序列化光栅化过程。
如果整个屏幕只有一个拼贴,这些潜在的低效会突然消失。同时,高通仍然可以利用片上存储中间拼贴状态的优势。当然,大型缓存可以自然实现这一点,但缓存需要额外的功耗和区域来存储标签和状态数组。
如果应用坚持传统的光栅化API,HPM是一个很好的选择,但我担心HPM在通用计算中的适用性可能有限。虽然光栅化仍然是PC游戏的基石,并且在可预见的未来很可能会如此,但现代光栅化过程有时会包含计算成分。
较新的渲染引擎通常具备利用计算的功能,比如Unreal Engine 5的Nanite。HPM在这种情况下并非毫无用处,因为高通可以分配部分HPM作为软件管理的临时存储板。
然后,HPM可以承担与AMD本地数据共享或英伟达共享内存相同的角色。
我尝试看看GPU在分配不同数量的OpenCL本地内存的情况下,能同时运行多少工作组。从这些实验来看,Adreno X2似乎只能分配1 MB的HPM作为本地内存。
本地内存分配如果不是二的幂次方,会进一步降低这个比例。对于Adreno X2这样规模的GPU来说,1 MB本地内存并不算太差。Adreno X1在GPU上最多只能分配384 KB的本地内存。
AMD的Radeon 8060S在GPU上有2.5 MB的本地数据共享(LDS),考虑到它体积较大,这很合理。不过,拥有21 MB存储却只能用其中一小部分用于计算,感觉并不理想。
本地内存延迟比Adreno X1有所提升,这很令人印象深刻,因为HPM的延迟是Adreno X1的GMEM的七倍。不过,AMD、英特尔和英伟达最新的GPU仍然为本地内存提供了更好的延迟。
当访问无需跨GPU互连时,这一点更容易实现。
线程间通过本地内存的延迟也优于Adreno X2。但AMD最新GPU的核心私有LDS更快。
本地内存上的原子添加通常比全局内存上的添加获得更高的吞吐量,因为大多数GPU在每个核心本地内存实例中都有专用的原子算术逻辑单元。
而Adreno X2则不然,它能够在整个GPU中每周期维持32次INT32原子加法,按SP计算则是4次。相比之下,AMD的RDNA3.5在每个WGP的本地数据共享中,每周期可进行32次INT32原子加法。
英特尔位于Meteor Lake的Xe-LPG也提供高吞吐量,每个Xe核心周期可进行16次INT32原子加法。
本地内存带宽测试显示,HPM可提供的带宽可与GPU纹理缓存或集群缓存相当。
CPU 到 GPU 的数据移动
软件通常使用复制API来传输数据到GPU和从GPU之间。借助OpenCL的clEnqueueReadBuffer和clEnqueueWriteBuffer,将数据复制到GPU比反过来快得多。
之前的Adreno GPU也是这样。有趣的是,将工作负载固定到不同核心会改变测量到的带宽,但只影响CPU内存之间的移动。高通可能使用CPU核心来传输数据,而不是像许多其他GPU那样将数据移动卸载给DMA引擎。
更新的API可以实现零复制行为。OpenCL的共享虚拟内存(SVM)API就是一个例子,它也保持相同的虚拟地址,让CPU和GPU代码使用相同的指针。
Adreno X2宣传SVM支持原子数据,这意味着CPU和GPU理论上可以在GPU内核运行时交换数据。然而,我无法让GPU和CPU通过原子操作看到彼此的写入。
我用细粒度共享测试过,这样CPU能在GPU内核完成后看到GPU写入。让CPU和GPU之间写入可见,足够快能证明高通没有复制整个256MB测试缓冲区。
不过,内核启动和同步开销比其他平台高,尤其是测试通过E核运行时。
计算性能
FluidX3D 利用格点玻尔兹曼法(LBM)模拟流体行为,历来对 Adreno GPU 来说是个挑战性工作。FluidX3D 默认配置使用 FMA 操作,导致 Adreno 的性能远低于其他任何设备。
FluidX3D 可以修改为“legacy_fma”设置,使用乘加操作代替融合乘加。但即便如此,Adreno X2 仍然表现不佳。与 Adreno X1 相比,它表现退步,远远不及上一代 iGPU。
内存容量和内存带宽往往是 FluidX3D 的持久性限制。因此,FluidX3D 可以构建为使用 FP16S 和 FP16C 模式,这些模式使用16位浮点格式进行存储。
这些16位存储格式在计算时会被转换回FP32,以最小化精度损失,实际上增加了计算压力以减轻内存子系统的压力。FP16S 采用标准的 FP16 格式,使格式转换能够利用大多数GPU的快路径硬件。
FP16C是一种自定义格式,需要软件格式转换,但能为FluidX3D常见的典型值提供更好的精度。
这两种模式都对Adreno X2没有帮助,说明限制在于计算而非带宽。FP16C因格式转换需要额外指令而对计算压力更大,实际上比完整FP32模式更为退步。
我把GTX 1050 3GB作为对比,因为它是那种较老、中低端的独立显卡,新显卡应该轻松击败它。Adreno X2的计算吞吐量、内存带宽和缓存容量是GTX 1050 3GB的两倍多,输给它令人失望。
FAHBench
Folding at Home 运行蛋白质折叠模拟。该项目有一个较为过时的基准测试叫 FAHBench,我用的是二进制翻译运行。我曾短暂尝试构建 arm64 版本,但似乎投入时间不值得。
Adreno X2 在默认的 dhfr(二氢叶酸还原酶)工作项上表现尚可,但输给 GTX 1050 3 GB 依然不理想。
FAHBench还包含更大的导航(电压门控钠通道)工作负载,这对内存子系统施加的压力更大,而较多计算受限的DHFR工作负载更为严重。
我有几块GPU在这个工作负载中通过了准确性检查。我还是展示它们的性能,因为它们的计算结果只在第5或第6位有效位数(分别针对GTX 1050和Adreno X2)。
它们的计算结果并没有差出几个数量级,说明他们在工作上付出了诚意。
Nvidia的GTX 1050 3 GB比带导航工作项的Adreno X2快36%,而用DHFR时仅快13.7%。Adreno X2似乎在内存负载受限时遇到困难。我在想它是不是显卡相对较低的TLB覆盖率加上高TLB未命中成本,导致它在缓存不友好的计算负载中受阻。
图形性能
3DMark的Wild Life Extreme对高通来说应该是熟悉的工作,因为它是一个基于Vulkan的测试,面向移动设备。Adreno X2在Wild Life Extreme中表现非常出色,轻松领先于Meteor Lake的集成显卡,并且相对于AMD最大的集成显卡占据了合理的位置。
Fire Strike Extreme是一个重负载的DirectX11工作,我不得不用二进制转换运行。我只展示该测试的图形评分。Fire Strike Extreme对Adreno X2来说是更难的挑战,但它仍然领先英特尔较旧的iGPU。
Adreno X2在《赛博朋克2077》内置基准测试中表现也不错,性能是英特尔Meteor Lake iGPU和英伟达旧款GTX 1050 3GB的两倍。
相比之前的Adreno X1,《赛博朋克2077》的性能明显好很多在1080P下实现了24.3帧/秒用低预设。Adreno X2在中等预设下轻松胜出,我用这个预设是因为《赛博朋克2077》的CPU负载不像3DMark的图形测试那样简单。
高帧率可能会带来二进制转换的开销,我想避免这种情况。总体来说,高通在光栅化方面表现不错,而GPGPU工作负载表现较差。
光线追踪
3DMark的Solar Bay测试在一个简单的场景中展示了光线追踪反射。这是一种较轻的工作负载,旨在适应普通手机的性能,同时仍能使用光线追踪效果。
Adreno X2在这里表现出色。它的表现比Meteor Lake的iGPU和AMD Radon 780M高出两倍多,且与AMD Radeon 8060S相差不远。它也比Adreno X1有了巨大提升。
Adreno X2 将 DirectX 光线追踪(DXR)1.1 引入高通 GPU 系列,使多种 PC 游戏能够利用 Adreno 的硬件光线追踪加速器。3DMark 有一个更具挑战性的 Port Royal 测试,使用 DXR,该测试针对几代前的高端游戏 PC。
与 Solar Bay 相比,Port Royal 更重度使用计算着色器,且对传统光栅化流程的重视较少。
有趣的是,《Adreno X2》在皇家港的表现与《流星湖》的集成显卡得分相同。高通在与《Strix Halo》庞大的集成显卡相比也有所落后,仅达到Radeon 8060S的50.8%,而《太阳湾》为74.5%。
有趣的是,1678分相当于7.77的平均帧率,这对大多数游戏来说并不理想。
《赛博朋克2077》算是光线追踪的展示游戏。我通过将上述中介预设启用光线追踪反射,并将光线追踪光照滑块设置为中等来测试。将这些光线追踪效果引入画面会破坏三款iGPU的性能。
它们都无法带来舒适的帧率,但配置位置出现了令人担忧的变化。Adreno X2不再能与流星湖的iGPU平分或击败,现在大幅落败。
高通的光线追踪实现确实有潜力,正如3DMark的测试所示。高通的幻灯片显示,每个uSPTP都配备了一个光线追踪单元(RTU),其功能与英特尔的RTA在某种程度上相似。
这两种实现都加快了BVH遍历和交叉测试,并且都将L0缓存嵌入光线追踪单元。
我很好奇是什么限制了高通在启用光线追踪的《赛博朋克2077》中。我怀疑这不是CPU端瓶颈,因为GPU在测试过程中几乎保持在100%或接近100%。
也许是因为《赛博朋克2077》拥有覆盖整个城市的巨大BVH信号。用AMD工具在RDNA2上进行分析时,《赛博朋克2077》的BVH节点超过59,000,而3DMark Port Royal只有11.60万节点。
或者,可能是《赛博朋克2077》的光线追踪效果给计算流水线带来了更高的负担。我还没有做必要的分析来弄清楚Adreno X2为何会有这样的表现。
结语
Adreno X2在许多方面是高通GPU系列的一大进步。整体性能因更高的时钟频率、更多的内存和更强大的内存子系统而受益。特定工作负载类别会因Adreno X2庞大的HPM块和改进的光线追踪单元而受益更多。
Adreno X2主观上表现足够好,没有阻碍高通对笔记本的反感。我尝试了最近玩的几款游戏,性能感觉适合主流iGPU使用。
然而,高通最新的集成显卡仍包含许多现代GPU中玻璃颚性能的案例。Adreno X2继承了Adreno X1在GPGPU计算中容易崩溃的趋势。架构上的改进在计算微基准测试中确实显现,但这些观察并未转化为我尝试的计算负载中的良好性能。
感觉高通针对特定图形工作负载进行了优化,而AMD、英特尔和英伟达则致力于打造更通用且性能性能强、适用于更广泛用例的设计。
目前来看,我认为高通有更重要的问题要处理。二进制转换开销是我在设备上尝试游戏时遇到的最大问题,因为运行x86-64二进制文件时很容易被CPU性能限制。
例如,通过CaptureAge播放《帝国时代II》游戏时,Snapdragon X2 Elite Extreme无法提供足够的CPU性能来维持实时播放,而Strix Halo则有足够的CPU资源支持快进。
但在未来几年,高通的GPU将面临一场艰难的对决。当今的集成显卡市场以激烈竞争为特征。AMD的Radeon 8060S和英特尔的Arc B390在图形和计算方面都能接近中低端移动独立显卡的性能。
轻薄笔记本的趋势很可能会继续,推动AMD和英特尔打造更具野心的设计。我期待看到高通未来设计的成果,也希望他们能挑战AMD和英特尔的顶级产品。