【问题标题】:Why denormalized floats are so much slower than other floats, from hardware architecture viewpoint?从硬件架构的角度来看,为什么非规范化浮点数比其他浮点数慢得多?
【发布时间】:2016-08-15 09:06:41
【问题描述】:

Denormals 的表现严重低于正常水平,大约是正常水平的 100 倍。这经常导致unexpected 软件problems

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

在前一种情况下,如果非规范化本质上对硬件不友好,是否存在已知的非 IEEE-754 浮点表示,它们在接近零时也是无间隙的,但更便于硬件实现?

【问题讨论】:

  • 非规范化需要额外的规范化(输入)和非规范化(输出)步骤。一些处理器架构会增加额外的硬件(移位器和控制逻辑)来全速处理这个问题,例如NVIDIA GPU,其他处理器架构通过微码的内部异常处理来处理这个问题,例如大多数 x86 CPU,这可以节省硬件但速度要慢得多。后一种方法的理由是用最少的硬件支出正确处理频繁情况和不频繁情况(例如无穷大、NaN、非正规)。
  • @njuffa:为什么不回答这个问题?
  • E.M. Schwarz、M. Schmookler 和 S.D.Trong,“非规范化数字的硬件实现”。在:Proceedings 16th IEEE Symposium on Computer Arithmetic,2003 年 6 月 15 日,第 70-78 页。 (online version)
  • @PeterCordes 请注意,我说的是“大多数 x86 CPU”。它甚至可能在同一个处理器中有所不同:最初的 AMD Athlon 处理器在读取路径中具有对非规范化的硬件支持(通过动态延长管道;对此有专利),但存储路径中的非规范化微码异常处理程序(到避免非正规支持的开销在没有非正规的常见情况下减慢存储加载转发路径)。
  • 处理涉及零、无穷大和 NaN 的特殊情况通常由特殊硬件执行(例如,在各种 AMD x86 处理器上),并且与处理非正规的问题略有不同,因为硬件开销可以保持相当小并涉及通常不会影响管道长度的并行硬件路径,而非规范处理通常会影响管道长度(增加长度)。

标签: floating-point cpu-architecture


【解决方案1】:

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

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

出现这种情况的原因可能是架构师决定通过推测每个值都被标准化(这将更常见)来优化正常值的硬件,并且不希望为了罕见的极端情况,冒着频繁用例的性能风险。这种猜测通常是正确的,因此您只有在错误时才支付罚款。这些权衡在 CPU 设计中非常常见,因为在一种情况下的任何投资通常都会增加整个系统的开销。

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

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

【讨论】:

  • 在读取时检测异常不是很便宜吗?全零指数和非零尾数?我想生成它仍然需要几个门延迟,但我认为真正的成本将在非规范处理的硬件实现中。如果您有正常和非正常处理硬件,则两者都可以开始并行工作,并且一旦产生结果,您将从非正常检测器选择的任何一个中获取结果。
  • re:在寄存器中标记 FP 值等等:例如,当使用 mulps 指令的输出作为 mulpd 指令的输入时,Agner Fog 在 AMD CPU 上发现了很大的延迟。他的猜测是 AMD CPU 用某些东西标记了 FP 向量的元素。 (并且当错误代码导致错误推测时速度很慢)。
  • @PeterCordes,就像我说的,检查很简单,但即使在硬件中完成,它仍然需要条件检查或(如果我们按照你的想法)预测执行,两者都可能有惩罚.我想这是一个我们永远不会知道的设计决策(没有看到实际涉及的微代码)。
  • 然而,这是一个始终如一的设计决策;我所知道的所有架构都对非规范化有巨大的性能损失。似乎应该有一些与架构无关的原因。
【解决方案2】:

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

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

在性能问题下 -

【讨论】:

  • 这样的架构有哪些例子?例如,听起来 x86 不在其中。
  • 大多数现代架构都处理硬件中的非规范化,包括 x86。早期的 RISC 芯片往往不支持它,但最新版本的 ARM 肯定支持。
  • 许多架构所做的是处理微码中的次规范。这比在软件中处理它们更快、更简单。
  • 亚历克斯,我知道;我的问题不是是否是这样,而是为什么是这样。是什么让 CPU 架构师只在硬件中实现正常数字并冒着极大的减速风险,例如某些信号处理软件减速 10 倍? 为什么在硬件中实现法线和非规范化如此困难?
  • @dwelch:非正规不是“极端情况”。信号处理人员多次指出,由于非规范化处理“静默”会使系统陷入瘫痪,因为静默主要由非规范输入和 CPU 阻塞它们组成。这是一个真正的问题,而不是理论上的问题。
猜你喜欢
  • 2021-06-13
  • 2015-07-18
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2012-03-17
相关资源
最近更新 更多