非规范化数比规范化数慢得多,大约慢100倍左右。这常常导致意外的软件问题。 从CPU架构的角度来看,我很好奇,为什么非规范化数要慢那么多呢?这种性能缺失是与它们的不幸表示方式有关吗?还是CPU架构师忽略了它们,以减少硬件成本,错误地认为非规范化数无关紧要? 如果是前者,如果非规范化数在硬件上固有的不友好,是否存在已知的非IEEE-754浮点表示,也靠近零但对于硬件实现更方便?
在大多数x86系统上,性能较慢的原因是非规格化的值会触发FP_ASSIST。这个过程非常昂贵,因为它会切换到一个类似于错误处理的微代码流程中。(与故障非常相似)。例如 - https://software.intel.com/en-us/forums/intel-performance-bottleneck-analyzer/topic/487262 之所以这样做,可能是因为架构师们决定通过猜测每个值都被规格化(这将更为常见),来优化正常值的硬件,并不想因为罕见的特殊情况而牺牲频繁使用情况的性能。这种猜测通常是正确的,所以只有在你猜错时才会付出代价。这些权衡在CPU设计中非常常见,因为在一个情况中的任何投资通常会给整个系统增加开销。在这种情况下,如果你要设计一个尝试优化所有类型的不规则FP值的系统,你将不得不添加一些用于检测并记录每个操作后每个值的状态的硬件(这将乘以物理FP寄存器、执行单元、RS条目等的数量,总计产生大量的晶体管和导线)。或者,你需要添加一些机制来检查读取的值,这将在读取任何FP值时都会减慢速度(即使是规格化值)。此外,根据类型,您需要执行某些更正操作或不执行-在x86上,这就是辅助代码的目的,但如果您没有做出猜测,那么您将不得不有条件地对每个值执行此流程,在常见路径上已经增加了大量的开销。
在许多架构中,浮点数的denormals(非规格化数)不会被FPU(硬件)处理 - 这意味着实现需要由软件来完成。 这里有一个很好的基本介绍:https://en.wikipedia.org/wiki/Denormal_number 在性能问题下 -