R10000 は、MIPS IV命令セットアーキテクチャ (ISA) を実装したRISCマイクロプロセッサで、当時シリコングラフィックス (SGI) の子会社となっていたミップス・テクノロジーズ (MTI) が開発した。開発コード名は "T5"。チーフデザイナーは Chris Rowen と Kenneth C. Yeager。R10000のマイクロアーキテクチャは ANDES(Architecture with Non-sequential Dynamic Execution Scheduling、非逐次的動的実行スケジューリング・アーキテクチャ)と名付けられている。ハイエンドではR8000、それ以外ではR4400の後継として、それらに取って代わった。MTIはファブレス企業であり、実際の製造は日本電気 (NEC) と東芝が行った。R4000/R4400以上に設備投資がかかるため、それまでMIPSアーキテクチャのマイクロプロセッサを手がけていたIDTなどの半導体企業はR10000を製造しなかった。

## 歴史

1996年1月に150MHz版と200MHz版が登場したが、製造工程の問題があり、大量生産が可能になったのは同年後半である。200MHz版の供給量は1996年末まで少ないままで、結果として価格は3,000ドルとなっていた。

1996年9月25日SGIは、NECが同年3月から7月末まで製造したR10000に電流が流れすぎるという問題があり、動作中にシステムがダウンする虞があると発表。SGIは出荷済みの1万個のR10000のリコールを実施し、両社は多大な損失を蒙った。

1997年、0.25μmプロセスでの製造が始まり、250MHzでの動作が可能となった。

## 採用例

- SGI - ワークステーションの Indigo2 と O2、サーバの Challenge、スーパーコンピュータの Origin 2000 など。
- NEC - ワークステーションのEWS4800、サーバのUP4800、Express5800、スーパーコンピュータの Cenju-4
- Siemens Nixdorf - Unix系サーバ
- タンデムコンピューターズ - フォールトトレラント・サーバ NonStop Himalaya

## 詳細

R10000は4ウェイ・スーパースケーラ設計で、レジスタ・リネーミングとアウト・オブ・オーダー実行機能を実装している。それまでのR4000などのMIPSマイクロプロセッサは単純な設計が多かったが、R10000の設計はそれらとは一線を画すものだった。

R10000は命令キャッシュから1サイクルに4命令をフェッチする。命令をデコードするとその種類によって、整数演算、浮動小数点演算、ロード/ストアそれぞれの命令キューに入れる。デコード部の補助として、命令キャッシュに命令を格納する際に事前に一部デコードし、命令毎に4ビットの情報を付加しており、その命令をどの演算ユニットで実行すればよいかがすぐわかるようになっている。また、命令のフォーマットを再構成してデコード処理を最適化している。

各命令キューはデコーダから最大4命令まで受け付けることができ、ボトルネックにならないようにしている。命令キューは、オペランドやリソースの動的依存関係を考慮して、実行できるものから対応する演算ユニットに命令を発行する。ロード/ストア命令キュー以外は、1サイクルに最大2命令を演算ユニットに対して発行できる。ロード/ストア命令キューは1サイクルに1命令しか発行できない。全体として1サイクルに最大5命令を発行できる。

### 整数演算ユニット

整数演算ユニットには、整数レジスタファイル、3本のパイプライン(整数演算用2本、ロード/ストア用1本)がある。整数レジスタファイルには64ビット幅のレジスタが64本あり、うち32本がアーキテクチャ上のレジスタで、残る32本はリネーミング用である。レジスタファイルには読み取りポートが7つ、書き込みポートが3つある。2つの整数演算パイプラインには加算器と論理演算部がある。ただし、バレルシフタと分岐予測用ハードウェアがあるのは1本目のパイプラインだけで、2本目は乗算器と除算器へのアクセスに使用する。乗算器はパイプライン化されていて、32ビットではレイテンシが6サイクル、64ビットでは10サイクルとなっている。除算器はパイプライン化されておらず、1ビットあたり1サイクルかかる引き放し除算を採用しているので、32ビットでは35サイクル、64ビットでは67サイクルのレイテンシとなる。

### FPU

FPUには、加算器、乗算器、除算ユニット、平方根計算ユニットの4つの演算ユニットがある。加算器と乗算器はパイプライン化されているが、除算ユニットと平方根計算ユニットはパイプライン化されていない。加算器と乗算器はレイテンシが3サイクルだが、サイクル毎に新たな命令を受け付けられる。除算ユニットは、単精度ではレイテンシが12サイクル、倍精度では19サイクルとなっている。

