Pentium FDIV バグ

Pentium FDIV バグは、インテルのPentiumプロセッサに含まれていた、特定の値の除算の結果が誤ったものになる、というバグである。

発端
1994年10月30日、リンチバーグ大学のThomas Nicely教授はPentiumプロセッサの浮動小数点演算ユニットにバグがあることを報告した。その内容は、とある割り算を行うと非常に小さな量だけ間違った値を返すというものだった。この結果はインターネットを通じて他の人々の手で素早く検証された。そして問題を起こすのがPentiumプロセッサのx87浮動小数点除算命令であることと、そのニモニックFDIVからPentium FDIV バグとして知られるようになった。また、別の人々はPentiumが返す結果が引き起こす割り算問題は、100万回に高々61回までしか起こらないことを見つけた（これは、オペランドの色々な値に対して、という意味である。このバグは特定の値に対して必ず起きる）。

この問題はPentiumプロセッサの特定のモデルのみで発生する。120MHz以上のクロックのPentium系プロセッサのモデルには、このバグはない。

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

当初の対応
この報告によって大論争が巻き起こった。インテルは最初この問題の存在を否定していた。やがて、インテルは問題を認めたが、誤りは重大ではなく、たいていのユーザーには影響がないと主張する一方で、影響があると確認できたユーザーにはプロセッサの交換を行うと表明した。平行して、FDIVと同等の除算を行うルーチンを公開し、エラッタ回避の為にこのルーチンを用いるように求めたが、これはFDIV命令より実行に時間がかかりパフォーマンスに悪影響を及ぼした。

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

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

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

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黒歴史の中でバグについて取り上げている。

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