Pentium FDIVのバグ

良い記事ですね。詳しくはこちらをクリックしてください。

FDIVバグのある66MHz Intel Pentium(sSpec=SX837)

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 ]

計算の正しい値は次のとおりです。

4,195,8353,145,7271.333820449136241002{\displaystyle \textstyle {\dfrac {4{,}195{,}835}{3{,}145{,}727}}=1.333820449136241002}

プロセッサが使用する16進数値に変換すると、4,195,835 = 0x4005FB、3,145,727 = 0x2FFFFFとなります。0x4005FBの「5」は、「空の」配列セルへのアクセスをトリガーします。その結果、欠陥のあるPentiumプロセッサが返す値は、4桁目以降で不正確になります。[ 8 ]

4,195,8353,145,7271.333739068902037589{\displaystyle \textstyle {\dfrac {4{,}195{,}835}{3{,}145{,}727}}=1.333{\color {red}{739068902037589}}}

これは実際には の値です。 4,195,5793,145,7274,195,8352563,145,727{\displaystyle \textstyle {\dfrac {4{,}195{,}579}{3{,}145{,}727}}={\dfrac {4{,}195{,}835-256}{3{,}145{,}727}}}

発見と対応

リンチバーグ大学の数学教授トーマス・ナイスリーは、素数双子素数素数三つ組素数四つ組を列挙するコードを書いていた。ナイスリーは、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 ]

参照

