1993年,英特尔意气风发地推出了Pentium处理器,这款划时代的产品在性能上实现了显著提升,尤其在浮点除法算法方面。
谁也没有料到,一个看似微不足道的错误,竟会引发一场席卷全球的科技巨震,最终让英特尔付出了4.75亿美元的惨痛代价。
这究竟是怎么回事?
让我们一起回到那个风起云涌的年代,探寻这个错误背后的故事。
故事的开端始于1994年,一位名叫Nicely的数论教授在研究孪生素数倒数时,意外地发现他的Pentium电脑在进行浮点除法运算时,偶尔会出现错误结果。
起初,英特尔将其视为一个无关紧要的小问题,这个“小问题”却像滚雪球般迅速扩大,最终演变成了媒体的头条新闻。
在铺天盖地的批评和负面宣传下,英特尔被迫同意更换所有有问题的Pentium芯片,为此付出了4.75亿美元的巨额经济损失。
那么,这个代价高昂的错误究竟是如何产生的呢?
核心问题在于Pentium处理器所使用的SRT除法算法。
为了追求更快的运算速度,Pentium采用了基数为4的SRT除法,它能够每一步生成两位商,效率是传统二进制除法的两倍。
该算法依赖于一个查找表来快速选择商数,而正是这个查找表中五个条目的缺失,导致了FDIV漏洞的出现。
实际上,早在Nicely教授之前,英特尔内部测试就已经发现了浮点除法的误差。
由于错误发生的概率极低,英特尔低估了问题的严重性,仅仅悄悄地修改了新版Pentium的电路,并未引起公众注意。
直到Nicely教授的发现以及他锲而不舍地向媒体和业内人士的呼吁,才最终将这个问题暴露在公众视野之下。
为了理解这个漏洞,我们需要了解一些浮点数的基础知识。
浮点数是一种用于表示极大或极小数值的计算机数据类型,它由有效数字和指数两部分组成。
IEEE 754标准规范了浮点数的表示方法,并被包括Pentium在内的大多数计算机所采用。
理想情况下,基本算术运算的结果应该精确到有效数字的最后一位,Pentium处理器上的除法运算却未能达到这一精度要求。
回到查找表本身,它包含2048个条目,分别对应不同的商数。
为了节省芯片空间,英特尔使用了名为PLA的可编程逻辑阵列来存储这个查找表。
PLA是一种高效的逻辑电路,可以根据输入信号生成相应的输出。
通过分析PLA中的晶体管模式,我们可以还原出查找表的内容,并发现导致错误的五个缺失条目。
更深层次的原因在于查找表的数学边界定义错误,以及进位保存加法器和超前进位加法器对表索引的影响。
由于进位保存加法器的截断效应,查找表索引的部分余数可能略低于实际值。
这导致在特定情况下,算法会访问到缺失的表条目,从而产生错误的除法结果。
英特尔的修复方案并非简单地添加缺失的条目,而是将所有未使用的条目都填充为2。
这个看似简单的改动,却巧妙地解决了问题,并简化了PLA的方程式,从而减少了晶体管的数量。
修正后的查找表不仅消除了访问缺失条目的可能性,还提高了电路的效率。
FDIV漏洞的影响究竟有多大?
这个问题在当时引发了激烈的争论。
英特尔认为,该错误发生的概率极低,对大多数用户而言无关紧要。
IBM的分析却表明,该问题可能会更频繁地影响用户,并因此停止了Pentium计算机的销售。
这场争论最终以英特尔的妥协告终,他们同意为所有客户更换有缺陷的芯片。
除了FDIV漏洞,英特尔的其他处理器也曾出现过类似问题,例如早期386处理器的乘法问题和后来的F00F错误。
这些错误都凸显了处理器设计和测试的复杂性,以及及时修复错误的重要性。
在Pentium Pro及之后的处理器中,英特尔引入了可修补的微代码,以便在发现错误后能够及时进行修复,而无需更换硬件。
从简单的整数运算到复杂的浮点除法,处理器的功能越来越强大,电路也越来越复杂。
随着摩尔定律的驱动,芯片上的晶体管数量呈指数级增长,这既带来了性能的提升,也增加了出错的风险。
从Pentium的FDIV漏洞到如今的各种安全漏洞,处理器的错误从未停止,而我们对更高性能和更安全的追求也从未止步。
那么,未来的处理器将会面临哪些新的挑战?
我们又该如何应对这些挑战?