提问者:小点点

为什么非正态浮点值处理速度较慢?


通常情况下,使用或产生代数的浮点值比其他值慢,有时慢得多。

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


共1个答案

匿名用户

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

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

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

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

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

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

请注意,有些面向吞吐量的处理器设计具有显着的延迟容忍度,特别是GPU。我熟悉NVIDIAGPU,最好的情况是它们在没有额外开销的情况下处理亚正常操作数,并且在过去十几年中一直这样做。据推测,这是以额外的管道阶段为代价的,但供应商没有记录这些处理器的许多微架构细节,因此很难确定。下面的论文可能会提供一些一般的见解,不同的硬件设计如何处理亚正常操作数,其中一些开销非常小:

E. M.Schwarz、M.Schmookler和S.D.Trong,“具有非规范化数字的FPU实现”IEEE计算机交易,第54卷,第7期,2005年7月,第825-836页