参考文献

  1. ^ a b Edelman, Alan (1997年1月1日). 「Pentiumの除算バグの数学」(PDF) . SIAM Review . 39 (1): 54– 67. Bibcode : 1997SIAMR..39...54E . doi : 10.1137/S0036144595293959 . 2024年8月14日時点のオリジナルよりアーカイブ(PDF) . 2021年4月11日閲覧
  2. ^ a b "「Pentium FDIVバグに関する議論と修正」(2002年、ノートブックアーカイブより)。notebookarchive.org。Wolfram Research , Inc .。 2021年4月11日閲覧
  3. ^ a b c d Tom R. Halfhill (1995年3月). 「ルックアップテーブルのエラーがIntelの最新プロセッサの悪名高いバグを引き起こした」 . BYTE . 1995年3月号. 2006年2月9日時点のオリジナルよりアーカイブ。 2006年12月19日閲覧
  4. ^ a b cジム・カールトン、スティーブン・K・ヨーダー(1994年12月21日)「コンピューター:謙虚なパイ:インテルがPentiumチップを置き換える」ウォール・ストリート・ジャーナル(東部版)p. B1.
  5. ^ “1994 - Annual Report” . Intel. 2020年6月20日. 2017年2月26日時点のオリジナルよりアーカイブ。 2020年6月20日閲覧
  6. ^ Sharangpani, HP; Barton, ML (1994年11月30日). Pentiumプロセッサの浮動小数点脆弱性に関する統計分析 (1994年) (PDF) (レポート). Intel Corporation. 2022年3月19日時点のオリジナル(PDF)からアーカイブ。 2021年4月11日閲覧
  7. ^ 「Pentium FDIVのバグ - 写真」カンザス大学政策・社会調査研究所. 1994年11月30日. 2021年11月3日時点のオリジナルよりアーカイブ2010年11月3日閲覧。
  8. ^ a b Coe, T.; Mathisen, T.; Moler, C.; Pratt, V. (1995). 「Pentium事件の計算的側面」(PDF) . IEEE Computational Science and Engineering . 2 (1): 18– 30. doi : 10.1109/99.372929 . 2021年6月23日時点のオリジナルよりアーカイブ(PDF) . 2021年4月13日閲覧
  9. ^ a b c d Nicely, Thomas (2011年8月19日). 「Pentium FDIVの欠陥に関するFAQ」 . trnicely.net . 2019年6月18日時点のオリジナルよりアーカイブ2019年6月18日閲覧。
  10. ^ a b Markoff, John (1994年11月24日). 「COMPANY NEWS: Flaw Undermines Accuracy of Pentium Chips」 . The New York Times . 2024年8月14日時点のオリジナルよりアーカイブ。 2021年4月11日閲覧
  11. ^ Alexander Wolfe (1994年11月9日). 「Intel、Pentium FPUの不具合を修正」 . Electronic Engineering Times . 2010年12月18日時点のオリジナルよりアーカイブ2011年1月19日閲覧。
  12. ^ Moler, Cleve (1995年冬). 「A Tale of Two Numbers」(PDF) . MATLAB News and Notes . MathWorks. 2024年8月14日時点のオリジナルよりアーカイブ(PDF) . 2021年4月21日閲覧.
  13. ^ 「BTD12: Idソフトウェアのプログラミング原則」。TNG Technology Consulting GmbH。2019年8月6日。2023年8月25日時点のオリジナルよりアーカイブ2023年7月17日閲覧。
  14. ^ a b Yeraswork, Zewde (2011年3月30日). 「教訓:Pentiumの欠陥がIntelのSandy Bridgeチップセットリコールを支援」 . CRN . 2024年8月14日時点のオリジナルよりアーカイブ。 2021年4月11日閲覧
  15. ^ 「Intel、浮動小数点欠陥のあるPentiumプロセッサについて、要請に応じた交換ポリシーを採用。第4四半期の収益に計上される」 Business Wire、1994年12月20日。 2012年7月10日時点のオリジナルよりアーカイブ。 2006年12月24日閲覧
  16. ^ジョンストン、ルイス、ウィリアムソン、サミュエル・H. (2023). 「当時の米国のGDPはいくらだったのか?」 MeasuringWorth . 2023年11月30日閲覧米国の国内総生産デフレーター数値は、MeasuringWorthシリーズに従います。
  17. ^ Cipra, Barry Arthur (1995年1月13日). 「数論はいかにしてPentiumチップを最大限に活用したか」. Science . 267 (5195): 175. Bibcode : 1995Sci...267..175C . doi : 10.1126 / science.267.5195.175 . PMID 17791336. S2CID 19898103 .  
  18. ^ Price, D. (1995年4月). 「Pentium FDIVの欠陥 - そこから学んだ教訓」. IEEE Micro . 15 (2): 86– 88. doi : 10.1109/40.372360 .
  19. ^ Clarke, EM; Khaira, M.; Zhao, X. (1996). 「ワードレベルモデル検査 - Pentium FDIVエラーの回避」 .設計自動化会議 - DAC '96 第33回年次会議議事録. pp.  645– 648. doi : 10.1145/240518.240640 . ISBN 0897917790. S2CID  2500033 . 2021年4月29日時点のオリジナルよりアーカイブ。2021年4月29日閲覧。
  20. ^ O'Leary, J. (2004). 「Intel CPU設計における形式検証」 .議事録. 第2回ACM・IEEE国際協調設計のための形式手法とモデルに関する会議, 2004. MEMOCODE '04 . p. 152. doi : 10.1109/MEMCOD.2004.1459841 . ISBN 0-7803-8509-8. 2021年4月29日時点のオリジナルよりアーカイブ。2021年4月29日閲覧。
  21. ^ Kaivola, Roope; Ghughal, Rajnish; Narasimhan, Naren; Telfer, Amber; Whittemore, Jesse; Pandav, Sudhindra; Slobodová, Anna; Taylor, Christopher; Frolov, Vladimir; Reeber, Erik; Naik, Armaghan (2009). 「Intel Core i7プロセッサー実行エンジン検証におけるテストの形式検証による置き換え」. Computer Aided Verification . Lecture Notes in Computer Science. Vol. 5643. pp.  414– 429. doi : 10.1007/978-3-642-02658-4_32 . ISBN 978-3-642-02657-7
  22. ^ 「P5 (586) 第5世代プロセッサ | マイクロプロセッサの種類と仕様 | InformIT」 informit.com 2001年6月8日。2021年4月13日時点のオリジナルよりアーカイブ。 2021年4月13日閲覧
  23. ^ 「FDIV交換プログラム:よくある質問」 Intel 2009年3月20日。ソリューションID:CS-012748。2009年5月11日時点のオリジナルよりアーカイブ2009年11月10日閲覧。
  24. ^ Slob, Arie. 「Windows 95 トラブルシューティング:数値演算コプロセッサの不具合を確認する方法」 helpwithwindows.com . 2024年8月14日時点のオリジナルよりアーカイブ。 2019年4月23日閲覧
  25. ^ "Pentnt" . Microsoft TechNet . Microsoft . 2009年9月11日. 2018年2月3日時点のオリジナルよりアーカイブ。 2019年4月23日閲覧