首页 > 解决方案 > 为什么非正规浮点值的处理速度较慢?

问题描述

通常情况下,消耗或产生非正规的浮点值比其他情况要慢,有时要慢得多。

为什么会这样?如果是因为它们陷入软件而不是直接在硬件中处理,就像在某些 CPU 上所说的那样,为什么它们必须这样做?

标签: floating-point

解决方案


对于 IEEE-754 浮点,遇到的大多数操作数都是规范化的浮点数,并且处理器中的内部数据路径是为规范化的操作数构建的。额外的指数位可用于内部表示,以始终在数据路径内保持浮点操作数标准化。

因此,任何次正规输入都需要额外的工作来首先确定前导零的数量,然后在调整指数的同时左移有效数字以进行归一化。低于标准的结果需要将有效数字右移适当的量,并且可能需要将舍入推迟到发生之后。

如果纯粹用硬件解决,这项额外的工作通常需要额外的硬件和额外的流水线阶段:一个,甚至可能是两个额外的时钟周期,每个时钟周期用于处理次正常输入和次正常输出。但是典型 CPU 的性能对指令的延迟很敏感,并且要花费大量精力来保持较低的延迟。FADD、FMUL 或 FMA 指令的延迟通常在 3 到 6 个周期之间,具体取决于实现和频率目标。

因此,为可能处理次正规操作数增加 50% 的额外延迟是没有吸引力的,因为对于大多数用例来说,次正规操作数很少见。使用“使常见情况快速,不常见情况功能化”的设计理念,因此有很大的动力将次规范操作数的处理从“快速路径”(纯硬件)推到“慢速路径”(组合现有硬件加软件)。

我参与了 x86 处理器的浮点单元的设计,处理次规范的常用方法是在需要处理这些异常时调用内部微代码级异常。这种不正常的处理可能需要大约 100 个时钟周期。其中最昂贵的部分通常不是修复代码本身的执行,而是进出微码异常处理程序。

我知道特定的用例,例如数字信号处理中的特定滤波器,在这些情况下,遇到次常态是很常见的。为了快速支持此类应用程序,许多浮点单元支持非标准清零模式,其中次正规编码被视为零。

请注意,有些面向吞吐量的处理器设计具有显着的延迟容限,尤其是 GPU。我对 NVIDIA GPU 很熟悉,而且我可以说他们在处理次规范操作数时没有额外的开销,并且在过去十几年左右的时间里一直这样做。据推测,这是以增加流水线阶段为代价的,但供应商并未记录这些处理器的许多微架构细节,因此很难确定。以下论文可能会提供一些关于不同硬件设计如何处理次正规操作数的一般见解,其中一些开销很小:

EM Schwarz、M. Schmookler 和 SD Trong,“具有非规范化数字的 FPU 实现”。IEEE 计算机汇刊,卷。54,第 7 期,2005 年 7 月,第 825 - 836 页


推荐阅读