Apple M3 Neural Engine 的 50 GB/s 性能陷阱
Getting 50 GB/S Back from the Apple Neural Engine

在调试 Apple M3 Neural Engine 时,我发现了一个隐蔽的 RTL 性能缺陷:当权重数据大小为 1 MiB 的整数倍时,DRAM 吞吐量会从正常的 45–60 GB/s 骤降至 17–19 GB/s。这导致 Llama 3.2 和 Qwen3 等模型的推理速度大幅下滑。通过深入分析 DMA 引擎的 speculative prefetch 机制,我定位到问题根源在于 14 位计数器在特定边界发生的整数溢出。通过避开这一特定路径,我们成功将 Llama 3.2 的 token 生成速率从 10.0 提升至 24.3 tokens/s,让硬件性能回归预期。
这并非 RTL 正确性错误,因为内核 DMA 仍能正确完成传输,但在 2048 附近的请求被强制进入一个独立的、信用匮乏的调度机制,导致吞吐量被不合理地削减了 28 到 43 GB/s。
HN 评论区
33- bee_rider
调查得很棒。
每次看到像 1MiB 这样规整的数字竟然会导致“性能不佳”的配置,我都感到惊讶(虽然这种情况确实存在)。
你确定在这个语境下用 erratum 这个词合适吗?我通常看到它被用来描述指出文档中存在错误的勘误通知。
- thenewwazoo
“显然,内存控制器的吞吐量在张量维度空间中有一个占主导地位谐波,其波长为 2048。”
这句话让我笑出了声。
- anemll
并非所有系统都受影响
M1 和 M5MAX 没问题
- Neywiny
只是想确认一下——这段 systemverilog 代码是你推测可能发生了什么而写的假设性描述?还是你手里真的有 RTL 的源代码?
- londons_explore
Apple 内部肯定有人会在流片前,用 RTL 仿真器跑过一些常见的神经网络架构,并检查性能是否符合预期吧?