インテルの4億7,500万ドルの失敗: Pentium FDIVバグのシリコン上の問題
(righto.com)インテルのPentium FDIVバグ
-
背景: 1993年、インテルは高性能なPentiumプロセッサを発売した。Pentiumには、従来のIntel 486プロセッサより高速な浮動小数点除算アルゴリズムを含む多くの改良があった。しかし1年後、数学教授のNicelyが双子素数の逆数を研究していた際に、Pentiumが浮動小数点除算を実行すると誤った結果を生成する問題を発見した。
-
バグの発見と影響: インテルはこの問題を「ごく些細な技術的問題」と見なしていたが、このバグは大きなメディア問題となった。最終的にインテルは欠陥のあるPentiumチップをすべて交換することを決定し、会社に4億7,500万ドルの費用をもたらした。
-
バグの原因: Pentiumの除算アルゴリズムはルックアップテーブルを使用する。インテルは1994年、このバグの原因はスクリプトの誤りによりテーブルから5つの項目が欠落したためだと発表したが、実際には数学的な誤りにより16個の項目が欠落していた。このうち5個の欠落項目がFDIVバグを引き起こした。
-
浮動小数点数の概要: 浮動小数点数は、非常に大きな数と非常に小さな数を表現できる。インテルの8087浮動小数点コプロセッサチップはIEEE 754標準の策定に貢献し、Pentiumを含むほとんどのコンピュータがこの標準を実装した。
-
SRT除算: PentiumはSRTアルゴリズムを用いて除算を実行し、これは標準的な2進除算より2倍高速である。SRTアルゴリズムは非標準的なアプローチを用いて商の桁を選択しやすくする。
-
ルックアップテーブルの構造: Pentiumのルックアップテーブルは2048個の項目を含み、そのうち5個の項目が欠落してFDIVバグを引き起こした。このテーブルはPLA(Programmable Logic Array)として実装されている。
-
バグの数学的境界: 除算アルゴリズムの中核となる段階は、部分剰余を除数で割って商の桁を得ることにある。この過程で誤ったq値が選ばれると、アルゴリズムは回復できない。
-
キャリーセーブ加算器とキャリールックアヘッド加算器: Pentiumの除算回路は、加算と減算を効率的に行うためにキャリーセーブ加算器を使用している。この加算器はFDIVバグを引き起こすうえで重要な役割を果たす。
-
バグ修正: インテルは、テーブル内の未使用項目をすべて2で埋めることでバグを修正した。これにより誤った項目にアクセスする可能性がなくなり、PLA方程式も単純化されてPLAがより小さくなった。
1件のコメント
Hacker Newsの意見
筆者はPentiumバグについて質問があれば答える用意がある
Intelのホワイトペーパーでは、一般ユーザーが問題に遭遇するのは27,000年に1回だと主張していたが、IBMは顧客が数日おきに問題に遭遇しうると分析していた
実際の使用中にバグを発見した人は1人しかいなかった
顧客のCPUを制御できなかったため、ライブラリに特別なコードを追加して問題を解決しなければならなかった経験を共有している
Intelのテーブル生成アルゴリズムの問題を指摘し、PRでは些細な問題として説明されていたが、実際にはもっと大きな問題だったことを強調している
Intelがテーブルの未使用エントリをすべて2で埋めた理由を疑問視している