← 返回信息流
AI 资讯Hacker News·2 小时前

x86能否接住ACE挑战?

原标题:Is x86 ready to ACE it?

速览

该资讯聚焦x86处理器是否已为AI计算引擎(ACE)做好准备。文章分析了x86架构在人工智能加速方面的进展与挑战,并评估其在未来计算中的竞争力。

AI 深度解读

背景

CPU 设计必须不断演进以适应变化的工作负载。有时,这种演进涉及扩展指令集,以高效地表示特定类型的计算任务。Intel 的 AMX(Advanced Matrix Extensions)扩展就是这样一个例子。AMX 通过提供一组二维 Tile 寄存器和配置寄存器,加速机器学习工作负载中的矩阵乘法。程序员可以配置专用的执行单元("加速器")来操作这些 Tile 寄存器中的矩阵数据。AMX 最初在 Intel 的 Sapphire Rapids 服务器 CPU 上实现,配备了一个 Tile 矩阵乘法单元(TMUL)加速器。

现在,x86 生态系统咨询小组(x86 Ecosystem Advisory Group)撰写了一份白皮书和规范,提出了 ACE(Advanced Compute Extension),它引入了第二种加速器类型。虽然 ACE 是与 TMUL 并列的 AMX 加速器,但本文将分别称它们为 "AMX" 和 "ACE",因为 TMUL 是 AMX 推出时唯一存在的加速器实现,并且至今仍是硬件中唯一可用的 AMX 加速器。文档也倾向于称它们为 "AMX" 和 "ACE"。

核心内容

AMX TMUL 回顾

AMX TMUL 提供了高度可配置的设置,代码可以为每个 Tile 寄存器指定矩阵 Tile 参数。例如,Tile 寄存器 tmm0 可以设置为一个 16x64 的 INT8 矩阵(指定 16 行,每行 64 字节 "colsb")。TMUL 矩阵乘法指令(如 TDPBSSD)会考虑 Tile 配置,并在指定 Tile 之间执行完整的矩阵乘法运算。在数据类型方面,AMX TMUL 支持 INT8、FP16 和 BF16。最新一代 TMUL(实现在 Granite Rapids-D CPU 上)还支持复数(FP16 实部 + FP16 虚部)。

ACE 的新特性

ACE 取消了 Tile 寄存器的配置选项,始终将它们视为 64 字节 x 16 行。复数支持被移除,但新增了 FP8 支持。在计算方面,ACE 提供了外积(outer product)指令,取代了 AMX 提供的内积(inner product)指令。

与 Arm SME 的比较

Arm 的可扩展矩阵扩展(SME)及其 SME2 扩展是明显的比较对象。这两个 ISA 扩展都旨在 CPU ISA 框架内加速矩阵乘法,提供比 GPU 等集成度较低的加速器更低延迟的替代方案。然而,两者在多个方面存在差异。

ACE 基于 AMX 构建,继续使用 AMX 的 8 KB Tile 寄存器来保存矩阵值。相比之下,Arm SME 具有可变的 "流式" 向量长度(SVL),类似于 SVE 的向量长度(VL)。SVE 和 SME 的向量长度不必相同,而且通常不同。与 SVE 一样,SME 允许向量长度从 128 位到 2048 位,以 2 的幂次增长。

流式向量长度定义了 "ZA" 存储阵列的大小,相当于 SME 中的 AMX Tile 寄存器。ZA 存储是一个二维数组,每条边的长度匹配 SME 流式向量长度。因此,ZA 存储容量范围从 128 位向量长度下的 256 字节,到最大 2048 位向量长度下的 64 KB。

外积 vs. 内积

AVX512-VNNI 和 AMX 加速内积(inner product),而 ACE 和 SME 加速外积(outer product)。

内积(点积):两个向量 a 和 b 的内积定义为 a·b = Σ(a_i * b_i),或通过几何解释为 |a||b|cosθ。

外积(张量积):向量 a 和 b 的外积生成一个秩为 1 的矩阵 C,其中 C 的列都与 a 成比例,因此它是秩 1 矩阵。矩阵乘法本质上是多个外积的和:C = A×B = Σ (A 的列 k) ⊗ (B 的行 k)。

