逆向揭开 ANE 全栈:M1 卷积比同芯 GPU 快 3.8 倍、能效高 9 倍

Apple Neural Engine: Architecture, Programming, and Performance

Spencer H. Bryngelson

cs.AR, cs.OS, cs.PF

2026-06-21

对 ANE 做了从 datapath 到固件的全栈逆向。M1 实测约 12 fp16 TFLOP/s、最优约 0.37 pJ/FLOP;256 通道 3x3 卷积比同芯 GPU 快 3.8 倍、能效高约 9 倍。直通路径无文档,只适合测量和研究。

这篇在解决什么

Apple Neural Engine 从 2017 年的 A11、2020 年的 M1 起,就装进几乎每一台 iPhone、iPad 和 Apple silicon Mac。Apple 自称活跃设备超过 25 亿台,绝大多数芯片里都有这颗加速器,负责端上视觉、语音和语言模型。可编程引擎里它却最不透明:没有公开指令集,没有驱动接口,应用只能走 Core ML,把 computeUnits 当放置提示。系统规划器自己决定 CPU、GPU 还是 ANE 跑哪一段,调用方甚至不知道工作落在哪。

这篇约 300 页指南把加速器从 datapath 拆到固件。两条证据互相核对:在 Apple silicon 上直接测,加上对私有 runtime、编译器、内核驱动和固件的静态反编译。测量主战场是 M1(内部代号 H13),交叉验证在 M5(H17s),中间补了一台 M2。配套开源 runtime 叫 ANEForge。直通路径从普通用户态就能调,不经过 Core ML 规划器,但无文档、无支持、跨系统版本会断,只适合测量和研究,上架软件仍应走 Core ML。

方法

核心入口是 Apple 自己调度器用的私有 Espresso runtime。它把计算图降到引擎自己的程序格式,加载后走 execution stream 派发。编译器接受的算子不需要特殊 entitlement。

证据分四路。用户态计数器给出 DRAM 流量、能量和时钟,直接画出 roofline。signpost 追踪确认每次派发包着三次驱动请求。在可擦写开发机上降低启动安全后,内核函数边界追踪抓到用户态磁盘上看不到的展开程序:44 字节一条的寄存器写,把缓冲地址接到 DMA 引擎。固件在 M1 上未加密,是一份 ARM64 实时内核镜像,静态解出 93 条主机命令协议。每一条实质性声明都标成实测、反编译或预测。

命名规则干净:M(n) 对应 H(n+12) 架构,M1 是 H13,M5 是 H17。同一份编译器二进制覆盖 28 个目标,从 A11 到 A18、M1 到 M5,换芯片只换数据表。能力位不等于能跑:三维卷积前端认、后端在所有设备上都降不下去。附录 A 里标 native 的算子,全部在 M1 上编译并跑过。

结果

M1 的 roofline 常数如下。

M1 实测
开销剥离 matmul 斜率约 12 fp16 TFLOP/s
单次大 matmul 饱和约 4.8 fp16 TFLOP/s
卷积端到端约 1.8 TFLOP/s
DRAM 顶棚 / 权重流约 85 GB/s / 约 51 GB/s
脊点约 141 FLOP/byte
片上工作集2 MB
单次派发地板约 0.23 ms

256 通道 3x3 卷积比同芯 GPU 快约 3.8 倍,能效高约 9 倍。十六层卷积栈在 M1 上 2063 GFLOP/s/W 对 GPU 的 142,能效比 14.5 倍;M5 上是 2289 对 175,约 13 倍。M2 上 ViT-B/16 前向 67.9 mJ 对 GPU 的 714.3 mJ,约 10.5 倍。引擎闲时把轨关掉,约 0 W;持续卷积约 1.78 W,最优约 0.37 pJ/FLOP。3.5 分钟持续负载不降频。

datapath 是端到端 fp16,累加器是 fp32 级宽寄存器。广告里的「16 核」是市场数字,编译器真正铺核的是 HAL 偏移 0x238:M1 基础款 4 核,Pro/Max 8 核,M5 16 核。每核每周期默认吐 4 个输出通道。无权限路径上,int4 查找表权重比 fp16 快约 2.37 倍;结构化稀疏快 1.55 到 1.64 倍,字节量约 0.43 倍。M1 上 int8 仿射会先折成 dense fp16,只省磁盘、不省带宽。

自回归解码同时卡在带宽和派发:一层 transformer 大约 40 到 50 次小派发,每次都付 0.23 ms。batch 16 时 GPU 解码比引擎快约 2.7 倍、能效高约 4.6 倍。int8 权重把流量减半,混合解码器速度仍约 0.99 倍,墙钟被派发地板卡住。建议把 prefill、encoder、视觉前端放引擎,自回归解码放 GPU。下投影在收缩维 5632 上 fp16 误差约 3%,足以翻转 greedy argmax。

引擎没有反向算子。用前向算子拼向量-雅可比积,注册梯度对解析式余弦 1.0000。手写数字小卷积网 300 步后 M1 测试精度 0.9080、M5 0.9070,差一个样本。这是能力声明,不是速度声明:这一规模下训练是派发绑定的。

为什么重要

这是目前对 ANE 从 fp16 阵列一路写到固件协议的最完整公开账本。端上视觉、encoder、短序列 attention 和中等规模 matmul,引擎同时更快更省电。大方形 GEMM、长序列 attention 和自回归解码归 GPU。小于 0.23 ms 的琐碎算子留 CPU。服务场景下,真正 batched 的 encoder 块大约在 batch 23 被 GPU 追上吞吐量,自注意力大约在 batch 6;视觉卷积从 batch 1 到 256 都不换边。

对要压端侧延迟和电池的人,工作集压到 2 MB 以下、把图融成一次派发、选真正能流的压缩格式,比换模型结构更先见效。M5 工作集抬到 4.72 MB,matmul 斜率约 19.6 TFLOP/s,权重流约 145 GB/s,编程模型没变。

局限与存疑

直通路径明确不支持上架。scatter、reduceprod、GRU/LSTM/RNN 全家族都没有硬件路径。无权限路径拿不到符号形状,一种具体形状编一次。动态权重卷积 batch≥2 会把编译服务打崩。M1 和 M2 上非零宽度偏移 slice,绝对值超过 4094 会静默变无穷大。

功率数字来自 powermetrics 的建模估计,没有独立墙功率计校验。实测硅只有 M1 和 M5,外加部分 M2;M3、M4 从设备表预测。私有符号绑在 ANECompiler 9.509.0,系统更新就能断。训练在这一规模上并不比主机或 GPU 更快。

术语

原文与代码

社区讨论

相关论文

全部论文解读