
2026/06/22 22:40
8087 マスプリセッサの高速ビットシフターの分析(2020 年)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
1980 年に発売されたインテル 8087 コプロセッサーは、前世代のアドホック方式に比べて浮動小数点演算を最大 100 倍高速化し、計算分野における主要な進歩を象徴しました。ウィリアム・ケハン氏の指導のもとで設計され、互換性の時代を終結させる IEEE 754 標準へと発展した統一的なアーキテクチャを確立しました。チップの大型化されたダイサイズ(5mm×6mm)には 8086 の companion チップよりも多数のトランジスター(4 万個)が搭載され、複雑な数学演算(乗算や除算など)においてメモリアクセス回数を大幅に削減するために 16 ビットではなく 80 ビットのレジスタを用いて動作しました。重要な革新点は、高速なバイナリバレルシフターの採用であり、2 段構成により単一ステップで 0〜63 ビットの範囲から任意のビット量による値のシフトを実現し、0〜7 ビットおよび 0〜7 バイトのシフトを処理します。この構造は、パストランジスターと特殊なドライバ回路を両方向に利用するものであり、マイクロコードエンジン、CORDIC アルゴリズム用のループカウンタ、リーディングゼロカウンタによって制御されます。以前のような NaN、アンダーフロー、オーバーフローなどのエラーを検出するために断片的なコードチェックに依存したシステムとは異なり、8087 はこれらの問題を自動的に検出するために専用ハードウェアを採用し、パフォーマンスを低下させることなく動作しました。当初は外部ハードウェアが必要とされましたが、1989 年のインテル 80486 で内部統合へと進化し、システムアーキテクチャの簡素化を実現し、現代デバイスの標準機能として複雑な数学演算機能を搭載するようになりました。
本文
Intel 8087 コプロセッサ:高速バレルシフターの内部構造と革新
浮動小数点数は科学計算において不可欠ですが、初期のマイクロプロセッサでは整数のみを直接サポートしていました。Intel 8087 の登場が現代の浮動小数点演算基盤を築きました。
歴史的背景と技術的意義
- 導入時期: Intel が 1980 年に IBM PC などのマイクロコンピュータ向けに 8087 を導入しました。
- 性能向上: マイクロプロセッサ単体での計算からコプロセッサへのアーキテクチャ変更により、演算速度が最大で100 倍向上しました。
- 恩恵を受けたアプリケーション: AutoCAD、スプレッドシート計算、フライトシミュレーターなど。
- コスト課題: チップ自体のコストが数百ドルにも達したという欠点がありましたが、性能面での貢献は計り知れません。
- 規格の確立:
- 従来のメーカー固有(互換性のないアドホック)な実装を脱却しました。
- William Kahan 博士(数値解析権威)を招き、厳密な原則に基づいたアーキテクチャを開発。
- その成果として現在も広く採用されているIEEE 754 標準が確立されました。
チップの概要とダイ写真
- サイズ: $5\text{mm} \times 6\text{mm}$
- トランジスタ数: 約 4 万個(当時の製造技術の限界)
- 対照的に同系プロセッサである 8086 は約 2.9 万個のみでした。
- 画像説明:
- シリコンダイの写真において、赤色で示された部分が今回の焦点となる「シフター(シフト器)」です。
- 4 万個のトランジスタを搭載するこの高集積チップを実現するには、Intel が全く新しい技術開発が必要とされました。
フローティングポイントユニット(FPU)内部構成
8087 の動作を理解するために、ダイ写真を詳細に分析しました。主要な機能ブロックは以下の通りです。
- 下部:桁部分(マンティサ)処理回路
- 左から右へ順に見ていくと、以下の順序で配置されています。
- 定数 ROM(ROM)
- シフター(赤色で強調表示)
- 加減算器
- レジスタスタック
- 左から右へ順に見ていくと、以下の順序で配置されています。
- 中央部:指数部処理回路
- その上部にはマイクロコードエンジンおよび制御用 ROM が配置されています。
浮動小数点数の構成要素
これらの要素はすべて 2 進数で表現されます(10 進数の例え:$6.02 \times 10^{23}$ の場合、桁部分が $6.02$、指数部が $23$)。
高速バレルシフターの詳細分析
**「シフター」**はチップ面積の大半を占める重要な回路であり、8087 の性能向上に不可欠でした。
シフターの役割と重要性
- 基本機能: 2 進数を左または右にシフトさせます。
- 具体的な用途:
- 加減算: 桁部分の小数点位置を一致させるために数値をシフトします。
- 超越関数計算: 「CORDIC」アルゴリズムを用いたシフトと加算操作の中心になります。
- データ構築: メモリからの 16 ビット単位データを組み合わせて浮動小数点数を作る際に使用されます。
バレルシフターの採用理由
シフト操作が性能に直結するため、8087 は一度の動作で任意のビット数だけデータをシフトできる**「バレルシフター」**を採用しています。
- 二段階設計: サイズを管理可能にするため、Intel は以下の構成としました。
- 第一段階: 0 から 7 ビット分のシフト
- 第二段階: 0 から **7 バイト(56 ビット)**分のシフト
- 合計性能: これらを組み合わせることで、0 から 63 ビットまでの任意の量へのシフトが可能になります。
トランジスタ技術:NMOS
- 製造原理: シリコン基板に不純物をドープして電気的特性の異なる「拡散」領域を作り出し、ソースとドレイン間の電流制御(スイッチ)を実現します。
- 動作原理: ゲート(ポリシリコン)に電圧を印加することで通電経路を開け、トランジスタ同士は金属層で接続されます。
ビットシフター構造図の解説
- 規模: 実際の完全なシフターは約68 ビットに対応しますが、説明用に一部の構造(5 つ)が表示されています。
- 動作原理:
- パス・トランジスタ方式: ロジックゲートではなくスイッチとしてのトランジスタを使用し、縦方向の「選択ライン」で特定の列をオンにします。
- シフト制御例: 「シフト選択ライン 3」がオンになると、関連するトランジスタ(緑色)が動作し、入力 $20$ は出力 $23$ へと導かれて 3 ビット分シフトします。
- 任意シフト: 異なる選択ラインをオンにすることで、0〜7 ビットの範囲内で任意の量だけ入力データをシフト可能です。
バイトシフター構造図の解説
- 動作原理: ビット単位ではなく、**8 ビットの倍数(バイト単位)**で入力をシフトします。
- 例:入力 $20$ は出力 $20, 28, 36$ のように 8 ビット間隔で接続されます。
- 構造的特徴:
- スイッチ間に 8 ライン分の配線が挟まっており、接続が急峻かつ高密度です。
- 左方向にシフトした低位ビット(例:4 バイトシフト時のビット $31$ 以下)はゼロ化されます。
ダイ写真上のレイアウト
- 比較:
- ビットシフター部分はトランジスタで非常に高密度に埋め尽くされています。
- バイトシフターは主に配線で構成され、トランジスタの列が少ない部分もあります。
- 効率性: 規則的な図と比べると複雑ですが、最大限の効率的な配線が行われています。
マルチプレクサ/デコーダによる制御
シフターの動作量(位置数)を決定する制御回路です。
シフト源の 3 つ
- マイクロコードエンジン: 直接指定。
- ループカウンタ: CORDIC 超越関数アルゴリズムの一部として使用。
- 先行ゼロ(Leading Zero)カウンタ: シフトにより先行のゼロを除去し、数を正規化するために使用。
制御プロセス
- 選択: 上記 3 つのソースから各々 6 ビットのシフト量を出力し、6 つのマキシプレクサが所望するソースを選択します。
- デコーダ動作:
- デコーダはビットシフトラインとバイトシフトラインのうち、それぞれ 8 ラインの一つをオンにします。
- シフター内の該当するパス・トランジスタを制御(オン/オフ)します。
- デコーダラインには比較的大きな電力トランジスタが使用されています。
双方向ドライバの革新
従来のシフターは片方向のみでしたが、8087 は**「パス・トランジスタ」**構造を採用し、データを逆方向にも通すことを可能にしました。これにより、双方向シフトが実現しています。
- データフロー:
- 通常(左→右): 左側ドライバが桁部分バスから読み取り、シフター内へ送り込みます。右側ドライバは一時ラッチして再び桁部分バスへ書き戻します。
- 逆方向: ドライバの役割が入れ替わり、データが反対方向にフローします。
まとめと影響
8087 の総合的な優位性
シフター自体に加え、以下の機能が組み合わさることで最大 100 倍ものパフォーマンス向上を実現しました。
- 超大容量レジスタ: 一度に80 ビット処理(当時の 16 ビットプロセッサと比べてメモリアクセス回数を削減)。
- ローカル定数表: ROM に超越関数に必要な定数を保持し、メモリアクセスを回避。
- ハードウェア異常検出: NaN(非数)、アンダフロー、オーバーフローなどをハードウェアで検出し、ソフトウェアによる遅いチェック処理を不要に。
- 高速乗算・除算: ハードウェアによる演算の劇的な高速化。
業界への波及効果
- Intel はこれらの革新により特許を取得し、1989 年の 80486 で FPU をプロセッサ内に統合するようになりました。
- 現在ではほとんどのプロセッサに内蔵されており、独立したコプロセッサを必要とする時代は終了しました。
※詳細なダイ写真やより高精細な画像については、関連記事や RSS フィードを通じて追跡いただけます。