通常情况下,消耗或产生非正规值的浮点值比其他情况慢,有时慢得多。
为什么会这样呢?如果是因为它们被软件捕获而不是直接在硬件中处理(据说在某些 CPU 上就是如此),那么为什么它们必须这样做呢?
对于 IEEE-754 浮点,遇到的大多数操作数都是标准化浮点数,并且处理器中的内部数据路径是为标准化操作数构建的。附加指数位可用于内部表示,以始终保持数据路径内的浮点操作数标准化。
因此,任何次正规输入都需要额外的工作,首先确定前导零的数量,然后左移有效数以进行标准化,同时调整指数。低于正常的结果需要将有效数右移适当的量,并且舍入可能需要推迟到发生这种情况之后。
如果纯粹用硬件解决,这种额外的工作通常需要额外的硬件和额外的流水线级:一个、甚至两个额外的时钟周期,每个时钟周期用于处理次正常输入和次正常输出。但典型 CPU 的性能对指令的延迟很敏感,并且需要花费大量精力来保持较低的延迟。 FADD、FMUL 或 FMA 指令的延迟通常在 3 到 6 个周期之间,具体取决于实现和频率目标。
比如说,增加 50% 的额外延迟潜在的因此,处理次正规操作数没有吸引力,更是如此,因为次正规操作数对于大多数用例来说很少见。因此,使用“使常见情况更快,使不常见情况功能化”的设计理念,有很大的动力将次正规操作数的处理从“快速路径”(纯硬件)推向“慢速路径”(组合)的existing硬件加软件)。
我参与了 x86 处理器浮点单元的设计,处理次正规的常见方法是在需要处理这些次正规时调用内部微代码级异常。这种非正常处理可能需要大约 100 个时钟周期。其中最昂贵的部分通常不是修复代码本身的执行,而是进出微代码异常处理程序。
我知道特定的用例,例如数字信号处理中的特定滤波器,其中遇到次正规的情况很常见。为了快速支持此类应用程序,许多浮点单元支持非标准清零模式,其中次正规编码被视为零。
请注意,有些面向吞吐量的处理器设计具有显着的延迟容忍度,特别是 GPU。我很熟悉 NVIDIA GPU,据我所知,它们可以在没有额外开销的情况下处理次正规操作数,并且在过去十几年左右的时间里一直这样做。据推测,这是以额外的管道阶段为代价的,但供应商没有记录这些处理器的许多微架构细节,因此很难确定。以下论文可能会提供一些不同硬件设计如何处理次正规操作数的一般见解,其中一些操作数的开销非常小:
E.M. 施瓦茨、M. 施莫克勒和 S.D. Trong,“具有非规范化数字的 FPU 实现。”IEEE 计算机汇刊,卷。 54,第 7 期,2005 年 7 月,第 825 - 836 页
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)