Pentium FDIV バグ
From Wikipedia, the free encyclopedia
1994年10月30日、リンチバーグ大学のThomas R. Nicely数学教授は、Pentiumプロセッサの浮動小数点演算ユニットにバグがあることを報告した。その内容は、とある割り算を行うと非常に小さな量だけ間違った値を返すというものだった。
当時、教授はブルン定数などの数値計算を行っていたが、同年6月頃に別の問題が発生し、その修正に追われた[注 1]。修正には数ヶ月を費やし、9月10日からバグ修正が終わったコードで計算をはじめたところ、10月4日にPentium 60とi486で計算結果に相違があることに気づいた[注 2]。10月17日、同僚の所有する新品のPentium 60で試した結果も、使用しているマザーボードが異なるにもかかわらず結果は同じであった。このi486との差異はFPUを無効にして実行する[注 3]と解消した。その後も複数の環境で動作確認を行った後、教授は10月24日にインテルのテクニカルサポートに報告をしたが、数日中に回答するという約束にも関わらず返答がなかっため[注 4]、10月30日に様々な学術関係者にこのバグに関する電子メールを送った[注 5][2][3]。
この結果はインターネットを通じて他の人々の手で素早く検証された[4]。そして問題を起こすのがPentiumプロセッサのx87浮動小数点除算命令であることと、そのニモニックFDIVからPentium FDIV バグとして知られるようになった[4]。また、別の人々はPentiumが返す結果が引き起こす割り算問題は、100万回に高々61回までしか起こらないことを見つけた。これは、オペランドの色々な値に対して問題が発生する割合であり、この問題は特定の値に対して必ず起きる。
この問題はPentiumプロセッサの特定のモデルのみで発生する[注 6][5]。120MHz以上のクロックのPentium系プロセッサのモデルには、このバグはない。
原因
Pentiumで新たに実装された除算回路の設計ミスが原因で計算を誤ることが後に明らかにされた[6]。インテルのCPUの除算命令の実行はi486まで、non-restoringなどに見られるような1ステップで1ビットずつ商を求める方式によっていたが、PentiumではSRT法を導入し、1ステップで2ビットずつ商を求めるようにし、除算に要するステップ数を約半分にした。このアルゴリズムでは商を求める際に表(ルックアップテーブル)を参照するが、その表のエントリの一部の内容が誤っていた。すなわち、表のなかで参照されるエントリは一部であり、それ以外の参照されないエントリについてはゼロを設定したが、実際には参照されるエントリのごく一部についても参照されることがないと誤解し、本来有意な値を設定するべきエントリのうち5個に誤ってゼロが設定された。そのために除算の途中で当該エントリを参照すると以後の演算を誤る。ここから、誤ったエントリを参照する特定の値をFDIV命令のオペランドに与えると必ず演算を誤ることになり、確率的・偶発的に誤りが発生するのではないことがわかる。
当初の対応
この報告によって大論争が巻き起こった[注 7][3]。インテルは当初この問題の存在を否定していた。やがて、インテルは問題を認めたが、誤りは重大ではなく、たいていのユーザーには影響がないと主張する[4]一方で、影響があると確認できたユーザーにはプロセッサの交換を行うと表明した[1]。並行して、FDIVと同等の除算を行うルーチンを公開し、エラッタ回避の為にこのルーチンを用いるように求めたが、これはFDIV命令より実行に時間がかかりパフォーマンスに悪影響を及ぼした。
多くの独自の検証によって、このバグはほとんど重要ではなく、たいていのユーザーに対する影響は無視してもよいと分かったが、このインテルの対応は非常に大きな抗議を引き起こした。当時インテルのPentiumに競合する「586」クラスの互換プロセッサを提供する企業やPowerPCの売り込みを図ったIBMのような企業は、一緒になって非難した[7]。例えばインテルが計算を誤る確率はとても小さく隕石に当たるリスクが実質的に無視出来るのと同様であると表現したのに対して、競合他社は隕石の軌道を計算して落ちてくる所に立てば必ず当たると皮肉を込めて非難した。
交換
12月20日、ついにインテルは、要求があればバグのあるPentiumプロセッサをすべて修正品と交換するという、潜在的には非常に大きな損失をこうむる可能性のある対応を申し出た[1][8]。これはコンピュータチップとしては初の自主回収の事例となった[9]。しかし、このチップ交換を行った顧客はほとんどがIBMをはじめとする大手ユーザーで、個人顧客はほんの少数であったことが判明した[7]。一大企業の広報としてはしばしば陥る悪夢ではあったが、実際にはすでに織り込み済みだと認識され、交換を発表したその日のインテルの株価は上がった。
この結果、インテルはチップの交換費用や在庫の廃棄などのために、1994年次に4億7500万ドルの税引前費用を計上することとなったが、同年次の純利益は最終的に前年並みの23億ドル弱を確保し、業績への影響は限定的で済むこととなった[10]。
結果
結局インテルは根拠のないリコールをさせられたと言う人もいる[誰によって?]。ただ、科学技術計算などでは演算結果がすべてなので、計算を誤る可能性がごく僅かであるとしても万全の信頼をおけないのであれば研究や仕事において致命的である人たちもいたこともまた事実である。前述のようにこのバグをソフトウェア的に回避できるが、引き換えに演算速度が遅くなり、結局以前のプロセッサで実行する方が早くなってPentiumプロセッサを使う意味が全くなくなってしまう。演算精度を重視する顧客は敢えてi486の高ランク品を選んだり、AMDなど競合他社の製品を選んだりした。[要出典]この問題はそのような科学技術系などの計算目的でプロセッサを購入した人をインテルが切り捨てるのか、切り捨てないのかという問題でもあった。
Pentium Pro以後のCPUではマイクロコードを修正する手段が盛り込まれている。書き換え可能なコントロールストアを持ち、エラッタが生じた場合にはBIOSやOSのアップデータを介してこれを回避するマイクロコードを提供する[11]。これにより、CPUの交換によらずにエラッタを回避する。
関連項目
- Pentium F00F バグ
- ブルン定数 - この計算をPentiumで行わせた過程で、本稿で取り上げたFDIVのバグが発覚した。
- ファームウェア