R8000
R8000は、MIPS IV命令セットアーキテクチャ (ISA) を初めて実装したマイクロプロセッサのチップセットで、ミップス・テクノロジーズ (MTI)、東芝、Weitekが開発した。開発中のコード名 TFP (Tremendous Floating-Point) でも知られている。
R8000の開発は、シリコングラフィックス (SGI) で1990年代初めごろに始まった。1990年ごろのスーパーコンピュータの性能をマイクロプロセッサで実現することを目標としていた。当時、RISCマイクロプロセッサの性能向上の速度はスーパーコンピュータのそれを凌駕していた。当時、高価で巨大なスーパーコンピュータをRISCマイクロプロセッサでずっと小型で安価なものにでき、デスクサイドのワークステーションやサーバでスーパーコンピュータを代替できるようになると推測されていた。
R8000の詳細が明らかにされたのは、1992年4月にミップス社が今後の開発計画を発表した中でのことである。1992年3月、SGIがミップス買収を発表、1992年中ごろ、同社はSGIの子会社としてミップス・テクノロジーズ (MTI) と改称された。R8000開発はSGIからMTIに移管されて続行された。1993年中の完成を見込んでいたが、1994年中ごろまでずれ込んでいる。75MHz版のR8000は1994年6月7日に登場。当時の価格は2,500ドルだった。1995年中ごろにはSGIのシステムに90MHz版が使われ始めた。科学技術計算に特化したR8000は高価ということもあってあまり売れなかったが、科学技術計算市場での存在感は大きかった。しかし1996年1月により安価でより高性能なR10000が登場すると、ほとんど取って代わられることになった。
R8000を採用したのはSGIのみで、ワークステーションの Power Indigo2、サーバの Power Challenge とそのクラスター、ビジュアライゼーションシステムのPower Onyx などで使われた(R8000を搭載した機種は機種名にPowerがつく)。1994年11月時点のTOP500リストでは、500位内の50システムがR8000を使っていた。最も順位が高かったのは18個のR8000を搭載した Power Challenge で、154位から157位に4システムが並んでいた。
チップセットは、マイクロプロセッサのR8000、FPUのR8010、2個のタグRAM、ストリーミングキャッュで構成されている。R8000はスーパースケーラで、1サイクルに最大4命令を発行できる。アウト・オブ・オーダー実行ではない。整数パイプラインは5段構成である。
R8000は、チップセット全体の制御と整数演算命令の実行を受け持つ。整数ALU、整数レジスタファイル、一次キャッシュ、命令フェッチ用ハードウェア、分岐予測機構、TLBが含まれる。
パイプラインの1段目では、命令キャッシュから4命令を同時にフェッチする。命令キャッシュは16KBで、ダイレクトマップ方式、仮想インデックス・仮想タグ方式で、ラインサイズは32バイトである。命令のデコードはパイプラインの2段目で行う。3段目でデータのロード/ストアを開始し、4段目で整数演算を行う。整数演算が4段目まで遅延されるため、ロード命令の結果を必要とする場合もキャッシュにヒットすればそのまま演算に利用できる。整数レジスタファイルへの結果の書き戻しは5段目で行われる。
整数レジスタファイルは読み出しポートが9個、書き込みポートが4つある。読み出しポートのうち4個は4つある演算ユニットのうち2つにオペランドを供給するのに使われ、別の4個の読み出しポートは2つのアドレス生成器にオペランドを供給するのに使われる。残る1つの読み出しポートは2バンクあるデータキャッシュにデータを供給するのに使われる。書き込みポートのうち2個は2つの演算ユニットの演算結果を書き込むのに使われ、残る2つはデータキャッシュの2つのバンクそれぞれと繋がっていて、キャッシュからの読み込みに使われる。
整数演算ユニットはALUが2個、シフタが1個、乗除算ユニットが1個あり、さらに2つのアドレス生成ユニットがある。乗除算ユニットはパイプライン化されていない。そのため乗算のレイテンシは、32ビットでは4サイクル、64ビットでは6サイクルである。除算のレイテンシは数値の大きさに依存し、21サイクルから73サイクルまで変化する。
ロード命令とストア命令はパイプラインの3段目から実行を開始する。R8000はアドレス生成ユニットを2つ持っており、それらを使ってロードまたはストアの対象となる仮想アドレスを計算する。4段目でその仮想アドレスとTLBを使って物理アドレスを求める。TLBはデュアルポートで384エントリあり、3ウェイセットアソシアティブ方式になっている。同じサイクル内で16KBのデータキャッシュにアクセスする。データキャッシュもデュアルポートで64ビットのバスで本体と繋がっている。1サイクルで2つのロード命令かロードとストア1つずつを処理可能である。キャッシュにはパリティビットや前方誤り訂正などの誤り検出訂正機構は存在しない。キャッシュミスした場合、二次キャッシュであるストリーミングキャッシュにデータを取りに行くため、8サイクル待たなければならない。一次データキャッシュは仮想インデックス・物理タグ方式のダイレクトマップ方式で、ラインサイズは32バイト、データ更新はライトスルー方式である(その時点で二次キャッシュにも書き込む)。ロード命令で一次データキャッシュにヒットすると、パイプラインの5段目で整数レジスタファイルに書きこむ。
R8010は、R8000の命令キューから供給された浮動小数点命令を実行する。命令キューから先は整数パイプラインと浮動小数点パイプラインが分離しており、整数演算命令と浮動小数点演算命令の間で限定的なアウト・オブ・オーダー実行がなされる。つまり同時にフェッチした4命令についてCPUとFPUの間で完了を待ち合わせない(4命令が全てそれぞれのパイプラインに送られれば、次の4命令をフェッチする)。これは、ストリーミングキャッシュのレイテンシを緩和するための対策だった。
浮動小数点レジスタファイル、ロードキュー、ストアキュー、全く同じ2つの浮動小数点演算ユニットがある。除算と平方根を除いてパイプライン化されている。なお、除算と平方根の計算では乗算器を使用するため、それらの演算を行っている間はパイプラインがストールする。
比較命令以外の演算命令はレイテンシが4サイクルとなっている。単精度および倍精度の除算のレイテンシはそれぞれ14サイクルと20サイクルである。単精度および倍精度の平方根演算のレイテンシはそれぞれ14サイクルと23サイクルである。
ストリーミングキャッシュは外付けの1MBから16MBのキャッシュで、R8000の二次キャッシュ、R8010の一次データキャッシュとして機能する。R8000と同じクロック周波数で動作し、一般的な同期SRAM(SSRAM)で構成される。この方式はデータアクセスを頻繁に必要とする浮動小数点演算の性能を維持するために採用された。小容量で低レイテンシの一次キャッシュでは、十分にデータを供給できず、頻繁にキャッシュミスが発生する。そこでレイテンシは大きいがヒット率向上が望める二次キャッシュを一次キャッシュとし、レイテンシを考慮した設計にした。
ストリーミングキャッシュは2ウェイインターリーブ構造となっている。2つの独立したバンクに分かれていて、一方は奇数アドレスのデータ、もう一方は偶数アドレスのデータを格納する。そのため、2つのリード、2つのライト、1つのリードと1つのライトがそれぞれ別のバンクであれば同時に実行可能である。それぞれのバンクに64ビットの片方向バスが2つあり、一方はリード、もう一方はライトに使用する。これは双方向バスで必要となるバスの方向転換 (bus turnover) を不要にする設計である。方向転換が不要であるため、あるサイクルでリードを行い、次のサイクルでライトを行うことが可能で、間に方向転換のためのサイクルを挟む必要がなく、性能が向上する。
ストリーミングキャッシュのタグは2つのタグRAMチップにあり、それぞれ1つのバンクに対応している。両方のチップに同一のデータが含まれる。それぞれのタグRAMチップは1.189Mbitのキャッシュタグを持ち、4トランジスタのSRAMセルで構成している。このチップは0.7μmのBiCMOSプロセスで実装されており、2層のポリシリコン層と2層のアルミニウム配線層から成る。BiCMOS回路はデコーダ部で使われており、サイクルタイムを減らすためにセンスアンプとコンパレーターを統合している。タグRAMチップは14.8mm×14.8mmで、155ピンのCPGAパッケージであり、消費電力は75MHzで3Wである。タグRAMはキャッシュタグを分担するだけでなく、ストリーミングキャッシュを4ウェイ・セットアソシアティブ構成で動作させる機能も分担している。ピン数を減らすため、キャッシュタグ自体が4ウェイ・セットアソシアティブになっており、通常のセットアソシアティブ式のキャッシュとは異なり、ルックアップ後にロジックでアクセスするセットを選択している。
ストリーミングキャッシュへのアクセスはスループット向上のためにパイプライン化されている。このパイプラインは5段構成で、1段目でアドレスがタグRAMに送られ、2段目でそれにアクセスする。3段目でタグRAMからSSRAM群に信号が送られ、4段目でSSRAMにアクセスし、5段目でデータがR8000またはR8010に戻る。
R8000は17.34mm×17.30mm (299.98mm2) のチップに260万個のトランジスタを集積している。R8010は83万個のトランジスタを集積しており、この2つの合計で343万個のトランジスタを集積していることになる。どちらも東芝が0.7μmのCMOSプロセスで製造し、591ピンのCPGA (ceramic pin grid array) でパッケージしていた。電源電圧は3.3Vで、R8000の消費電力は75MHzで13Wだった。