在Ryzen AI 7 350 NPU上达到峰值TOPS性能
摘要
关于在AMD Ryzen AI 7 350 NPU上实现峰值TOPS性能的技术深度剖析,与Xilinx AIE-ML v2 AI引擎进行比较,并解释用于矩阵乘法工作负载的硬件架构。
<p><a href="https://lobste.rs/s/m77efo/getting_peak_tops_on_ryzen_ai_7_350_npu">评论</a></p>
查看缓存全文
缓存时间: 2026/05/08 12:29
# 在Ryzen AI 7 350 NPU上实现峰值TOPS – Daniel Estévez 来源: https://destevez.net/2026/05/getting-peak-tops-on-a-ryzen-ai-7-350-npu/ 我有一台Framework Laptop 13 (https://frame.work/es/en/laptop13),它搭载了Ryzen AI 7 350 (https://en.wikipedia.org/wiki/List_of_AMD_Ryzen_processors#Strix_Point_and_Krackan_Point_(Zen_5/RDNA3.5/XDNA2_based)) CPU,并集成了NPU。我开始研究这个NPU,以了解如何为其开发软件。虽然NPU主要用作机器学习模型推理的加速器,但它们本质上也是矩阵乘法及其他类似线性代数运算的硬件加速器,因此对于信号处理和其他计算应用也很有用——这正是我对它们感兴趣的原因。我对这个NPU感兴趣的另一个原因是,如下文所述,它与Versal FPGA SoC中的AIE-ML v2 AI引擎非常相似,因此这台笔记本电脑是学习使用该AI引擎的绝佳平台。
NPU使用TOPS(每秒万亿次操作)作为其能力的高层营销指标。通常,一次操作被理解为`int8`数据类型的加法或乘法,因为可实现的并行度取决于数据类型宽度。Ryzen AI 7 350上的NPU被宣传为50 TOPS NPU。本文的主要目标是理解这个数字是如何从硬件执行单元和能力中得出的,理解在什么条件下可以达到这个数值,并编写一个能够达到该TOPS值的小型应用程序。我认为这是深入了解计算架构的好方法。大多数实际应用场景会比这慢,因为算法会有瓶颈导致硬件利用率不足。通过理解硬件需要如何被使用才能达到峰值性能,我们能更好地了解这些算法的差距,并在可能的情况下重写算法以减少差距。
在去年一篇关于ARM Cortex-A53上NEON内核的文章中 (https://destevez.net/2025/02/coding-neon-kernels-for-the-cortex-a53/),我也采用了类似的方法:选择一个简单的内核来加速,并将性能基准测试与硬件允许的峰值性能进行比较。
#### AMD NPU
我想先概述一下AMD使用的不同代NPU。它们在上下文中名称不同。了解这些名称之间的对应关系可以节省时间,确保我们查看的是正确的文档或使用正确的编译器选项。
AMD NPU本质上是Xilinx AI引擎。AMD CPU上的NPU与Versal FPGA SoC上的Xilinx AI引擎基本相同,只是NPU/AI引擎与系统其他部分的连接方式不同。因此,大部分适用的文档和软件栈(特别是低级开发)都来自Xilinx。Xilinx目前有以下三代AI引擎。文档中提供了一个对比表 (https://docs.amd.com/r/en-US/am027-versal-aie-ml-v2/Comparison-of-AIE-Generations):
- AI Engine (https://docs.amd.com/r/en-US/am009-versal-ai-engine/Overview)。这是最老的一代。出现在Versal AI Core (https://docs.amd.com/v/u/en-US/versal-ai-core-product-selection-guide) VC1x02系列、Versal AI Edge (https://docs.amd.com/v/u/en-US/versal-ai-edge-product-selection-guide) VE1752、Versal RF (https://docs.amd.com/api/khub/documents/LLwf~6xQPkRWqhxcjKlTIw/content)系列和Versal Premium (https://docs.amd.com/v/u/en-US/versal-premium-psg) VP2x02系列中。根据文档,它针对DSP和通信应用进行了优化。
- AIE-ML (https://docs.amd.com/r/en-US/am020-versal-aie-ml/Overview)。这是下一代,针对机器学习而非DSP和通信进行了优化。移除了一些AI Engine特性,包括32位浮点和整数乘法的硬件支持、标量非线性函数(如sin/cos、sqrt和invsqrt)以及FFT寻址模式。另一方面,增加了`bfloat16` (https://en.wikipedia.org/wiki/Bfloat16_floating-point_format),并且`int8`和`int16`的计算并行度翻倍。该AI引擎出现在Versal AI Core VC2x02和Versal AI Edge VE2x02中。
- AIE-MLv2 (https://docs.amd.com/r/en-US/am027-versal-aie-ml-v2/Overview)。这是当前一代。它是AIE-ML的增量演进,新增了`fp8`和块浮点类型(MX9、MX6)等数据类型,并将`int8`的计算并行度再次翻倍。它出现在Versal AI Edge Gen2 2VE3xxx系列中。
这些AI引擎代的架构在C++编译器中被命名为:
- AI Engine: `aie`
- AIE-ML: `aie2`
- AIE-MLv2: `aie2p`
注意这里可能产生混淆,因为`aie2`代表AIE-ML,而不是AIE-MLv2。
AMD在其CPU上有以下几代NPU:
- XDNA。使用AIE-ML代。出现在Ryzen 7040 CPU(Phoenix)、Ryzen 8040和Ryzen 200系列CPU(Hawk point)中。阵列按5列组织,每列4行计算瓦片,共20个计算瓦片。该架构在某些软件中被称为`npu`。
- XDNA2。使用AIE-MLv2代。出现在Ryzen AI 300系列CPU(Strix point / Krackan point / Strix halo)和Ryzen AI 400系列CPU(Gorgon point)中。阵列按8列组织,每列4行计算瓦片,共32个计算瓦片。该架构在某些软件中被称为`npu2`。
综上所述,我笔记本电脑中的NPU是一个XDNA2 `npu2`,使用AIE-MLv2,对应`aie2p`机器架构。因此,本文将重点介绍这一特定代。
#### AIE-MLv2架构
Xilinx AI引擎以及AMD NPU都被组织成瓦片阵列。下图展示了一个示例AIE-MLv2阵列。
[](https://destevez.net/wp-content/uploads/2026/05/lxf1700600154024.png)
AIE-MLv2阵列结构,取自AIE-MLv2架构手册 (https://docs.amd.com/r/en-US/am027-versal-aie-ml-v2/AIE-ML-v2-Array-Hierarchy)
阵列的底部行(第0行)由接口瓦片组成,这些瓦片提供与系统其余部分的连接。在Xilinx AIE-MLv2引擎和AMD XDNA2 NPU中,这些瓦片差别很大,因为在AIE-MLv2引擎中它们提供与FPGA和SoC互连的连接,而在XDNA2 NPU中它们提供与CPU复合体的连接。
接下来的一行或两行(从底部算起)是内存瓦片,每个包含512 KiB内存。这有时被称为L2内存,但我不喜欢这个术语,因为这不是对程序员透明的缓存内存。内存中的所有数据移动都由程序员显式控制。
其余行是计算瓦片,也简称为“瓦片”或核心瓦片。每个瓦片包含一个处理器,我将在下面更详细地描述,还有64 KiB数据内存(有时称为L1内存)和16 KiB程序内存。每个处理器完全独立,并从自己的程序内存运行代码。这意味着每个计算瓦片可以编程执行不同的算法,或者一个算法可以并行分布在多个计算瓦片上。
在AMD XDNA2 NPU中,阵列始终有8列、一行内存瓦片和4行计算瓦片,总共32个计算瓦片和8个内存瓦片。在Versal AI Edge Series Gen 2中,阵列大小取决于器件大小(见数据手册 (https://docs.amd.com/v/u/en-US/ds950-versal-overview))。2VE33xx有12列,每列一行内存瓦片和2行计算瓦片,共24个计算瓦片和12个内存瓦片。2VE35xx有24列,一行内存瓦片和4行计算瓦片,共96个计算瓦片和24个内存瓦片。2VE38xx有36列,两行内存瓦片和4行计算瓦片,共144个计算瓦片和72个内存瓦片。
AIE-MLv2中的瓦片通过三种方式互连,如下面图表所示。首先,有AXI4-Stream总线,在整个引擎中水平和垂直运行,并在每个瓦片位置的AXI4-Stream互连处汇合。这形成了一个引擎范围的AXI4-Stream互连系统,能够将数据从任何瓦片移动到任何其他瓦片。瓦片上本地内存与AXI4-Stream互连之间的数据移动主要由瓦片上的DMA引擎完成。从程序员的角度来看,这是最灵活且最容易使用的数据移动机制。
[](https://destevez.net/wp-content/uploads/2026/05/nuy1700603482820.png)
AIE-MLv2瓦片连接性,取自AIE-MLv2架构手册 (https://docs.amd.com/r/en-US/am027-versal-aie-ml-v2/AIE-ML-v2-Tile-Architecture)
其次,每个瓦片可以直接访问相邻瓦片的本地内存。用蓝色线条绘制的方式可能具有误导性,因为它看起来每个瓦片可以访问其四个相邻瓦片中的每一个的数据。然而,文档说:“架构旨在使每个AIE-ML v2单元能够与最多四个不同的内存模块接口。这些模块包括:位于西边的模块、其自身的本地内存模块、位于北边的模块、位于南边的模块”。请注意,图表实际上试图准确表示这一点。在水平方向上,有双向蓝色箭头连接每个绿色AIE-ML v2瓦片到西边瓦片的内存模块,但没有箭头连接到东边瓦片的内存模块。另一方面,在垂直方向上,有两个双向蓝色箭头分别连接绿色瓦片到南边瓦片的内存模块和北边瓦片的内存模块。
第三,存在级联连接,允许一个瓦片将512位累加器值发送到其右侧或下方的瓦片。这两种数据移动机制更高级,在本文中我不会使用它们。
在XDNA2 NPU的情况下,阵列底部的接口瓦片被称为shimNOC瓦片。它们包含shimDMA,通过AXI4-Stream互连在CPU复合体主内存(经过L3缓存)和NPU阵列之间执行数据移动。
#### AIE-MLv2处理器
每个AIE-MLv2计算瓦片包含一个处理器,它是一个32位RISC顺序暴露流水线VLIW SIMD向量处理器。让我们逐一解析这些含义。
首先,VLIW(超长指令字)意味着架构使用长指令(每条指令最多128位),每条指令可以包含处理器每个功能单元的指令:
- 两个加载单元(A和B),每个都有自己的地址生成单元(AGU)
- 一个存储单元,带有自己的AGU
- 一个标量单元,带有一个整数ALU
- 一个寄存器移动单元,可以将值从一个寄存器复制到另一个寄存器
- 一个向量SIMD单元,可以执行整数和浮点算术
由于每个VLIW指令可以包含每个功能单元的独立指令,因此更容易使功能单元同时工作并避免瓶颈。
暴露流水线意味着处理器不会向程序员假装每条指令都是作为原子单元按顺序执行的。我们知道CPU流水线需要一定数量的周期直到指令的结果可用(无论是从内存加载、计算还是跳转)。传统CPU通过假装指令的结果对后续指令立即可用,并在结果尚未准备好而指令需要时进行停顿或重排序,来向程序员隐藏这种延迟。相比之下,顺序暴露流水线架构使流水线对程序员可见。这种处理器每周期按顺序执行一条指令,通常不会停顿(除非处理器等待硬件锁,例如与DMA同步,或其他类似情况)。指令的结果仅在指令执行后经过一定数量的时钟周期才对后续指令可见。
下面通过用于这些处理器的llvm-aie (https://github.com/Xilinx/llvm-aie/tree/aie-public)分支中的一个例子来最好地说明这一点。在此例中,加载延迟为8个周期,标量乘法延迟为3个时钟周期。
```
1: lda r12, [p0] // 在第8周期后写入r12。
2: nop
3: nop
4: mul r12, r12, r12 // 读取r12初始值,并在第6周期后写入r12。
5: mov r14, r12 // 读取r12初始值
6: nop
7: add r13, r12, r6 // 读取来自指令4的r12。
8: nop
9: mul r14, r12, r7 // 读取来自指令1的r12。
```
暴露流水线架构要求编译器确切知道每条指令的时序。这使得编译器能够针对这个特定处理器最优调度指令,并提供确定性的性能。为暴露流水线处理器手动编写汇编相当困难,因为指令时序的任何错误都可能导致我们读取错误的数据,而不是导致处理器停顿。另一方面,读取汇编并理解时序和发现性能损失要容易得多,因为我们知道处理器始终每周期执行一条指令,并且编译器插入的任何nop都意味着它无法最优调度。
另外需要记住的是,这种方法只有在所有指令的时序都是确定性的情况下才能很好地工作。这对于AI引擎处理器是可能的,因为它们通常只访问自己的本地内存,因此内存访问不需要经过引入非确定性的缓存。在更高级的情况下(例如处理器访问相邻瓦片的内存)仍然可能存在争用。在这些情况下,处理器会简单地停顿,直到争用解决。
最后,SIMD向量处理器意味着该处理器主要设计用作使用SIMD指令的向量处理器。这与x86-64和ARM CPU中的AVX和NEON SIMD指令类似。AIE-MLv2处理器有一个标量单元,但处理器速度不快(在AMD NPU中约为1.8 GHz,Versal中为1 GHz),因此要完成任何显著的计算,都需要通过向量执行单元。标量单元仅用作支持,因此为这些AI引擎编写代码的心态与在x86-64或ARM中编写大量SIMD代码的心态非常相似。然而,AIE-MLv2 SIMD向量单元与x86-64和ARM CPU中的SIMD存在根本区别。在AVX和NEON中,我们习惯对SIMD向量进行逐点操作。例如,一个512位向量包含64个`int8`元素,我们可以对两个这样的向量进行逐点求和或乘法,从而实现64个操作的并行。如果我们可以进行逐点乘加,那么通过在同一指令中执行乘法和加法,就可以实现128个操作的并行。在AIE-MLv2中,我们仍然可以这样做,但架构高度集中于矩阵乘法,因此它包含用于在向量寄存器中执行小矩阵乘法的SIMD指令。这些指令是充分利用所有硬件计算资源的唯一途径。
相似文章
@TeksEdge: 随着下周所有关于 Microsoft-Nvidia-Windows-Arm N1X 的讨论展开,Intel 的 Panther Lake 将面临艰巨任务……
在围绕 Microsoft-Nvidia-Windows-Arm N1X 的讨论中,Intel 即将推出的 Panther Lake 处理器定位于本地 AI 竞争,拥有高达 180 TOPS 的算力,超越了 AMD 的 Ryzen AI 400。
xdna-top: 面向 Strix Halo (Ryzen AI Max) 的统一 NPU+iGPU 终端监视器 — 终于能看到 NPU 工作了
xdna-top 是一款终端监视器,可在 Ryzen AI Max/Strix Halo 系统上同时显示 NPU 和 iGPU 活动,提供 NPU 计数器增量的真实视图,而非虚假的利用率百分比。
@ciruai:在配备128GB内存的AMD Ryzen AI Max+ 395 Strix Halo上测试DeepSeek v4 Flash。在中等长度上下文中获得约15 TPS……
在配备128GB内存的AMD Ryzen AI Max+ 395上测试DeepSeek v4 Flash,本地运行284B MoE模型(13B活跃参数)可达约15 TPS。成本仅需3000美元,而数据中心配置需25000美元以上,凸显了在消费级硬件上运行大型模型的可行性。
AMD凭借全新Ryzen AI Halo开发者平台和Ryzen AI Max PRO 400系列处理器驱动下一代智能体计算机
AMD宣布推出用于本地AI开发的Ryzen AI Halo开发者平台(可运行高达200B参数的模型)以及面向商业AI PC的Ryzen AI Max PRO 400系列处理器,可在本地支持智能体AI工作负载。
单张4090上11.67% ARC-AGI-2本地评估:TOPAS递归架构
作者介绍了TOPAS,一种递归AI架构,在单张RTX 4090上达到了ARC-AGI-2的11.67%,旨在证明架构效率可以超越原始计算能力。