从硬件架构的角度来看,为什么非规范化浮点数比其他浮点数慢得多?

Why denormalized floats are so much slower than other floats, from hardware architecture viewpoint?

Denormals are known to underperform severely, 100x or so, compared to normals. This frequently causes unexpected software problems

我很好奇,从 CPU 体系结构的角度来看,为什么非规范化必须 那么多 慢?缺乏表现是他们不幸的代表所固有的吗?或者,也许 CPU 架构师在非规范化无关紧要的(错误的)假设下忽略了它们以降低硬件成本?

在前一种情况下,如果非正规化本质上是硬件不友好的,是否有已知的非 IEEE-754 浮点表示在零附近也是无缝的,但更便于硬件实现?

在许多架构中,FPU (H/W) 不处理非规范化 - 因此将实现留给 s/w

这里有一个很好的基本介绍 https://en.wikipedia.org/wiki/Denormal_number

在性能问题下 -

在大多数 x86 系统上,缓慢的原因是非规范值会触发 FP_ASSIST,这在切换到微代码流时成本非常高(非常像故障)。

例如,参见 - https://software.intel.com/en-us/forums/intel-performance-bottleneck-analyzer/topic/487262

原因为什么会这样,可能是架构师决定通过推测每个值都被标准化(这会更常见)来优化正常值的 HW ,并且不想为了罕见的极端情况而冒频繁用例的性能风险。这种猜测通常是正确的,所以您只有在错的时候才需要支付罚金。这些权衡在 CPU 设计中很常见,因为对一种情况的任何投资通常都会增加整个系统的开销。

在这种情况下,如果您要设计一个试图优化所有类型的不规则 FP 值的系统,您将不得不添加 HW 以在每次操作后检测和记录每个值的状态(这将是乘以物理 FP 寄存器、执行单元、RS 条目等的数量 - 总计大量的晶体管和电线。 或者,您必须添加一些机制来检查读取的值,这会在读取任何 FP 值(即使是正常值)时减慢您的速度。

此外,根据类型,您可能需要执行一些更正或不执行一些修正 - 在 x86 上,这是辅助代码的目的,但如果您没有进行推测,则必须有条件地执行此流程在每个值上,这已经在公共路径上增加了大量的开销。