英特尔 4.75 亿美元的错误:奔腾部门漏洞背后的硅片

1993 年英特尔发布高性能奔腾处理器,开启奔腾系列。一年后,数论教授尼科利发现奔腾处理器浮点除法有时出错,虽英特尔认为是小问题,但最终花费 4.75 亿美元为用户更换芯片。

  • 奔腾处理器的除法算法及 FDIV 错误:奔腾使用 SRT 除法算法,比 486 处理器更快,但因查找表缺失 5 或 16 个条目导致 FDIV 错误,影响除法运算准确性。该查找表用于提供商数位,在可编程逻辑阵列(PLA)中实现,原本有 2048 个条目,因数学错误实际缺失 16 个条目,其中 5 个导致错误,11 个无影响。
  • SRT 除法算法工作原理:计算机除法通常类似小学长除法,奔腾使用基于四进制的 SRT 算法,每步生成两位商,速度是标准二进制除法的两倍,但需要更多硬件,如查找表、加法/减法电路等。
  • 奔腾查找表的结构:查找表用于提供商数位,有 2048 个条目,分为对应商数位 +2、+1、0、-1、-2 的五个区域,上下区域未使用并填充为 0,其中五个关键条目应为 +2 却被错误填充为 0,导致 FDIV 错误。
  • 查找表在 PLA 中的实现:查找表通过 PLA 更紧凑地存储在奔腾芯片中,节省大量空间。PLA 通过“与或”逻辑实现任意逻辑函数,除法 PLA 有 22 个输入和两个输出,通过晶体管模式确定表内容,一个 PLA 行可生成多个表单元格,提高效率。
  • 查找表的数学边界:除法算法的关键步骤是用部分余数除以除数得到商数位,SRT 算法的商数位区域有重叠,若选择错误的商数位,算法无法恢复,导致 FDIV 错误。P-D 表定义了部分余数和除数对应的商数位区域,奔腾的查找表基于此,但有额外约束。
  • 进位保存和进位前瞻加法器:奔腾除法电路使用进位保存加法器进行加法和减法,以提高速度,但会导致查找表索引可能出错,因为部分余数被截断,加法器计算的表索引可能比实际部分余数低 1/8,英特尔对此调整错误,引发 FDIV 错误。该错误极其罕见,约 90 亿次随机除法中才出现一次。
  • 查找表出错原因:英特尔定义查找表上限时选择了错误的约束线,导致部分应为 +2 的单元格被错误填充为 0,这是 FDIV 错误的根本原因。英特尔称错误是脚本下载表时遗漏条目导致,作者认为是数学错误,罗伯特·科尔威尔的解释也存在问题。
  • 英特尔如何修复错误:英特尔修复 FDIV 错误的方式是将未使用的查找表条目都填充为 2,使 PLA 方程更简单,约 1/3 的 PLA 术语被移除,更新后的 PLA 比原 PLA 小约 1/3,且新 PLA 的术语与旧 PLA 完全不同。
  • FDIV 错误的影响:英特尔认为 FDIV 错误对大多数用户不重要,典型用户可能每 27000 年才会遇到一次,IBM 分析认为错误可能每天都会影响客户,最终英特尔同意为所有客户更换芯片。作者认为只有一人注意到实际使用中的错误,多数人不会遇到,替换芯片代价大。
  • 结论:FDIV 错误是著名的处理器错误,英特尔还曾有 386 处理器的 32 位乘法问题和 Pentium 的“F00F 错误”。奔腾使用更复杂的电路和算法,如 SRT 除法算法,随着晶体管数量增加,处理器变得更复杂。FDIV 错误对英特尔的长期影响存在争议,竞争对手受益,也有人认为为英特尔带来了知名度。未来,微码补丁将继续用于解决处理器问题。
阅读 7
0 条评论