Denormals表现不佳,大约100倍左右。这经常导致unexpected软件problems。
我很奇怪,从CPU体系结构的角度来看,为什么非正规数必须那么多更慢?缺乏表现是否是他们不幸的表现所固有的?或者CPU建筑师可能会忽略它们以减少硬件成本(错误的)假设非正常情况并不重要?
在前一种情况下,如果非正规本质上是硬件不友好的,那么是否已知非IEEE-754浮点表示在零附近也是无间隙的,但是对于硬件实现更方便?
答案 0 :(得分:6)
在大多数x86系统上,缓慢的原因是非正规值会触发FP_ASSIST,因为它切换到微代码流(非常像故障),这非常昂贵。
参见例如 - https://software.intel.com/en-us/forums/intel-performance-bottleneck-analyzer/topic/487262
原因为什么会出现这种情况,可能是建筑师决定通过推测每个值进行规范化(这将更为常见)来优化HW的正常值,并且不想要为了罕见的角落案件,冒着频繁使用案例的风险。这种猜测通常是正确的,因此您只有在出错时才支付罚金。这些权衡在CPU设计中非常普遍,因为在一种情况下的任何投资通常会增加整个系统的开销。
在这种情况下,如果您要设计一个试图优化所有类型的不规则FP值的系统,则必须添加HW以检测并记录每个操作后的每个值的状态(将乘以物理FP寄存器,执行单元,RS条目等的数量 - 在大量晶体管和电线中总计。 或者,您必须添加一些机制来检查读取时的值,这会在读取任何FP值时降低速度(即使是正常值)。
此外,根据类型,您需要执行一些修正 - 在x86上这是辅助代码的目的,但如果您没有进行推测,则必须在每个修改时有条件地执行此流程value,它已经在公共路径上添加了大量的开销。
答案 1 :(得分:3)
在许多体系结构中,FPU(H / W)不处理非正规数 - 因此将实现留给s / w
这里有一个很好的基本介绍 https://en.wikipedia.org/wiki/Denormal_number
在效果问题下 -