RISC

概要

RISCのアーキテクチャの着想は、従来のプロセッサに備わっていた様々な命令の大部分が、実際のプログラムを書く際にはほとんど使われていないことが見出されたことにある。CISCアーキテクチャでは、複数の処理を一挙にこなす複雑な命令をもち、また、個々の演算命令につき、任意のアドレッシングモードを組み合わせることが可能（直交性がある）である。だが実際に作成されたプログラムを解析すると、使用される命令はそのうちのごくわずかなものに限られることが判った。この調査結果に基づいて命令セットを簡潔にし、回路を単純にすることで、クロックサイクルを短縮して全体としての、演算の高速化を図るアーキテクチャである。

RISC設計思想

1970年代後半、IBMなどの研究で、実際に使用されているプログラムを解析したところ、複数の処理を一気に行う高機能な命令や、いわゆる直交性のある、命令とアドレッシングモードの組み合わせの大部分は実際のプログラムでは使われていないことが判明した。これは、プログラミング技法が、従来のバイナリコードを意識したアセンブリ言語の記述による低レベルのプログラミング形態から、高級言語で記述してコンパイラを使ってバイナリコードを得る形態に移り変わったことの副産物である。それまでに設計されたCPUの命令セットには、当初アセンブリ言語でプログラムを記述するうえで便利な命令が含まれ、やがてコンパイラでコード生成を行う前提で、高級言語の制御構文をそのまま実行できるように、複雑な機械語の命令も実装される様になった。だが、当時のコンパイラはCPUが持つ利点をあまり生かせていなかった。というのもコンパイラの開発は非常に高度な技術を要し、困難を伴うことだったからである。市場にはそれでもコンパイラが浸透していき、直交性の利点や、複雑な命令の利点は薄められていった。
もうひとつの発見は、複雑な処理を行う命令の所要時間と、単純な命令を組み合わせて同等の処理を行わせる場合の所要時間を比較したとき、しばしば前者が遅いということである。このパラドックスは、CPUの設計に許容される期間の制限から生じた。設計者は十分な時間を与えられず、全ての命令の処理を最適化することができずに、結果としてよく使われる命令の処理時間だけを最適化したのである。有名な例としてVAXのINDEX命令がある。この命令はループを使った同等機能のプログラムコードよりも遅かった。
一方で、メモリの速度よりもCPUの速度の向上が著しくなってきていた。1970年後半の時点でも、以後、CPUの演算速度が向上し続けるのに対してメモリアクセスの速度の向上は限定的であり、以後も速度差が拡大することが明らかだった。すなわち、今後10年の間にCPUの演算速度は相対的にメモリアクセスの10倍、100倍となってゆくのである。こうしてより高速化していくCPUの演算速度を維持するためにはアクセスまでの時間が短いレジスタを増やさなければならず、また、高速化するCPUと速度の上がらないメモリシステムの速度差を埋めるためにキャッシュを拡充しなければならないことは明らかだった。これら多数のレジスタやキャッシュを実装するための面積をシリコン上に確保する必要が生じた。これについてはCPUのアーキテクチャを単純にしてその面積を削減することで、レジスタやキャッシュの為の面積を確保できた。
さらにRISCアーキテクチャの別の優位性が、実際に使われているプログラムの解析結果からも明らかになった。アンドリュー・タネンバウムは様々なプログラムを集めて計測結果をまとめ、多くのプロセッサの備える仕様は、実際のプログラムで要求されるものより過剰であることを立証した。例えば、プログラム内の定数値のうち98%が13ビットに収まることを示したが、一方で既存のCPUのほとんどは定数値を格納するエリアのサイズとして8ビットの倍数にあたるサイズを用意していた。典型的には8ビット、16ビット、32ビットである。これが意味するのは、命令のビット・フィールド構成を適切に設計することで、命令に使用する定数を命令のオペランド・フィールドに格納し、メモリアクセスを減らすことができるということである。定数をメモリやレジスタから取ってくるのではなく、当該命令の中に格納することで速度を向上させることができる。一方で、これを実現するためには命令を表現するビット･フィールド幅を小さくする必要がある。さもなければ命令の中にそれなりのサイズの定数を埋め込むことができないからである。
これらの要素を背景に、アドレッシングモードと命令数を削減する、縮小命令セット (Reduced Instruction Set) という用語が生まれた。従来のアーキテクチャとRISCの本質的な違いは、全ての演算をレジスタ間で行い、メモリへの読み書きをレジスタとメモリの間の転送命令に限る点である。このためRISCはロード/ストア・アーキテクチャとも呼ばれる。RISCアーキテクチャの概念と対比して、従来の設計手法はComplex Instruction Set Computer (CISC) として知られるようになった。ただし、これはあくまでもRISCと対立する概念として捉えるときに使う用語である。また、RISCアーキテクチャと言われるCPUであっても、機種によっては巨大な命令セットを持つこともある。
RISCの設計思想は命令セットを縮小することにある。この副作用として、命令を識別するのに必要なビットフィールド幅が小さくできるため、命令内にオペランドデータを直接含ませる余地が生じ、レジスタやメモリを使わずに済む場面が多くなった。同時にメモリへのインタフェースが単純化され（メモリにアクセスするタイミングが単純化され）、最適化できるようになった。
しかし、RISCにも欠点があった。単純な命令を組み合わせてプログラムを書くため、複雑な命令を持つCISCに比べて同じ処理を実現する場合に必要な命令数が増えた。加えて初期のRISCは命令語長が32ビット幅であり、プログラムサイズが大きくなり、コード密度が低くなると指摘された。当時、利点と欠点のどちらが性能にインパクトがあるかは議論の的となった。

