R4000

R4000は、MIPS III命令セットアーキテクチャ (ISA) を実装したマイクロプロセッサで、ミップス社が設計した。1991年10月1日に正式発表された。64ビットのマイクロプロセッサとしては最初期のもので、MIPS III を最初に実装した。1990年代初期、RISCマイクロプロセッサは Intel486 などのCISCマイクロプロセッサに取って代わることが期待され(1991年当時、副社長だったスキップ・ストリッター（英語版）はR4000を製造するNECが486を製造するintelとの価格競争に勝つだろうとの見方を示していた)、R4000はRISCプラットフォームの業界共通規格である Advanced Computing Environment（英語版） (ACE) で使用するマイクロプロセッサに選ばれた。ACE自体は様々な要因が重なって失敗に終わったが、R4000 はワークステーションやサーバ市場で成功を収めた。 R3000に比較して、以下のような強化がなされている。 FPUを内蔵 64ビット対応のレジスタセットと命令セット 8段のパイプラインで、システムクロックの倍のクロックで動作する（スーパーパイプラインと呼称）。 動作周波数（内部）は100MHzと150MHz 二次キャッシュメモリをサポート（最大 4Mバイト） マルチプロセッサ対応の命令とキャッシュ R4000はバリエーションとして以下のものがある。 R4000PC 二次キャッシュへのインタフェースを削除してピン数を減らしたバージョン。 R4000SC 二次キャッシュを接続可能なバージョン。 R4000MC 二次キャッシュ・インタフェースに加えてマルチプロセッサ対応インターフェイスを備えたバージョン。 ただし、内蔵キャッシュは命令 8Kバイト、データ 8Kバイトであり、R3000よりも小さくなっている。ほとんど間をおかずに内蔵キャッシュ容量を倍増したR4400をリリースしている。 スーパーパイプラインの割りには動作周波数が低く、スーパースカラも採用していないため、他社CPUに遅れをとるようになった。これは自社工場を持たず、設計と製造が分離されたことによるオーバーヘッドによるものと見るものもある。 その後、R10000などにより、第一線級CPUファミリーへの復帰を図ったが、ある程度先端的なラインと製造技術を要求するため、製造できるメーカが限られる結果となり、競争力をさらに低下させる遠因ともなった。 とは言うものの、R4000/R4400はワークステーションやサーバに広く使われた。また、派生品の R4100、R4300、R4600などは組み込みシステムで多く使われている。 R4000は、パイプラインの段数を8段にしてひとつのステージの処理量を減らし、動作周波数を向上させた（スーパーパイプライン）。プロセッサのアーキテクチャ上の改善は実はそれだけであり、分岐予測もアウト・オブ・オーダー実行も投機的実行もレジスタ・リネーミングもこの段階では全く採用されていない。それよりも、設計上の主眼はマルチプロセッサ対応機能のサポートと64ビット化に置かれている。 細かい機能の改善点としては、以下のような点が上げられる。 branch likely 命令の追加（MIPS II で既に追加されている）。条件分岐命令では次の命令が必ず実行された上で分岐すべき状態ならば分岐していた。branch likely命令では分岐するときだけ次の命令を実行し、分岐しないときは実行しないという動作をする。これを使うと、分岐先を2命令先にしておけば、実質的に分岐で実行されるのは次の命令だけとなり、パイプラインを乱さずに条件付動作を実現できる。 浮動小数点演算では、平方根を求める命令が追加された。 TLBは 48エントリと減っているが、1エントリで物理ページを2ページマップすることができるようになっている。したがって、実質的には96エントリに増えているとも言える。 また、ページサイズが4Kバイト固定から、4K～16Mバイトまで可変となった。たとえばX Window Systemのサーバプロセスがフレームバッファを16MバイトのページでマップすることでTLBの浪費を防ぐことができる。 64ビットモードでは、汎用レジスタが全て64ビット幅となり、アドレスに関連する情報を格納するCP0レジスタも64ビット化された。各種演算は64ビット版が用意されている。メモリ管理ユニット (MMU) は48エントリのTLBを使って仮想アドレスから物理アドレスへの変換を行う。仮想アドレス空間は64ビットとなっているが、実はフラットではない（右図参照）。実際には40ビット、すなわち1TBの仮想記憶空間しか実装していない。それ以外のビットはゼロであることを確認するだけとなっている。物理アドレスは36ビットで、物理メモリ空間は64GBまでとなっている。また、特筆すべきは特権モードとしてカーネルモードとユーザモードの中間のスーパーバイザモードが導入された点である。この図の中で xkphys は説明が必要であろう。xkphys は物理空間をTLBを使わずにマップしているが、サイズは物理空間 64GBよりもずっと大きい。これは、従来の kseg0 と kseg1 を拡張したものであり、キャッシュコヒーレンシ（後述）をどういう方式で保つかによって物理空間を多重にマップしているためである。xkphysにカーネルをおく場合、キャッシュコヒーレンシの方式（プロトコル）によってアクセスすべきアドレスが異なる。 マルチプロセッサをサポートするにあたって、重要な点のひとつはキャッシュコヒーレンシである。R4000MC/R4400MCでは、スヌープ方式が採用されており、無効型(MESI)プロトコルも更新型(MOESI)プロトコルも選択できるようになっている(MESIプロトコル参照)。 もうひとつ、マルチプロセッサで重要となるのは、並行して動作するスレッド間の同期をとる機構である。MIPSでは以下のふたつの機構で同期をとる。 sync命令 はメモリアクセスの順序性を保証する。たとえば、あるデータを更新したら、更新完了を示すフラグを立てるとする。その順番がTLBやキャッシュの状態に左右されて期待した順番にならないと更新していないものが更新されたように他のプロセッサから見えてしまう。これを防ぐのがsync命令である。まず、プロセッサXが次のようなコードを実行する。 sw t3, DT1 li t4, 1 sync sw t4, FL1 ここで、DT1が更新されたことをFL1で示す。一方プロセッサYは次のようなコードを実行する。 loop: lw t5, FL1 beq t2, zero, loop nop sync lw t6, DT1 これによって順序性を保つ。sync命令はマルチプロセッサでない場合でも、I/Oデバイスへの書き込み（通常キャッシュを使用しないが、プロセッサ内にストアバッファがあるので命令が完了しても書き込まれていないことがある）の完了を保証する目的で使うことができる。 ll/sc命令 ll命令（load linked）はロード命令として動作するが、その際にロードアドレスをCP0のレジスタ LLAddr に格納しておく。その後でロードした内容に変更を加え、sc命令（store conditional）で元のアドレスに書き込む。ただし、sc命令は以下のように動作する。 まずLLAddrに格納されているアドレスとストアしようとしているアドレスが同じかどうかチェックする。違う場合は失敗したとしてストア元のレジスタに 0 を格納して終了する。 次に該当するキャッシュラインの状態をチェックする。これによって他のプロセッサがそのキャッシュラインに該当するメモリアドレスに書き込みを行ったかどうかがわかるので、もし書き込まれていたら失敗したと判断して、ストア元のレジスタに 0 を格納して終了する。 成功すれば、メモリに書き込みを行ってストア元のレジスタに 0 以外を書き込んで終了する。 なお、LLAddr は例外が発生した場合もクリアされる。これを使うと、単純なスピンロックも、リーダー・ライターロックも実現可能である。スピンロックのコードは以下のようになる。 Loop: ll t2, (t1)  ; t1 の指すアドレスからロックワードを読み込む(0:未ロック 1:ロック済み） ori t3, t2, 1  ; 1 を立てる beq t3, t2, Loop  ; 1 が元から立っている場合はスピンする nop sc t3, (t1)  ; 書き戻す beq t3, zero, Loop ; じゃまが入った場合は最初からやり直し nop R4000の整数パイプラインは8段となっている。第1段 (IF) で実行すべき命令の仮想アドレスを生成し、TLBで仮想アドレスから物理アドレスへの変換を開始する。第2段 (IS) では変換が完了して8KBの命令キャッシュから命令をフェッチ（読み込み）する。この命令キャッシュはダイレクトマップ方式で仮想インデックス・物理タグ方式である。ラインサイズは16バイトまたは32バイト。アーキテクチャ上は32KBまで拡張可能になっている。 第3段 (RF) では命令が解釈され、レジスタファイルを読み込む。MIPS III ではレジスタファイルが2つ定義されており、1つは整数演算用、もう1つは浮動小数点演算用である。どちらも64ビット幅で32エントリある。整数レジスタファイルには2つの読み込みポートと1つの書き込みポートがあり、浮動小数点レジスタファイルには2つの読み込みポートと2つの書き込みポートがある。命令実行は第4段 (EX) から開始される。レジスタファイルへの書き込みは第8段 (WB) で行われる。 R4000の整数演算部には、演算論理装置 (ALU)、シフタ、乗算器、除算器、ロードアドレス生成器がある。ALUには64ビットの桁上げ選択式加算器と論理ユニットがあり、パイプライン化されている。シフタは32ビットのバレルシフタで、64ビットのシフト命令を2サイクルで実行するため、1サイクルだけパイプラインをストールさせる。チップサイズを削減するためこのような設計を選択した。乗算器と除算器はパイプライン化されておらず、大きなレイテンシがある。乗算は10サイクル（32ビットの場合）または20サイクル（64ビットの場合）のレイテンシがあり、除算は69サイクル（32ビット）または133サイクル（64ビット）のレイテンシがある。ほとんどの整数演算命令は1サイクルしかかからない。ALUの加算器はメモリのロードまたはストア、分岐先アドレスなどの計算にも使われる。 R4000は IEEE 754-1985 準拠のFPUを同じチップ上に搭載しており、その部分を R4010 と呼ぶこともある。FPUはCP1のコプロセッサとして動作する（MIPS ISA ではCP0からCP3まで4つのコプロセッサを利用できるよう定義している）。CPUのステータスレジスタのFRビットの設定により、FPUの32ビットモードと64ビットモードを切り替えることができる。32ビットモードでは32本の浮動小数点レジスタはそれぞれ32ビット幅となり、32個の単精度浮動小数点数を格納するか、2本のレジスタを1組として16個の倍精度浮動小数点数を格納する。 FPUはデータやリソースの依存関係がなければALUと同時に動作可能で、依存関係があればストールが発生する。FPUには3つのサブユニットがあり、それぞれ加算器、乗算器、除算器である。乗算器と除算器は加算器と並行に命令を実行できるが、乗算も除算も最終段で加算器を使用するため、並行実行にも制限がある。したがってFPUでは最大3個の命令（加算、乗算、除算）を並行実行でき、1サイクルに1命令を実行に移すことができる。 加算器と乗算器はパイプライン化されている。乗算器は4段のパイプラインになっており、性能向上のため dynamic logic を使ってマイクロプロセッサのクロックの2倍の周波数で駆動される。除算には23サイクル（単精度）または36サイクル（倍精度）かかり、平方根の計算にはそれぞれ54サイクルまたは112サイクルのレイテンシが生じる。除算と平方根計算には、SRT除算アルゴリズムを使っている。 R4000SC/MCは128KBから4MBまでの二次キャッシュをサポートしている。二次キャッシュには専用の128ビットのデータバスでアクセスする。二次キャッシュは命令用とデータ用を分離して実装することもできるし、統合して実装することもできる。後に命令キャッシュとデータキャッシュをそれぞれ128KBから2MBの範囲で実装可能となった。二次キャッシュは物理インデックス・物理タグ方式で、ラインサイズは128/256/512/1024バイトのいずれかを選択できる。キャッシュコントローラはR4000本体内にある。二次キャッシュには普通のSRAMを使える。データバスとタグバスはECCで保護されている。 R4000のシステムバスは64ビット幅で、SysADバスと呼ばれる。SysADバスはアドレスとデータを多重化しており、同じ線をアドレス転送とデータ転送で共用する。そのため帯域幅が狭くなるが、アドレスとデータに別々のバスを用意するより安価で構築でき、システムの複雑さも低減できる。SysADバスの駆動周波数はプロセッサの内部周波数の半分、3分の1、4分の1のいずれかに設定可能である。SysADバスはシステムクロックを分周することで駆動クロックを生成する。 R4000は120万個のトランジスタを集積している。1.0μmCMOSプロセスで製造することを意図して設計された。ミップス社はファブレス企業であるため、パートナー半導体企業にライセンス提供することで製造され、中には0.8μmプロセスで製造した企業もある。 R4000は外部から供給される主クロック信号を元にして様々なクロック信号を生成する。動作周波数のクロック信号を生成するため、R4000は内蔵の位相同期回路 (PLL) を使って主クロック信号の2倍のクロック信号を生成している。 R4000PCのパッケージは179ピンのCPGA (ceramic pin grid array) である。R4000SC/MCは447ピンのSPGA (staggered pin grid array) である。R4000MCのピン配置とR4000SCのピン配置は異なり、R4000SCでは使われていないピンがR4000MCではキャッシュコヒーレンシの実装に使われている。R4000PCのピン配置は同じPGAパッケージのR4200やR4600とほぼ同じである。そのためこの3種のマイクロプロセッサを使ったシステムは設計を共通化しやすい。 R4400は、R4000の改良版である。1992年11月初めに発表された。一部の主要顧客にサンプル出荷した後、1993年1月に一般に出荷し始めた。動作周波数が高くなり、100MHz、133MHz、150MHz、200MHz、250MHz という版が出荷された。R4000からの強化は一次キャッシュ容量増だけで、命令・データともに16KBとなった。230万個のトランジスタを集積している。 R4400は、IDT、LSI Logic、NEC、Performance Semiconductor、シーメンス、東芝がライセンス生産した。IDT、NEC、シーメンス、東芝は自社ブランドでも販売している。LSI Logic はカスタム製品に使った。Performance Semiconductor はR4400を製造していた部門を Cypress Semiconductor に売却し、そちらではMIPSのマイクロプロセッサ生産をしなくなった。 NECはこれをVR4400として発売。最初の150MHz版は1992年11月に発表した。当初は0.6μmプロセスで製造していた。1995年中ごろには250MHz版のサンプル出荷を開始。こちらは0.35μmプロセスで製造している。NECはまた、MR4401というマルチチップモジュール (MCM) を開発している。これはVR4400SCと1MビットSRAM10個を集積したもので、SRAMは1MBの二次キャッシュとなっている。このMCMはR4400PCとピン配置が同じになっていた（つまりR4x00PC用のシステム設計で二次キャッシュによる高速化が可能）。150MHz版が1994年に発表され、1995年には200MHz版が発表された。 東芝は TC86R4400 として発売。1994年中ごろに0.3μmプロセスで製造した200MHz版を発売した。1万個単位で購入した場合の価格は、R4400PCが1600ドル、R4400SCが1950ドル、R4400MCが2150ドルだった。 Carrera Computers - Windows NT ワークステーションで使用 コンカレント・コンピュータ - リアルタイム・マルチプロセッサシステム Maxion で使用 DeskStation Technology - Windows NT ワークステーションで使用 日本電気 (NEC) - RISCstation（NTワークステーション）、EWS4800/UP4800、Cenju-3スーパーコンピュータで使用 ピラミッド・テクノロジー - Nile Series サーバでR4400MCを使用 Siemens Nixdorf Informationssysteme (SNI) - UNIXサーバRMシリーズとメインフレームSR2000で使用 シリコングラフィックス - Indigo、Indigo2、IndyといったワークステーションとChallengeサーバで使用 タンデムコンピューターズ - フォールトトレラントシステム NonStop Himalaya で使用 R4000/R4400はシステムとのインタフェースにコアロジックを外付けする必要がある。一般にも販売されたが、各社が独自開発したものもある。例えばSGIは独自開発したものを使っていた。一般に販売されたチップセットとしてはエイサー、NEC、東芝などのものがある。エイサーのチップセットは PICA、東芝のチップセットは Tiger Shark と称した。Tiger Shark はSysADバスをi486互換バスに変換する方式だった。 R4200、R4300i - 低価格/低消費電力版。二次キャッシュコントローラを持たない。NINTENDO64 は NEC製 VR4300 を使用。 R4600、R4700 - Quantum Effect Devices (QED) の設計。二次キャッシュコントローラを持たない。UNIXマシン以外にシスコシステムズのルーターで使われた。 R5000 - スーパースケーラ方式で2命令同時実行可能。二次キャッシュを接続可能。