Pentium FDIV バグ

Pentium FDIV バグは、インテルのPentiumプロセッサに含まれていた、特定の値の除算の結果が誤ったものになる、というバグである。なお、「ソフトウェアの設計・記述ミス」を「バグ」、「CPUを始めとするチップの設計ミス」を「エラッタ」と称する。よって厳密にはこの問題はエラッタと言うべきだが、慣習的にバグと称され、報道等でもバグと表現されている。本項でもバグと呼ぶ。

発端
1994年10月30日、リンチバーグ大学のThomas R. Nicely数学教授は、Pentiumプロセッサの浮動小数点演算ユニットにバグがあることを報告した。その内容は、とある割り算を行うと非常に小さな量だけ間違った値を返すというものだった。

当時、教授はブルン定数などの数値計算を行っていたが、同年6月頃に別の問題が発生し、その修正に追われたこの問題にはBorland Cコンパイラのエラー（fmod() および fmodl()でのFPREM命令の扱いの不具合）も含まれていた。このため、FDIVバグがソフトウェアやコンパイラのバグではなく、プロセッサの問題であることの確認には時間を要することになった。。修正には数ヶ月を費やし、9月10日からバグ修正が終わったコードで計算をはじめたところ、10月4日にPentium 60とi486で計算結果に相違があることに気づいた双子素数 (824633702441, 824633702443) の逆数の和の計算の際に、PentiumのFPUが 1/824633702441 で誤った値を返していた。。10月17日、同僚の所有する新品のPentium 60で試した結果も、使用しているマザーボードが異なるにもかかわらず結果は同じであった。このi486との差異はFPUを無効にして実行する整数演算を組み合わせて浮動小数点演算をエミュレートする演算ライブラリを使用する。と解消した。その後も複数の環境で動作確認を行った後、教授は10月24日にインテルのテクニカルサポートに報告をしたが、数日中に回答するという約束にも関わらず返答がなかっため教授はその後11月3日に問題が修正されている交換用のCPUを受け取っているが、これはインテルが事前にこの問題を把握しており、既に修正されたチップを生産していたことを示す。、10月30日に様々な学術関係者にこのバグに関する電子メールを送った1994年当時は、まだウェブページなどは一般的ではなかったため、送信されたメールはまずCompuServeのフォーラムに転載され、そこからさらに複数の人物を経由してネットニュースに投稿されるなどで広まっていった。。。

この結果はインターネットを通じて他の人々の手で素早く検証された。そして問題を起こすのがPentiumプロセッサのx87浮動小数点除算命令であることと、そのニモニックFDIVからPentium FDIV バグとして知られるようになった。また、別の人々はPentiumが返す結果が引き起こす割り算問題は、100万回に高々61回までしか起こらないことを見つけた。これは、オペランドの色々な値に対して問題が発生する割合であり、この問題は特定の値に対して必ず起きる。

この問題はPentiumプロセッサの特定のモデルのみで発生するステッピングレベルB1/C1のPentium P5（60/66MHz）、ステッピングレベルB1/B3のPentium P54C（75/90/100MHz）が該当する。。120MHz以上のクロックのPentium系プロセッサのモデルには、このバグはない。

原因
Pentiumで新たに実装された除算回路の設計ミスが原因で計算を誤ることが後に明らかにされた。インテルのCPUの除算命令の実行はi486まで、non-restoringなどに見られるような1ステップで1ビットずつ商を求める方式によっていたが、PentiumではSRT法を導入し、1ステップで2ビットずつ商を求めるようにし、除算に要するステップ数を約半分にした。このアルゴリズムでは商を求める際に表（ルックアップテーブル）を参照するが、その表のエントリの一部の内容が誤っていた。すなわち、表のなかで参照されるエントリは一部であり、それ以外の参照されないエントリについてはゼロを設定したが、実際には参照されるエントリのごく一部についても参照されることがないと誤解し、本来有意な値を設定するべきエントリのうち5個に誤ってゼロが設定された。そのために除算の途中で当該エントリを参照すると以後の演算を誤る。ここから、誤ったエントリを参照する特定の値をFDIV命令のオペランドに与えると必ず演算を誤ることになり、確率的・偶発的に誤りが発生するのではないことがわかる。