初期のRISC

最初のRISCは開発時点ではRISCであるとは認識されていなかった。それは1964年にSeymour CrayとJim Thorntonが設計したCDC 6600スーパーコンピュータである。ThortonとCrayは数値計算のためにわずか74種類の命令をもつCPUと周辺プロセッサ（OSの大部分はこちらで実行される）と呼ばれる12種の単純なコンピュータを設計した。CDC 6600にはたったふたつのアドレッシングモードしかなかった。CPUは演算用の11本のパイプラインとロード用の5本のパイプラインとストア用の2本のパイプラインを持つ。メモリは複数のバンクに分かれていて、ロード/ストアは並行して実行することが出来た。命令実行サイクルはメモリアクセスにかかる時間の10倍の速さであった。
もうひとつの初期のロード/ストアマシンとしては1968年に設計されたデータ・ゼネラルのNovaがある。
最も一般に知られているRISCはDARPAのVLSI計画の一環で行われた大学での研究である。VLSI計画は今日ではあまり知られていないが、チップの設計、製造、コンピュータグラフィックスなど様々な特筆すべき成果を生み出している。
カリフォルニア大学バークレー校のRISCプロジェクトはデイビッド・パターソンの指揮の下1980年に開始された。基本的な考え方はパイプラインと今日レジスタ・ウィンドウとして知られている大胆なレジスタの用法であった。同時期のCPUが内蔵するレジスタ本数は少数に限られていて、プログラムはその範囲でレジスタを使いまわした。レジスタ・ウィンドウを持つCPUでは、アーキテクチャ上128本のレジスタを持つが、プログラムからはある瞬間に、特定のレジスタ・ウィンドウに属する8本のレジスタのみが見える。CPUはプロシージャ(ルーチン、関数)ごとに別のウィンドウを割り当て、プロシージャごとに相互に異なる8本のレジスタを使用する。そのためプロシージャコールや復帰が極めて高速に実施される。
当時、パターソンらは、RISCはCPUを1チップに収めるための制約の下に単純なアーキテクチャを設計・実装したもので、性能が低下すると考えていた。レジスタ・ウィンドウは、その性能低下を補うために導入されたのである。1981年に発表された論文では、VAX11/780に対して実行サイクル数比で4倍との性能が示されたが、RISCの効果が正しく評価されず、レジスタ・ウィンドウによる効果だと説明されていた。
このRISCプロジェクトは1982年にRISC-Iを完成させた。同時期のCISCプロセッサが10万個のトランジスタからなっていたのに対して、わずか44,420個のトランジスタからなるRISC-Iは32種類の命令しか持たなかったが、極めて高性能だった。次いで1983年にRISC-Iの3倍の性能のRISC-IIが登場した。RISC-IIは40,760個のトランジスタからなり、39種類の命令を持っていた。
同じころ、ジョン・L・ヘネシーは1981年、スタンフォード大学でMIPSプロジェクトを開始した。MIPSでは命令パイプラインを可能な限りフルに動作させることを目標としていた。命令パイプラインはすでに他でも使われていたが、いくつかの工夫によりMIPSのパイプラインは非常に高速に動作した。最も重要な点は全ての命令を1クロックサイクルで実行されるようにしたことである。これによりパイプラインは最大限に効果を発揮しプロセッサの高速化を実現した。但し、乗算や除算といった有用な命令は省略されていた。
チップ上にRISCのCPUを作るという最初の試みは、1975年にIBMが行ったもので、上述の大学の研究よりも早い。プロジェクトが開始された建物の番号をとってIBM 801と名づけられたプロセッサファミリはIBMのマシンに広く応用された。1981年に製造されたシングルチップのROMPはResearch (Office Products Division) Mini Processorの略であり、名前が小型の市場を意識していることを示している。これを使って1986年にIBM RT-PCをリリースしたが、性能的には問題があった。とはいうものの、801はいくつかのプロジェクトを生み出し、後にここからPOWERが生まれることになった。
初期のRISCは、単純で小型ながら高い性能を発揮する効果は知られていたものの研究室レベルで留まっていた。バークレーの成果はよく知られるようになったため、RISCという言葉が一般化することになった。多くのコンピュータ業界関係者は、実際の商用アプリケーションを高速に実行できなければ意味がないと批評し、それを使おうとしなかった。しかし1986年、各研究プロジェクトの成果が製品となっていった。実際、ほとんどのRISCプロセッサはRISC-IIの設計をコピーするところからはじまっている。

