通常情况下,消耗或产生异常的浮点值比其他情况要慢一些,有时要慢得多。
为什么会这样?如果是因为它们陷入了软件中,而不是像某些CPU那样直接在硬件中处理,那么为什么他们必须这样做?
答案 0 :(得分:1)
对于IEEE-754浮点,遇到的大多数操作数都是标准化的浮点数,并且处理器中的内部数据路径是针对标准化的操作数构建的。额外的指数位可用于内部表示,以使浮点操作数始终在数据路径内保持规范。
因此,任何次正规输入都需要额外的工作才能首先确定前导零的数量,然后在调整指数的同时左移有效位数以进行归一化。超出正常水平的结果需要将有效数右移适当的量,并且可能需要将舍入时间推迟到发生这种情况之后。
如果仅通过硬件解决,则此额外工作通常需要额外的硬件和额外的流水线阶段:一个,甚至两个额外的时钟周期,每个时钟周期分别用于处理次标准输入和次标准输出。但是,典型的CPU的性能对指令的延迟很敏感,因此要花费大量精力来保持较低的延迟。根据实现和频率目标,FADD,FMUL或FMA指令的等待时间通常在3到6个周期之间。
因此,对次标准操作数的潜在处理增加50%的额外延迟因此没有吸引力,甚至更是如此,因为在大多数情况下,次标准操作数很少见。因此,使用“使普通情况快速而罕见的情况起作用”的设计原理,就有了很大的动力将对非正规操作数的处理从“快速路径”(纯硬件)推到“慢速路径”(组合) 现有硬件和软件)。
我参与了x86处理器的浮点单元的设计,处理次规范的常见方法是在需要处理它们时调用内部微代码级异常。这种不正常的处理可能需要100个时钟周期。其中最昂贵的部分通常不是修复代码本身的执行,而是进入和退出微代码异常处理程序。
我知道一些特定的用例,例如数字信号处理中的特殊滤波器,在这种情况下,经常遇到次规范。为了快速支持此类应用,许多浮点单元支持非标准的“清零”模式,在这种模式下,次正规编码被视为零。
请注意,有些面向吞吐量的处理器设计具有显着的延迟容忍度,尤其是GPU。我熟悉NVIDIA GPU,最好的说是它们可以处理次标准操作数而没有额外的开销,并且在过去十几年中就已经做到了。大概这是以增加额外的流水线阶段为代价的,但是供应商没有记录这些处理器的许多微体系结构细节,因此很难确定。以下文章可能提供一些一般见解,即不同的硬件设计如何处理次标准操作数,其中一些操作开销很小:
E.M。 Schwarz,M.Schmookler和S.D.错误的是,“ FPU实现具有非规范化的数字。” IEEE在计算机上的交易,第1卷。 54,2005年7月7日,第825-836页