
Pentium FDIVバグは、初期のIntel Pentiumプロセッサの浮動小数点ユニット(FPU)に影響を与えるハードウェアバグです。このバグにより、プロセッサは特定の高精度数値のペアを除算する際に、誤った2進浮動小数点演算結果を返します。このバグは、1994年にリンチバーグ大学の数学教授であるトーマス・R・ナイスリーによって発見されました。[ 1 ] FPUの浮動小数点除算アルゴリズムで使用されるルックアップテーブルに欠損値が存在するため、計算に小さな誤差が生じていました。特定の状況では、この誤差が頻繁に発生し、大きな偏差につながる可能性があります。[ 2 ]
FDIVバグの深刻さについては議論が続いています。ほとんどのユーザーが遭遇することは稀ですが(Byte誌は、ランダムパラメータによる浮動小数点除算の90億回に1回の割合で不正確な結果が生じると推定しています)、この欠陥とIntelの当初の対応は、技術コミュニティから厳しく批判されました。
1994年12月、インテルは欠陥のあるプロセッサをリコールしたが、これはコンピュータチップの初の完全リコールとなった。[ 4 ] 1994年度の年次報告書で、インテルは「これらのマイクロプロセッサの交換と償却に充てるため、税引前で4億7500万ドルの費用を負担した」と述べている。[ 5 ]
486DXよりも Pentium チップの浮動小数点除算の計算速度を向上させるために、インテルはシフト減算除算アルゴリズムをSweeney、Robertson、および Tocher (SRT) アルゴリズムに置き換えることを選択しました。 SRT アルゴリズムはクロック サイクルごとに 2 ビットの除算結果を生成できますが、486 のアルゴリズムでは 1 ビットしか生成できませんでした。実装されたルックアップ テーブルには、2,048 個のセルを持つプログラマブル ロジック アレイ(PLA)を使用していましたが、そのうち 1,066 個のセルには-2、-1、0、+1、+2の 5 つの値のいずれかが格納されるはずでした。[ 3 ] Pentium の元のアレイが製造に使用されるマスク パターンにコンパイルされたとき、+2 の 5 つの値がリソグラフィー装置で受信されませんでした。その結果、実際のチップのエッチングされた PLA の 5 つのアレイ セルには +2 が格納されるはずでしたが、実際には 0 が含まれていました。[ 6 ] [ 3 ]
その結果、これらの5つのセルに依存する計算は誤差を生じさせ、SRTアルゴリズムの再帰的な性質により誤差が蓄積される可能性があります。最悪の場合、誤差は結果の有効桁数5桁目まで上昇する可能性がありますが、これは稀であり、通常は有効桁数9桁目または10桁目に誤差が現れます。[ 3 ]
このバグは分子と分母の特定の組み合わせでのみ発生します。よく報告されている例としては、4,195,835を3,145,727で割るというものがあります。Windowsの電卓など、浮動小数点コプロセッサを使用するソフトウェアでこの計算を実行すると、ユーザーは自分のPentiumチップが影響を受けているかどうかを確認できます。[ 7 ]
計算の正しい値は次のとおりです。
プロセッサが使用する16進数値に変換すると、4,195,835 = 0x4005FB、3,145,727 = 0x2FFFFFとなります。0x4005FBの「5」は、「空の」配列セルへのアクセスをトリガーします。その結果、欠陥のあるPentiumプロセッサが返す値は、4桁目以降で不正確になります。[ 8 ]
これは実際には の値です。
リンチバーグ大学の数学教授トーマス・ナイスリーは、素数、双子素数、素数三つ組、素数四つ組を列挙するコードを書いていた。ナイスリーは、1994 年 6 月 13 日、自分のコンピュータ グループに Pentium システムを追加した直後に計算にいくつかの矛盾があることに気づきましたが、1994 年 10 月 19 日まで他の要因 (プログラミング エラー、マザーボードのチップセットなど)を排除することができませんでした。 [ 1 ] 1994 年 10 月 24 日、ナイスリーはインテルにこの問題を報告しました。[ 9 ]インテルは、1994 年 6 月までに独自にこの問題を認識し、この時点で修正を開始していましたが、詳細を公表したり、影響を受ける CPU をリコールしたりしないことを選択したと伝えられています。[ 10 ]
1994年10月30日、ナイスリーは様々な学術関係者にこのバグに関する電子メールを送り、486-DX4、Pentium、およびPentiumクローンにおけるこの欠陥のテスト結果の報告を依頼した。[ 9 ]このバグはすぐに他の研究者によって検証され、インターネット上で急速に広まった。このバグは、影響を受ける最も頻繁に使用される命令である浮動小数点除算のx86アセンブリ言語ニーモニックにちなんで、「Pentium FDIVバグ」と名付けられた。 [ 9 ]
このニュースは1994年11月7日、エレクトロニック・エンジニアリング・タイムズ紙のアレクサンダー・ウルフ氏による記事「インテルがペンティアムFPUの不具合を修正」で初めて報道され、[ 11 ] 、その後CNNが1994年11月22日に放映した番組で取り上げられました。また、ニューヨーク・タイムズ紙とボストン・グローブ紙でも報道され、ボストン・グローブ紙では一面を飾りました。[ 10 ] [ 12 ]
この時点で、インテルは浮動小数点の欠陥を認めたが、深刻なものではなく、ほとんどのユーザーに影響を与えないと主張した。インテルは、影響を受けていることを証明できるユーザーに対してプロセッサの交換を申し出た。しかし、ほとんどの独立した推定では、このバグがほとんどのユーザーに与える影響は非常に限定的であると判明したが、会社に対する重大な否定的な報道を引き起こした。 2019年の講演で、ジョン・ロメロは、 Quakeの開発を振り返りながら、マイケル・アブラッシュがこのバグをどれほど頻繁かつ執拗に再現できるかを説明した。アブラッシュは、特定のカメラアングルから見るとゲームレベルの一部が予期せず表示されるバグを発生させるために必要な正確な条件を追跡するのに何時間も費やした。[ 13 ] IBMはインテルCPUを搭載したPCの販売を一時停止し、インテルの株価は大幅に下落した。[ 14 ] IBMの決定の背後にある動機は、業界の一部から疑問視された。当時IBMはPowerPC CPUを製造しており、Pentiumまたは企業としてのインテルの評判が損なわれることで利益を得る可能性がありました。しかし、この決定により、PC機器の法人購入者は既存のPentium CPUの交換を要求するようになり、その後すぐに他のPCメーカーも欠陥のあるPentiumチップの「無条件」交換品を提供し始めた。[ 4 ]
インテルの対応に対する不満が高まり、同社は12月20日、欠陥のあるPentiumプロセッサを要求に応じてすべて交換することを申し出た。[ 15 ] 1995年1月17日、インテルは税引前で4億7500万ドルの損失を発表した。これは表面上は欠陥プロセッサの交換に関連する総費用である。[ 9 ]これは2024年には8億9100万ドルに相当する。 [ 16 ]インテルは、再販業者やOEMがリコールプログラムに参加することを禁じ、エンドユーザー自身にチップの交換を義務付けたことで批判された。インテルはサポートウェブページに掲載したこの理由について、「欠陥がアプリケーションの精度に影響を与えているかどうかを判断するのはエンドユーザー自身の判断である」と説明していた。[ 14 ]
1995年にサイエンス誌に掲載された記事では、コンピュータのバグを発見する上での数論問題の価値について説明し、バグを発見した当時ナイスリー氏が取り組んでいた問題であるブルンの定数の数学的背景と歴史について説明しています。[ 17 ]
FDIVバグに対するインテルの対応は、問題の広報効果が顧客への実際の影響を上回った例として挙げられている。 [ 18 ]ほとんどのユーザーが日常的なコンピューティングでこの欠陥に遭遇する可能性は低かったものの、顧客が影響を受けたことを証明できない限りチップを交換しないという同社の当初の対応は、業界専門家の少数の声高な反発を招いた。その後の報道はCPUに対する消費者の信頼を揺るがし、問題の影響を受けそうにない人々からも対策を求める声につながった。当時のインテルCEO、アンディ・グローブはウォール・ストリート・ジャーナル紙で、「我々が見逃した問題の核心は、我々が誰かに何を心配すべきか、何をすべきでないか、あるいは何をすべきでないかを伝えようとしたことだ」と述べたと伝えられている。[ 4 ]
このバグとそれに続くリコールの後、半導体業界全体でハードウェア浮動小数点演算の形式検証の利用が著しく増加しました。このバグの発見をきっかけに、1996年にはSRTアルゴリズムに適用可能な「ワードレベルモデル検査」と呼ばれる手法が開発されました。 [ 19 ]インテルはその後のCPUアーキテクチャの開発においても形式検証を広く活用しました。Pentium 4の開発においては、シンボリック軌道評価と定理証明を用いて、もし検出されていなかったら同様のリコール事案につながっていた可能性のある多くのバグを発見しました。[ 20 ]インテルが形式検証を主要な検証方法として初めて採用したマイクロアーキテクチャは、2008年に開発されたNehalemでした。 [ 21 ]
FDIVバグは、D1より前のステッピングレベルの60MHzおよび66MHzのPentium P5 800、およびB5より前のステッピングレベルの75MHz、90MHz、および100MHzのPentium P54C 600に影響します。120MHzのP54CおよびP54CQS CPUには影響しません。[ 22 ] [ 23 ]
このバグを回避するため、メーカー各社から様々なソフトウェアパッチがリリースされた。IEEE Computational Science & Engineering誌の論文で概説されているアルゴリズムの一つは、除数が誤ってゼロを含むPLAセルにアクセスしようとした場合、分子と分母の両方を15/16で乗算するというものである。この修正には測定可能な速度低下が伴う。不適切な除数を持つFDIV演算のみを実行するプログラムの場合、最悪のケースでは、FDIV演算の実行時間が通常の40クロックサイクルではなく約80クロックサイクルかかるため、実行時間が2倍になる。ランダムな除数が多い場合、FDIVあたりの平均時間は約50クロックサイクル、つまり除数のチェックに10サイクル追加される。つまり、1024個のランダムな除数のうち5個だけがスケーリング修正をトリガーする。FDIVはほとんどのプログラムではまれな演算であるため、修正をインストールした場合の通常の速度低下は、通常1%以下である。[ 8 ]
ソフトウェア企業が直面した主な課題は、既存のソフトウェアに修正を実装することでした。これらのソフトウェアの多くは、自社の管理外にあるライブラリに依存していました。Wolfram Researchなどの企業は、既存の実行ファイルのマシンコードに直接パッチを適用し、FDIVオペコードを不正な命令に置き換えることを選択しました。これにより例外が発生し、パッチを当てた例外ハンドラがそれをキャッチします。これにより、任意のコードを実行してバグを回避できるようになります。[ 2 ]
マイクロソフトは、Windows XPまでのWindowsのバージョンにおいて、オペレーティングシステムレベルの回避策を提供していました。バグの存在を確認し、発見された場合はFPUを無効にするユーティリティがオペレーティングシステムに同梱されていました。[ 24 ] [ 25 ]