平方根計算ユニットは、平方根と平方根の逆数を求める命令を実行する。平方根命令のレイテンシは18サイクル(単精度)または33サイクル(倍精度)である。平方根命令は20サイクル(単精度)または35サイクル(倍精度)に1回の間隔で発行可能。平方根の逆数はさらにレイテンシが長く、単精度では30サイクル、倍精度では52サイクルとなる。

浮動小数点レジスタファイルには64ビット幅のレジスタが64本あり、うち32本がアーキテクチャ上のレジスタ、残る32本がリネーミング用レジスタである。加算器には専用の読み取りポートと書き込みポートがあるが、乗算器と除算ユニットと平方根計算ユニットはポートを共有する。

除算ユニットと平方根計算ユニットはSRT除算アルゴリズムを採用している。MIPS IV ISA には積和演算命令がある。R10000では乗算器から加算器へのバイパスがあり、レジスタファイルを経由せずに乗算結果を加算器パイプラインに送り込める。したがって積和演算専用ユニットは持たないが、レイテンシは4サイクルとなっている。

### キャッシュ

R10000は当時としては大きなキャッシュをチップに搭載していた。命令キャッシュ32KBとデータキャッシュ32KBである。命令キャッシュは2ウェイ・セットアソシアティブで、ラインサイズは128バイトである。命令は部分的にデコードされて命令毎に4ビットの情報を付与されてキャッシュに格納される。

データキャッシュはデュアルポートの2ウェイ・インターリーブ式である。16KBのバンクが2つあり、それぞれが2ウェイ・セットアソシアティブ方式となっている。ラインサイズは64バイトで、書き込みに対してはライトバック・プロトコルを採用。仮想インデックス・物理タグ方式なので、同一サイクル中にCPUからキャッシュにアクセスしつつ、二次キャッシュとのキャッシュコヒーレンシを保つことができる。

外付けの二次キャッシュは命令・データ統合型で、512KBから16MBまでの容量を接続可能。一般的な同期SRAM (SSRAM) を使用する。専用の128ビットバスで接続し、9ビットのECCで誤りを訂正できる。このキャッシュとバスはR10000と同じクロックで駆動され、最大周波数は200MHzである。200MHzではバスのピーク帯域幅は3.2GB/sとなる。2ウェイ・セットアソシアティブ方式だが、ピン数を減らすためにR10000側がアクセスするウェイを予測している。

### アドレッシング

MIPS IV は64ビット・アーキテクチャだが、コスト削減のためR10000の仮想アドレス空間も物理アドレス空間も64ビット全部を実装していない。それでも物理アドレスは40ビット、仮想アドレスは44ビットで、1TBまでの記憶装置をアドレッシング可能で、仮想記憶は16TBにもなる。

### システムバス: Avalanche bus

R10000のシステムバスは Avalanche bus と呼ばれる64ビットバスで、最高100MHzで駆動可能である。アドレスバスとデータバスを多重化していてアドレスの転送にサイクルを使用するため、理論上の最大帯域幅は800MB/sだが、実際のピーク帯域幅は640MB/sとなる。

システムインタフェース・コントローラは、最大4プロセッサまでの密結合・対称型マルチプロセッシング (SMP) をサポートしている。外部にバス制御ロジックを追加すれば、理論上は数百のプロセッサでも結合可能である。例えば、SGIの Origin 2000 は最大128プロセッサを搭載可能である(NUMA)。

### 製造

R10000は約680万個のトランジスタを集積しており、そのうち約440万個が一次キャッシュの実装に使われている。チップ寸法は16.640mm×17.934mmで、面積は298.422 mm。0.35μmプロセスで製造され、599ピンのセラミックパッケージのものが 1994 Microprocessor Forum で公開され、527ピンCPGAで製品化されると発表された。また、1MBの二次キャッシュを含む339ピンのマルチチップモジュール (MCM) も検討中だとされていた。

## 派生品

R10000をベースとしてそれを拡張した派生品が次々と登場した。SGIが高性能計算 (HPC) システムに多数実装することを考慮し、R12000以降のマイクロプロセッサは消費電力が15Wから20W以下になるよう動作周波数が低めに抑えられている。

### R12000