事实上,线性代数中的许多运算可以看作是外积的线性组合,这使得外积成为处理器中的自然原语。最明显的例子是矩阵的奇异值分解(SVD):写成内积形式不易理解,但它本质上就是 U 的列与 V 的列的外积乘以对应奇异值的和。甚至像 FFT 这样不易转化为外积形式的算法,也已经重新表述为利用 SME 加速器的形式。Arm 给出了一个示例,而搜索论文可以找到各种更有效的方法。

历史上我们主要使用内积,因为这可以减少需要保持在寄存器中的状态量,而寄存器是宝贵的资源,优化它很重要。然而,几乎所有线性代数都可以通过两种视角来看待,代码可以轻松在内积和外积之间转换。SME 利用这一点通过外积进行矩阵乘法,ACE 也试图这样做。

数据类型转换/反量化

模型权重通常被量化到非常小的位宽,以减少内存带宽和容量压力。与 NVIDIA 的 TensorCores 不同,ACE 和 SME 在软件中对输入向量进行预处理,因此可以支持几乎任何可定义的格式,而不仅限于有限的 "原生" 格式。

量化后的权重会被转换为原生支持的数据类型,以利用加速器。ACE 依赖于 AVX-512/AVX10 的固定 512 位向量宽度来加速转换过程。512 位向量足够大,可以容纳查找表,使用 VPERMB 将最多 6 位的数据类型映射到 8 位输出;对于 7 位输入,VPERMI2B 可以结合两个 512 位向量寄存器作为查找表。ACE/AVX10.3 新增的 VUNPACKB 指令可以将 2 到 7 位的元素提取到字节对齐的位置,然后前述的向量排列指令执行数据类型转换。因此,ACE 仅用这三条指令就能处理 2 到 7 位之间的任何数据类型,提供了一定程度的面向未来兼容性,并且可以通过软件实现任意所选方法。x86-64 EAG 还希望这种灵活性让 ACE 硬件能够应用于除模型权重反量化之外的场景,例如用于数据压缩的码本。

Arm SME2 不能依赖拥有足够宽的向量寄存器作为查找表,因为 SVE 允许实现定义从 128 到 2048 位的流式向量长度。因此,SME2 增加了一个 512 位的 ZT0 寄存器,专门设计为 16x4B 的查找表。LUTI2 和 LUTI4 指令通过从向量寄存器中解压 2 位或 4 位的索引值,在 ZT0 中查找其值,并将输出值放入目标向量寄存器,从而执行数据类型转换。添加固定宽度的 ZT0 寄存器使 Arm 能够在可变向量长度的 SVE/SME 框架内加速数据类型转换,但不如 ACE 的 VUNPACKB + 排列组合灵活。量化到 2 位或 4 位以外的模型权重无法受益于 SME2 的查找表加速,并且需要多个不同查找表的更复杂码本方法也无法得到支持。另一方面,SME2 的机制使 Arm 可以用单条指令(而不是两条)表示数据类型转换,也减少了对向量寄存器的压力(因为查找表存储在单独的寄存器中,LUT 指令不需要单独的向量寄存器来保存中间解包值)。在灵活性方面,Arm 可以继续扩展 ISA,添加 LUT 指令变体以支持更多数据类型宽度。

块缩放支持

低精度数据类型(如 FP8)存在动态范围不足的问题。开放计算项目(OCP)的 Microscaling Formats 规范通过缩放因子来解决这一问题。一个缩放值应用于一组数据块,在增加乘法结果动态范围的同时不增加每个数据元素的位宽。ACE 通过一个新的 1024 位块缩放寄存器 BSR0 来支持这一点。BSR0 分为两个 512 位半区,一个用于……(原文在此截断,后续内容缺失。根据上下文,BSR0 的两个半区分别用于两个输入操作数的缩放因子,与 ACE 的外积计算配合使用。)

关键要点

  • ACE 是 AMX 框架内的第二个加速器类型,与 TMUL 并行,但 ACE 专注于外积计算,而 TMUL 专注于内积。
  • **ACE 简化
查看原文 →chipsandcheese.com