当初の対応
この報告によって大論争が巻き起こった当時議論の中心だったネットニュースのcomp.sys.intelには、ピーク時で週に2000件を超える投稿があり、さらに300以上の別のニュースグループにも議論が広まっていった。。インテルは当初この問題の存在を否定していた。やがて、インテルは問題を認めたが、誤りは重大ではなく、たいていのユーザーには影響がないと主張する一方で、影響があると確認できたユーザーにはプロセッサの交換を行うと表明した。並行して、FDIVと同等の除算を行うルーチンを公開し、エラッタ回避の為にこのルーチンを用いるように求めたが、これはFDIV命令より実行に時間がかかりパフォーマンスに悪影響を及ぼした。

多くの独自の検証によって、このバグはほとんど重要ではなく、たいていのユーザーに対する影響は無視してもよいと分かったが、このインテルの対応は非常に大きな抗議を引き起こした。当時インテルのPentiumに競合する「586」クラスの互換プロセッサを提供する企業やPowerPCの売り込みを図ったIBMのような企業は、一緒になって非難した。例えばインテルが計算を誤る確率はとても小さく隕石に当たるリスクが実質的に無視出来るのと同様であると表現したのに対して、競合他社は隕石の軌道を計算して落ちてくる所に立てば必ず当たると皮肉を込めて非難した。

交換
12月20日、ついにインテルは、要求があればバグのあるPentiumプロセッサをすべて修正品と交換するという、潜在的には非常に大きな損失をこうむる可能性のある対応を申し出た。これはコンピュータチップとしては初の自主回収の事例となった。しかし、このチップ交換を行った顧客はほとんどがIBMをはじめとする大手ユーザーで、個人顧客はほんの少数であったことが判明した。一大企業の広報としてはしばしば陥る悪夢ではあったが、実際にはすでに織り込み済みだと認識され、交換を発表したその日のインテルの株価は上がった。

この結果、インテルはチップの交換費用や在庫の廃棄などのために、1994年次に4億7500万ドルの税引前費用を計上することとなったが、同年次の純利益は最終的に前年並みの23億ドル弱を確保し、業績への影響は限定的で済むこととなった。

結果
この問題はそのような科学技術系などの計算目的でプロセッサを購入した人をインテルが切り捨てるのか、切り捨てないのかという問題でもあった。

Pentium Pro以後のCPUではマイクロコードを修正する手段が盛り込まれている。書き換え可能なコントロールストアを持ち、エラッタが生じた場合にはBIOSやOSのアップデータを介してこれを回避するマイクロコードを提供する。これにより、CPUの交換によらずにエラッタを回避する。

 関連項目 
 Pentium F00F バグ
 ブルン定数 - この計算をPentiumで行わせた過程で、本稿で取り上げたFDIVのバグが発覚した。
 ファームウェア

 脚注 

 注釈 

 参考文献 

 外部リンク 
 Thomas R. Nicely's Home Page - バグを発見したNicely教授の個人ウェブサイト
 Bugs in the Intel Microprocessors - 原因とともに正確な情報が記されたページ
 Ivars Peterson's MathTrek: Pentium Bug Revisited
 A Tale of Two Numbers, by Cleve Moler of The MathWorks 
 さらなる詳細が込められたZIPファイル
 FDIV Replacement Program - FDIV Replacement Program Home - インテル公式サイト
 IntelによるSRT法の解説 - インテル公式サイト
 CPU黒歴史 大損失と貴重な教訓を生んだPentiumのバグ - CPU黒歴史の中でバグについて取り上げている。

Category:X86アーキテクチャ
Category:インテルのマイクロプロセッサ
Category:ハードウェアバグ
Category:リコール (一般製品)