コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

Pentium FDIV バグ

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Pentium FDIV バグは、インテルPentiumプロセッサに含まれていた、特定の値の除算の結果が誤ったものになる、というバグである[1](コンピュータ業界内部では「ソフトウェアの記述ミス」を「バグ」、「CPUコア内部の設計ミス」を「エラッタ」と称する。よって厳密に言うならば、本項は「バグ」ではなく「エラッタ」と呼称するのが妥当である)。

発端

[編集]

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

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

原因

[編集]

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

当初の対応

[編集]

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

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

交換

[編集]

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

結果

[編集]

結局インテルは根拠のないリコールをさせられたと言う人もいる[誰によって?]。ただ、科学技術計算などでは演算結果がすべてなので、計算を誤る可能性がごく僅かであるとしても万全の信頼をおけないのであれば研究や仕事において致命的である人たちもいたこともまた事実である。前述のようにこのバグをソフトウェア的に回避できるが、引き換えに演算速度が遅くなり、結局以前のプロセッサで実行する方が早くなってPentiumプロセッサを使う意味が全くなくなってしまう。演算精度を重視する顧客は敢えてi486の高ランク品を選んだり、AMDなど競合他社の製品を選んだりした。[要出典]この問題はそのような科学技術系などの計算目的でプロセッサを購入した人をインテルが切り捨てるのか、切り捨てないのかという問題でもあった。

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

関連項目

[編集]

脚注

[編集]
  1. ^ a b c コンピュータアーキテクチャの話(90) Pentiumの割り算器のバグ”. TECH+(テックプラス) (2007年8月11日). 2024年2月22日閲覧。
  2. ^ a b c 半導体業界用語の基礎知識 「エラッタとバグ」 - 吉川明日論の半導体放談(129)”. TECH+(テックプラス) (2020年3月31日). 2024年2月22日閲覧。
  3. ^ a b コンピューターの不具合と現代社会 - 吉川明日論の半導体放談(291)”. TECH+(テックプラス) (2024年2月21日). 2024年2月22日閲覧。
  4. ^ Intelプロセッサ向けマイクロコードアップデートのニュースをファクトチェック!”. @IT. 2024年2月22日閲覧。

参考文献

[編集]
  • デイビッド・A・パターソンジョン・L・ヘネシー 著、成田光彰 訳『コンピュータの構成と設計 第3版』 上、日経BP社、2006年、203-206頁。ISBN 978-4-8222-8266-0 

外部リンク

[編集]