現在のRISC

2009年現在では、「RISC対CISC」という単純な優劣論争は、技術的にはもはや意味を持たない。x86などの代表的なCISCプロセッサは内部的にRISCのアーキテクチャを段階的に取り入れ、逆に代表的なRISCプロセッサは命令数の追加を続けているためである。
RISCの当初の設計思想は「少ない簡潔な命令数による、回路設計の単純化とパイプライン効果の最大化によって、性能向上と低コスト化、更には容易な動作周波数の向上を実現する」ものであった。しかし現在の主要なRISCプロセッサは、商用計算用の10進数演算や、暗号化、仮想化、アウト・オブ・オーダー実行などの複雑な命令を追加し続けている。この背景には、当初より幅広い用途や新しい機能が求められていること、性能を確保したまま多数の命令を実装できる半導体技術と回路設計技術の向上、単純な動作周波数の向上には消費電力や発熱などの副作用や限界があった。以降はマルチコア化へ性能向上の舵を切ることになる。このため現在では高性能なプロセッサの開発は、開発費用も製造費用（設備投資など）も膨大になり、大規模なチップメーカー以外はハイエンドのプロセッサの開発・製造が困難となっている。
とはいえ、命令数と回路規模以外は依然としてRISCの設計思想が強く残る。命令は32ビットチップこそ固定小数32ビット、浮動小数64ビット、SIMDが128ビットとなるが各ユニットで常に固定長、アドレッシングモードもレジスタ - レジスタとロード・ストアの二種しかないことに変わりなく、レジスタはIA-64は別として、x64と比較しても倍の32本以上を持つ。こうしたこともあって、プロセッサの分類として、x86やSystem zなどを「CISC」、MIPS・POWER・SPARCなどを「RISC」と呼ぶ事は、なお一般的である。
市場別には、パーソナルコンピュータとメインフレームでは、過去の命令セットとの上位互換性が重視され、CISCがほぼ独占している。UNIXサーバー市場では、ローエンドはCISC（主にx86）、ハイエンドはRISC（POWER、SPARCなど）が多数派である。携帯電話・ゲーム機(ただし2013年にPlayStation 4とXbox Oneはx86になった)・ネットワーク機器など組み込み市場では、命令セットの上位互換性は重視されず、低消費電力かつ高性能なプロセッサが強く求められ、32ビット・64ビットプロセッサではほぼRISCが独占している（ARM、MIPS、PowerPC、SuperHなど）。