3 ポイント 投稿者 GN⁺ 2024-12-30 | 1件のコメント | WhatsAppで共有

インテルのPentium FDIVバグ

  • 背景: 1993年、インテルは高性能なPentiumプロセッサを発売した。Pentiumには、従来のIntel 486プロセッサより高速な浮動小数点除算アルゴリズムを含む多くの改良があった。しかし1年後、数学教授のNicelyが双子素数の逆数を研究していた際に、Pentiumが浮動小数点除算を実行すると誤った結果を生成する問題を発見した。

  • バグの発見と影響: インテルはこの問題を「ごく些細な技術的問題」と見なしていたが、このバグは大きなメディア問題となった。最終的にインテルは欠陥のあるPentiumチップをすべて交換することを決定し、会社に4億7,500万ドルの費用をもたらした。

  • バグの原因: Pentiumの除算アルゴリズムはルックアップテーブルを使用する。インテルは1994年、このバグの原因はスクリプトの誤りによりテーブルから5つの項目が欠落したためだと発表したが、実際には数学的な誤りにより16個の項目が欠落していた。このうち5個の欠落項目がFDIVバグを引き起こした。

  • 浮動小数点数の概要: 浮動小数点数は、非常に大きな数と非常に小さな数を表現できる。インテルの8087浮動小数点コプロセッサチップはIEEE 754標準の策定に貢献し、Pentiumを含むほとんどのコンピュータがこの標準を実装した。

  • SRT除算: PentiumはSRTアルゴリズムを用いて除算を実行し、これは標準的な2進除算より2倍高速である。SRTアルゴリズムは非標準的なアプローチを用いて商の桁を選択しやすくする。

  • ルックアップテーブルの構造: Pentiumのルックアップテーブルは2048個の項目を含み、そのうち5個の項目が欠落してFDIVバグを引き起こした。このテーブルはPLA(Programmable Logic Array)として実装されている。

  • バグの数学的境界: 除算アルゴリズムの中核となる段階は、部分剰余を除数で割って商の桁を得ることにある。この過程で誤ったq値が選ばれると、アルゴリズムは回復できない。

  • キャリーセーブ加算器とキャリールックアヘッド加算器: Pentiumの除算回路は、加算と減算を効率的に行うためにキャリーセーブ加算器を使用している。この加算器はFDIVバグを引き起こすうえで重要な役割を果たす。

  • バグ修正: インテルは、テーブル内の未使用項目をすべて2で埋めることでバグを修正した。これにより誤った項目にアクセスする可能性がなくなり、PLA方程式も単純化されてPLAがより小さくなった。

1件のコメント

 
GN⁺ 2024-12-30
Hacker Newsの意見
  • 筆者はPentiumバグについて質問があれば答える用意がある

    • Intelの対応は興味深く、すべてのユーザーのプロセッサを交換しなかったため、否定的な報道が多かった
    • Amazon Colorsoftでは、不具合品をひそかに交換して問題を解決した事例に言及している
    • Apple AirPods Proのひび割れ問題も、ひそかに交換することで解決した事例に言及している
  • Intelのホワイトペーパーでは、一般ユーザーが問題に遭遇するのは27,000年に1回だと主張していたが、IBMは顧客が数日おきに問題に遭遇しうると分析していた

    • Intelは単一ユーザーを想定していた一方で、IBMはサポート依頼を考慮していたようだ
    • 大量のリクエストを処理する場合、小さな確率の問題でも頻繁に発生しうる
  • 実際の使用中にバグを発見した人は1人しかいなかった

    • 学生に誤った計算機を渡した研究に触れ、誤りを認識することと影響を受けることは別だと説明している
    • ほとんどの人は、コンピューターの出力が正確かどうかを確認しない
  • 顧客のCPUを制御できなかったため、ライブラリに特別なコードを追加して問題を解決しなければならなかった経験を共有している

  • Intelのテーブル生成アルゴリズムの問題を指摘し、PRでは些細な問題として説明されていたが、実際にはもっと大きな問題だったことを強調している

  • Intelがテーブルの未使用エントリをすべて2で埋めた理由を疑問視している

    • より安全な方法は、5つのエントリだけを修正することだったはずだと述べている
    • 修正後のテーブルのほうが単純なのに、なぜ最初からそうしなかったのか疑問に思っている