科学・技術
8087数値演算コプロセッサの高速ビットシフターのダイ解析
Die analysis of the 8087 math coprocessor's fast bit shifter (righto.com)
要約
この記事は、初期のマイクロプロセッサに浮動小数点演算機能を追加し、IEEE 754標準の基盤となったIntel 8087数値演算コプロセッサの詳細なダイ解析を紹介している。特に、浮動小数点演算の性能に不可欠な高速バイナリシフターの構造と動作原理に焦点を当て、顕微鏡写真や回路図を用いてその実装を解説。2段階のバレルシフター(ビットシフターとバイトシフター)の設計が、面積を抑えつつ高性能を実現した方法を深く掘り下げている。
全文翻訳
8087数値演算コプロセッサの高速ビットシフターのダイ解析 浮動小数点数は科学技術計算に非常に有用だが、初期のマイクロプロセッサは直接整数のみをサポートしていた。1950年代から1960年代にはメインフレームで浮動小数点演算が一般的だったが、Intelがマイクロコンピュータ向けに8087浮動小数点コプロセッサを導入したのは1980年になってからだ。このチップをIBM PCのようなマイクロコンピュータに追加することで、浮動小数点演算が最大100倍高速になった。これはAutoCAD、スプレッドシート、フライトシミュレーターといったアプリケーションにとって大きな恩恵だった。欠点は、8087チップが数百ドルしたことだ。浮動小数点演算を高速かつ正確に計算するように実装するのは難しい。オーバーフロー、丸め、超越演算、および多数のエッジケースから問題が生じる可能性がある。8087以前は、各メーカーが独自の互換性のない場当たり的な浮動小数点の実装を持っていた。しかし、Intelは数値解析の専門家ウィリアム・カーハンを招き、厳密な原理に基づいた正確な浮動小数点演算を設計した。その結果が8087の浮動小数点アーキテクチャだ。これは、ほぼ全ての現代のコンピュータで使用されているIEEE 754標準となり、そのため私は8087がこれまでに設計されたチップの中で最も影響力のある一つだと考えている。
Intel 8087浮動小数点ユニットチップのダイで、主要な機能ブロックが示されている。ダイは5mm×6mm。シフターは赤で囲まれている。拡大画像を見るにはクリック。8087がどのように機能するかを探るため、私は8087チップを開封し、シリコンダイの写真を顕微鏡で撮影した。40,000個のトランジスタを搭載する8087は、チップ製造の限界に挑戦していた。比較すると、対応する8086マイクロプロセッサは29,000個のトランジスタしか持っていなかった。このチップを可能にするため、Intelは新しい技術を開発した。この記事では、高速バイナリシフター(上記で赤く囲まれた部分)に焦点を当てる。シフターはチップ面積の大部分を占めるため、その面積を最小限に抑えることが8087を実現するために不可欠だった。
浮動小数点数は、仮数部(significandまたはmantissaとも呼ばれる)、指数部、および符号ビットで構成される。(これらは2進数で表現されるが、10進数での類推では、数6.02×10^23は6.02が仮数部で23が指数部となる。)仮数部を処理する回路はダイ写真の下部にある。左から右へ、仮数部回路は定数ROM、シフター(強調表示)、加算器/減算器、およびレジスタスタックで構成されている。指数部処理回路はチップの中央にある。その上には、マイクロコードエンジンとROMがチップを制御している。
シフター シフターの役割は、2進数を左右にシフトさせることであり、浮動小数点演算においていくつかの重要な役割を果たす。2つの浮動小数点数を加算または減算する場合、2進小数点(10進数における小数点のようなものだが、2進数の場合)が揃うように数値をシフトする必要がある。8087の超越命令は、CORDICと呼ばれるアルゴリズムを使用して、シフトと加算演算を中心に構築されている。シフターは、メモリから読み取られた16ビットのチャンクから浮動小数点数を組み立てるためにも使用される。シフトは性能にとって非常に重要であるため、8087は、任意のビット数だけ一度にシフトできる「バレルシフター」を使用している。Intelは、サイズを管理可能な範囲に保ちつつ、高い性能を提供する2段階のシフター設計を採用した。最初の段階は値を0から7ビットシフトし、2番目の段階は0から7バイトシフトする。これらを組み合わせることで、0から63ビットまでの任意の量だけ値をシフトできる。
ビットシフター まず、0から7ビット位置のシフトを実行するビットシフターについて説明する。以下の図はビットシフターの構造の概要を示しており、入力と出力のうち5つを示している。完全なシフターは68ビットをサポートする。その概念は、特定の列をアクティブにすることで、入力が所望の量だけシフトされるというものだ。各円は、入力線と出力線の間のスイッチとして機能できるトランジスタを示している。垂直方向の選択線は、目的のトランジスタをアクティブにするために使用される。各入力線は8つのトランジスタに斜めに接続されており、8つの出力のいずれかに誘導できるようになっている。例えば、図はシフト選択線3がアクティブになり、関連するトランジスタ(緑色)がオンになることを示している。ハイライトされた入力20(オレンジ色)は出力23(青色)に誘導される。同様に、他の入力も対応する出力に接続され、3ビットのシフトが得られる。異なるシフト選択線をアクティブにすることで、入力は0から7ビットの間で異なる量だけシフトされる。ビットシフターの構造。シフト選択線に電力を供給することで、入力は目的のビットシフトを伴う出力に接続される。シフターの内部構造を説明するために、まず8087チップで使用されているNMOSトランジスタについて説明する。トランジスタは、シリコン基板の領域に不純物をドーピングして、異なる電気特性を持つ「拡散」領域を作成することによって構築される。トランジスタは、ソースとドレインと呼ばれる2つの領域間の電流の流れを制御するスイッチと見なすことができる。トランジスタは、基板シリコンの上に層状に配置されたポリシリコンと呼ばれる特殊な種類のシリコンで作られたゲートによってアクティブになる。ゲートに電圧を印加すると、通常はブロックされているソースとドレインの間で電流が流れるようになる。トランジスタは、上部の金属層によって互いに配線され、複雑な集積回路を構築する。集積回路に実装されたMOSFETの構造。下の写真は、顕微鏡で見た8087のトランジスタを示している。その形状はより複雑だが、構造は上記の図と一致している。ソース、ゲート、ドレインは全て写真の外に続き、他のトランジスタに接続されている。さらに、金属層の配線は、円形のビアでシリコンに接続されている。(この写真のために金属層は酸で除去された。)顕微鏡で見た8087チップのNMOSトランジスタ。ズームアウトすると、下の図はチップ上に実装されたビットシフターの一部を示している。約48個のトランジスタがこの写真に写っており、上記のトランジスタと類似している。オレンジと黄色の対角線は入力の1つに対応している。オレンジ色の領域はシリコンを介して接続されたトランジスタを示し、黄色の線は金属層の接続を示している。(金属層はポリシリコン選択線を飛び越えるために使用される。)緑色のハイライトは、3ビットシフトのためのポリシリコン線を示している。中央では、このポリシリコンゲート線がトランジスタをオンにし、入力を長い黄色の出力線に接続し、ハイライトされた入力を3ビット位置シフトする。(他のハイライトされていない入力も同様にシフトされる。)このように、この回路はセクションの冒頭で説明されたシフターを実装している。
この写真は68個の入力のうち6つを示しており、完全なシフターははるかに高い。ビットシフターのシリコン回路のクローズアップ。シフトバイ3制御(緑色)によって制御される1つの信号の経路が示されている。バイトシフター バイトシフターは、1ビットではなく8ビットの倍数で入力をシフトする。その設計はビットシフターと似ているが、各入力は8番目の出力ごとに接続される点が異なる。例えば、入力20は出力20、28、36などに接続され、バイト単位でシフトされる。その結果、斜めの接続は急勾配で密に詰まっており、各スイッチ間に8本の線がある。下の図では、シフトバイ4の線が選択されており、入力0から出力32への接続がハイライトされている。図の右半分にワイヤーがないことに注意してほしい。なぜなら、入力0を超えてシフトされたビットは全てゼロになるからだ。例えば、4バイト左にシフトする場合、下位ビット31以下はゼロになる。バイトシフターの構造。下のダイ写真はビットシフターとバイトシフターの一部を示している。この写真は全体構造を示すためにズームアウトされており、個々のトランジスタはほとんど見えない。ビットシフターの領域はトランジスタで密に詰まっているが、バイトシフターはほとんどが配線で構成され、その間にトランジスタの列がある。9 また、次の点にも注意してほしい。