R12000はミップスが設計を開始し、SGIが完成させた。NECと東芝が製造。NECではVR12000の名で販売した。1998年11月に登場し、270MHz版、300MHz版、360MHz版がある。R10000とは全く異なる設計の "Beast" プロジェクトが中止されたため、急遽R10000を改良したR12000が開発されることになった。R12000はSGI以外にNEC、Siemens-Nixdorf、タンデムコンピューターズが採用した。

R12000はクロック周波数を上げるため、クリティカルパスを解決すべくパイプラインの段数を増やしている。また、分岐履歴テーブルのエントリ数を増やして分岐予測性能を向上させている。また、命令キューが入れられた命令の古さを考慮するようにし、可能な限り古い命令を先に実行するようにした。

NECと東芝は0.25μmCMOSプロセスで製造。しかし、単にマイクロアーキテクチャを縮小したわけではなく、0.25μmプロセスに最適化する設計を行っている。NEC製のVR12000は約715万個のトランジスタを15.7mm×14.6mm (229.22 mm) のチップに集積している。

### R12000A

R12000はSGIが開発したR12000の改良版で、2000年7月、400MHz版が登場した。NECが0.18μmプロセスで製造。

### R14000

R14000はR12000の後継として2001年7月に発表された。500MHzで動作し、0.13μmCMOSプロセスで製造されている。マイクロアーキテクチャを改良し、二次キャッシュに DDR SDRAM を使えるようにし、システムバスを200MHzまで高速化できるようにした。

### R14000A

R14000AはR14000の改良版として2002年2月に発表された。600MHzで動作し、消費電力は約17Wである。NECが0.13μmCMOSプロセスで製造した。

### R16000

R16000はR10000の最後の派生品で、開発コード名は "N0" である。SGIが開発し、NECが0.11μmプロセスで製造した。2003年1月9日、SGIのワークステーション Fuel で700MHz版が使われたのが最初である。2003年4月には600MHz版を搭載した Origin 350 が登場した。従来からの改良点は一次キャッシュが命令・データ共に64KBになった点である。

### R16000A

R16000のうち、700MHzより高い周波数で動作するものをR16000Aと呼ぶ(2008年時点でNECからの800MHz動作品がVR16000と記載されていたことから必ずしもAを付けることでの呼び名の使い分けは統一されていない可能性がある)。800MHz版が2004年2月に登場した。その後、900MHz版が登場し、これがMIPSアーキテクチャでは最高速だったが、SGIはさらに1.0GHz版を一部顧客に提供した。R16000AはSGIの Fuel、Tezroといったワークステーション、サーバ/スーパーコンピュータの Origin 3000 で採用されている。また、タンデムコンピューターズをコンパック経由で取得したヒューレット・パッカードがフォールトトレラントシステム NonStop Himalaya S-Series で採用している。

### R18000

R18000は、R10000マイクロアーキテクチャのさらなる改良としてSGIが2001年の Hot Chips シンポジウムで発表したが、開発は中止された。SGIのccNUMAサーバやスーパーコンピュータ向けに設計されていた。それらのシステムは1ノードに2個のR18000を密結合型で搭載し、ノード間をハイパーキューブ型ネットワークで相互接続する構成である。

R18000では浮動小数点命令キューを改善し、2つの積和演算ユニットを追加してFLOPS値を4倍にすることを想定していた。システムインタフェースとメモリ階層も大幅に見直される予定だった。仮想アドレスは52ビット、物理アドレスは48ビットとされている。システムバスを2つの一方向DDRリンクに置き換え、アドレスと書き込みには64ビットのリンク、読み取りには128ビットのリンクを使用する。一方向ではあるが、それぞれもう一つのR18000と共有可能である(ただし、2プロセッサの間で多重化して使用)。また、従来との互換性のために SysADバス(R4000)やAvalancheバス(R10000)も利用できる。

1MBの4ウェイ・セットアソシアティブの二次キャッシュをチップ上に搭載し、2MBから64MBの三次キャッシュ(SDR SSRAM、DDR SSRAM、DDR SDRAM)を外付け可能。また、三次キャッシュのタグはそれだけで400KBになるが、これをチップ上に搭載してレイテンシを小さくすることになっていた。三次キャッシュを接続するバスは144ビットで、128ビットはデータ用、8ビットはECC用である。三次キャッシュのクロックレートは変更可能。

NECが0.13μmCMOSプロセスで製造予定だった。電源電圧は1.2Vとし、消費電力と発熱を抑える予定だった。