Intel处理器上Subnormal浮点数性能大坑

Subnormal floating-point numbers are expensive on Intel processors

Intel处理器上Subnormal浮点数性能大坑

在IEEE标准中,极小数值被称为Subnormal numbers,常被游戏和机器学习开发者规避。我通过C++基准测试对比了Intel、AMD、Arm及Apple M4 Max等多款处理器。结果显示,在Intel Granite Rapids和Emerald Rapids上,涉及Subnormal的乘法操作比正常数值慢45到50倍,除法慢18倍,依赖链延迟更是从4周期激增至128周期。即便仅1%的Subnormal数据,因编译器向量化也会拖慢整个计算块。反观AMD Zen 5、AWS Graviton 5和Apple M4 Max,Subnormal处理几乎无性能损失。结论很明确:在最新AMD和Arm架构上无需担心,但在Intel平台上,Subnormal仍是严重的性能隐患。

在Intel处理器上,涉及Subnormal数的乘法运算比正常数值慢约45到50倍。
  1. cesaref

    在编写 DSP 代码时,给输入添加一个低幅度的随机信号曾经是相当常见的做法,目的是为了避免陷入次正规数(subnormal)区域。对算法进行仔细分析可以找出哪些地方也需要这样做(例如运行延迟时的反馈路径)。

    显然,那些有幸或不幸地编写 56k 定点精度代码的人不会有这种顾虑,但其他人就有这个烦恼了 :)

    我觉得如今“刷新为零”(flush to zero)可能是首选策略。

  2. khuey

    如果你不需要次正规数,MXCSR.DAZ/FTZ(可以通过 -mdaz-ftz 让 gcc 设置)可以让你忽略所有这些问题。

  3. pixelpoet

    这种情况已经存在无数个年头了,至少从 Core 2 Duo 时代起就是这样。

  4. juancn

    看来这只会发生在 P-core 上,近期的 E-core 对次正规数有快速处理路径。

  5. gwbas1c

    我还在努力理解什么是次正规数;也就是说,我在找一个 TLDR,让我知道得刚好足够,以便判断自己是否在使用它们以及是否需要深入学习。

    不幸的是,维基百科的文章虽然可能很准确,但没有给出清晰简明的答案。

    也就是说,0.0001 是次正规数吗?还是 0.000000000000000000001 才是?

同日更多故事

2026-09-18