RISC

RISCは、コンピュータのプロセッサの命令セットアーキテクチャ  の設計の方向性として、命令セットの複雑さを減らすことすなわち、命令の総数や種類を減らし、それぞれの命令が行う処理を単純なものにし、命令フォーマットの種類を減らし、オペランドのアドレッシングを単純化する、などといった方向性により「命令セットを縮小して」設計されたコンピュータである。この方向性が新しいものとして提案された際、従来のその逆の方向性を指すレトロニムとしてCISCという語が同時に提案された。

1. 概要
-----

この着想のひとつは、従来のプロセッサに備わっていた様々な命令の大部分が、実際のプログラムを書く際にはほとんど使われていないことが見出されたことにある。これは特に IBM 801 の開発に関して言われている。従来のプロセッサでは、複数の処理を一挙にこなす複雑な命令をもち、また、個々の演算命令につき、任意のアドレッシングモードを組み合わせることが可能である。だが実際に作成されたプログラムを解析すると、使用される命令はそのうちのごくわずかなものに限られることが判った。この調査結果に基づいて命令セットを簡潔にすることが試みられた。

先行例としてのIBM 801 に続いて、RISCの提案は、1980年代のジョン・ヘネシーとデイビッド・パターソンによる。この論文"RISC I:A Reduced Instruction Set VLSI Computer"では、調査対象とした従来型の命令セットを持つプロセッサをCISCと呼び、その対比として提案した命令セットを持つプロセッサをRISCと呼んだ。特に、801 は「チップに集積されたコンピュータ」ではなく、一方、ヘネシーとパターソンの提案は Mead & Conway revolutionと呼ばれている当時のVLSI開発の機運という背景もあって、マイクロプロセッサとしての実装が前提となっている。

2. 特徴
-----

RISCアーキテクチャの特徴として以下の要素が言及される。

固定命令語長命令の解読に際して可変長命令では命令長の判別と切り出し等に時間がかかっていた欠点を排除し、命令デコードに要する時間を短縮すると共に、命令の先読みをしてパイプラインの効率を上げる。全ての演算は1クロックで実行する。パイプライン動作にウエイトを生じさせない。初期のアーキテクチャでは処理に複数クロックを要する乗除算命令を省略し、乗除算の必要には複数の命令を組み合わせて実現した。演算はレジスタ‐レジスタ間演算のみ回路構成の単純化を図るとともに、メモリ・アクセスのレイテンシがパイプライン動作に悪影響を与えるのを避ける。メモリに影響する命令はロード・ストア命令のみであり、通常メモリ上のデータへの明示的な演算は行われない。ワイヤードロジックで構成するマイクロコードによる命令実行を排し、命令実行に要するクロックサイクル数を削減するとともに、命令解析・実行を行う回路をゲートの組み合わせで実装し、高クロック動作を可能にする。多数のレジスタを備える。演算の途中結果をCPU内に蓄えられる様にして、メモリへのアクセスを減らし、メモリ･アクセスによるレイテンシで動作が遅延するのを避ける。遅延実行スロットを備えるパイプラインハザードを避け、パイプラインの処理効率を上げる。などが挙げられるが、例外も多い。

CISCではハードウエアでサポートされているスタック操作命令がRISCにはなく、スタック操作などの処理は単純な命令を組み合わせて代替処理を行う。命令の組み合わせによって発生し得るパイプラインハザードはコンパイラでコード生成時に検出し、命令の順序を最適化することで回避する。排他制御などで不可欠なアトミック命令はRISCでもサポートされる。

命令語長を固定長にすることでパイプライン処理の処理効率を向上させることができるが、プログラムをコンパイルする際にパイプライン動作を前提とした最適化を行う必要があり、コンパイラ作成には高度な技術が要求される。

3. 歴史
-----

3.1. 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ビットである。これが意味するのは、命令のビット・フィールド構成を適切に設計することで、命令に使用する定数を命令のオペランド・フィールドに格納し、メモリアクセスを減らすことができるということである。定数をメモリやレジスタから取ってくるのではなく、当該命令の中に格納することで速度を向上させることができる。一方で、これを実現するためには命令を表現するビット･フィールド幅を小さくする必要がある。さもなければ命令の中にそれなりのサイズの定数を埋め込むことができないからである。

これらの要素を背景に、アドレッシングモードと命令数を削減する、縮小命令セット  という用語が生まれた。従来のアーキテクチャとRISCの本質的な違いは、全ての演算をレジスタ間で行い、メモリへの読み書きをレジスタとメモリの間の転送命令に限る点である。このためRISCは//ロード/ストア・アーキテクチャ//とも呼ばれる。RISCアーキテクチャの概念と対比して、従来の設計手法はComplex Instruction Set Computer  として知られるようになった。ただし、これはあくまでもRISCと対立する概念として捉えるときに使う用語である。また、RISCアーキテクチャと言われるCPUであっても、機種によっては巨大な命令セットを持つこともある。

RISCの設計思想は命令セットを縮小することにある。この副作用として、命令を識別するのに必要なビットフィールド幅が小さくできるため、命令内にオペランドデータを直接含ませる余地が生じ、レジスタやメモリを使わずに済む場面が多くなった。同時にメモリへのインタフェースが単純化され、最適化できるようになった。

しかし、RISCにも欠点があった。単純な命令を組み合わせてプログラムを書くため、複雑な命令を持つCISCに比べて同じ処理を実現する場合に必要な命令数が増えた。加えて初期のRISCは命令語長が32ビット幅であり、プログラムサイズが大きくなり、コード密度が低くなると指摘されたHisa Ando。当時、利点と欠点のどちらが性能にインパクトがあるかは議論の的となった。

3.2. RISC以前の設計思想
----------------

初期のプログラミング環境では、コンパイラは存在しなかった。プログラミングは機械語かアセンブリ言語で行われた。プログラミングをより簡単にするため、コンピュータの設計者はどんどん複雑な処理を行う命令を追加していった。それはつまり、現在ならば高度なプログラミング言語で関数レベルで実現されるべきものだった。当時の風潮としてコンパイラの設計よりもハードウェアの設計のほうが簡単であるという考えがあり、結果として複雑なことはハードウェアに担わせることとなった。

高度な命令の追加を必要とする別の要因としてメモリ空間に強い制約があったことが上げられる。メモリは非常に高価で、システムに用意できるメモリ空間が限られていたので、プログラム容量を縮小することが強く要請された。例えば、当時のシステムには数キロバイトしかメモリが搭載されていなかった。そのため、業界は高度で複雑な命令を必要としていたし、命令は可変長になっていて、ひとつの命令でいくつものことをこなし、また、ひとつの命令でデータの転送と演算を同時に行っていた。当時は命令デコードを単純化するよりも命令にいろいろな機能を組み込むことが優先された。

また、当時主流であった磁気コアメモリのアクセス速度は遅かった。そのため、情報の密度を高めアクセスする回数を減らすことで、アクセス速度の問題を軽減できる。

CPU内のレジスタ本数が少なかったのは以下のような理由からである。

レジスタの記憶セルは外部のメモリの記憶セルよりさらに高価だった。当時の集積回路のレベルでは、大きなレジスタセットはチップやボードのエリアの無駄遣いとしか思われなかった。
レジスタ数を増やすと、命令コード内でレジスタを指定するためのビットフィールドが増大し、結果として命令のサイズが大きくなって、貴重なメモリを浪費することになる。以上のような理由から、CPU設計者は可能な限り一つの命令に多くの機能を詰め込んだ。これにより、例えば、ひとつの命令でメモリからふたつの数値をロードして加算し結果を直接メモリに格納する、ふたつの数値をロードして演算結果はレジスタに格納する、ひとつの数値をメモリからロードしてもうひとつはレジスタにあるものを使い演算結果をメモリに格納する、などの命令が実装されている。

当時の目標は実装されている全ての演算命令で全てのアドレッシングモードを使えるようにすることであった。これを直交性と称した。これはCPUを複雑にしたが、処理を個別に最適化することができるようになったとも言える。つまり、単純な命令のみを使えば高速に動作するようにである。この様な設計思想はRISCの概念が広まった後に、対比してCISCと呼ばれるようになった。

CISC的な設計の極致としてふたつの実例がある。ひとつは6502で、もうひとつはVAXである。25USドルの6502はひとつしかレジスタを持たないが、メモリインタフェースが最適化されているため、高速で動作できる。VAXはミニコンピュータであり、ひとつのCPUにつき3個の筐体を必要とする。特筆すべきはそのアドレッシングモードの豊富さで、全ての演算命令に全てのアドレッシングモードを組み合わせることができた。

3.3. CPUの性能向上のための他の方法
---------------------

一方で、CPUの性能を向上する技術が導入されていった。

1980年代初頭、既存の設計技法は限界に来ていると考えられていた。将来の性能向上は半導体プロセスの進歩に依存するしかないが、それが限界に達するということはつまりチップ上の機能を削減するということである。チップの複雑性はそのままであるが、チップの面積を縮小することで動作周波数を上げることができる。通信リンクを組み込んだ並列コンピューティングの研究に少なからぬ投資が行われた。高速なチップを作る代わりにたくさんのチップを並べ、処理すべき問題を分割して各チップに割り当てるのである。

しかし、当初の恐れは杞憂であった。1980年代後半にはCPUの性能を向上させるいくつかの技術が導入された。ひとつは、1960年代よりメインフレーム用など高価なCISCのCPUで採用されていた技術であるが、命令の処理を複数のステップに分割する命令パイプラインや、その効果を高める分岐予測などである。これにより、複数の命令のそれぞれ別の処理ステージを同時に実行することで命令の並列実行を実現するのである。一般的なプロセッサは、命令を読み込み、デコードし、必要ならばデータをメモリから取ってきて、実際の処理を実行し、結果を指定された場所に格納する。パイプラインという手法が生まれたのは、命令を読み込んだら、その命令の処理の完了を待たずに次の命令を読み込むことができるという洞察からであった。そうすると、後続の命令を読み込んでいる一方で先行の命令をデコードすることが可能となり、そして、次のサイクルでは実行、デコード、命令読み込みの三つとなり、実質的に複数の命令が並行して処理されていることになる。個々の命令を見ると、処理の完了までに数サイクルかかっていて決して高速ではないが、次の命令との関係を見れば順次命令が実行され、1サイクル毎に命令の実行が終了していくことになる。これにより高速なシステムができ、プロセッサ内の資源が効率的に利用される。

もうひとつの解決法は処理ユニットをプロセッサ内に複数装備し、複数の演算を同時に行うスーパースケーラプロセッサの概念である。連続して読み込んだ複数の命令を、複数の処理ユニットに同時に投入して並列処理を行う。ただし、ある命令を実行するためには前の命令の実行結果を用いる場合がしばしばあり、常にこの方法で性能を向上できるとは限らない。

パイプラインを導入したりスーパースケーラ化する手法は、単純なRISCアーキテクチャの設計に、調停機能や複数のデータパス、パイプラインレジスタを追加して性能を向上させようというものである。CISCでは複雑な命令を実装して、これにより一挙に複数の処理を行うことで性能を高めようとするのと対照的である。チップの面積は有限なので、性能向上のための仕組みを追加するためには何かを削らなくてはならないが、基本的なRISCアーキテクチャのCPUは非常に単純で面積が小さく、追加機能を実装する面積を確保するうえで非常に好都合だった。初期のRISCの性能は低かったが、これらの設計手法を取り入れることによって1980年代後半にはCISCを大きく引き離す性能を達成した。半導体プロセスの進歩によってこれらの手法をCISCに導入できるようになるには1990年代初頭のPentium、Pentium Proまで待たねばならなかった。

RISCチップはそのコアを実現するのに必要なトランジスタ数が少なくて済むため、以下のような様々な機能や要求をチップに取り入れることができた。

レジスタセットの容量増加
内部並列性を向上させるための調停機構
巨大なキャッシュの追加
マイクロコントローラ向けのI/Oやタイマの追加
ベクタープロセッサ  の追加
何も付加しないで、低電力化や小型化を指向するRISCデザインで一般的な特徴は以下の通りである。

固定命令語長と統一されたビットフィールド設計ビットフィードの構造を可能な限り統一し、オペコード・オペランドが常に同じビットに配置される様にして、命令デコードが高速に行える様にする
レジスタが基本的に全て同等で汎用であるコンパイラがレジスタに変数の割り当てを行うさいに制約がなく、コンパイラの実装が容易になる。ただし、整数用と浮動小数点数用レジスタは基本的に区別される
単純なアドレッシングモードオペランドとして指定したレジスタをポインタとしてメモリアクセスに使用したり、レジスタ値にオフセットを加えて実効アドレスを得るモードを持つ。それより複雑なアドレッシングは、演算命令を組み合わせて実効アドレスを算出した結果をレジスタに入れて使用する。
ハードウェアがサポートするデータ型が少ない例えば、CISCには文字列やビットストリングを扱う命令を備えたり、多項式とか複素数を扱うものもあった。そのような命令はRISCには見受けられない。なお、最新のアーキテクチャではSIMD命令向けに、複数の値をパックしたデータ形式もサポートする。RISCはハーバード・アーキテクチャを実現したものとも言われる。概念的に命令コードのフローとデータのフローが分離されているからである。これによって、命令キャッシュとデータキャッシュへ同時にアクセスすることができ、性能向上に寄与する。

初期のRISCの設計には分岐遅延スロットの仕組みも備えられていた。これは分岐命令や条件分岐の直後の命令を指し、条件分岐で条件の成立の分岐するしないに関わらず、必ず実行される。これは、分岐命令の処理中もALUに仕事をさせて、分岐にかかるオーバーヘッドを隠蔽するための手法である。現在は、CPUの速度とメモリアクセスの差が広がり、またスーパースカラ構成をとる場合には遅延スロットに適切な個数が変わるなど、実装の影響を受けるために良くない仕組みと考えられていて、最近のRISCでは実装が避けられている。

3.4. 初期のRISC
------------

最初のRISCは開発時点ではRISCであるとは認識されていなかった。それは1964年にSeymour CrayとJim Thorntonが設計したCDC 6600スーパーコンピュータである。ThortonとCrayは数値計算のためにわずか74種類の命令をもつCPUと周辺プロセッサと呼ばれる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  Mini Processor//の略であり、名前が小型の市場を意識していることを示している。これを使って1986年にIBM RT-PCをリリースしたが、性能的には問題があった。とはいうものの、801はいくつかのプロジェクトを生み出し、後にここからPOWERが生まれることになった。

初期のRISCは、単純で小型ながら高い性能を発揮する効果は知られていたものの研究室レベルで留まっていた。バークレーの成果はよく知られるようになったため、RISCという言葉が一般化することになった。多くのコンピュータ業界関係者は、実際の商用アプリケーションを高速に実行できなければ意味がないと批評し、それを使おうとしなかった。しかし1986年、各研究プロジェクトの成果が製品となっていった。実際、ほとんどのRISCプロセッサはRISC-IIの設計をコピーするところからはじまっている。

3.5. 現在のRISC
------------

2009年現在では、「RISC対CISC」という単純な優劣論争は、技術的にはもはや意味を持たない。x86などの代表的なCISCプロセッサは内部的にRISCのアーキテクチャを段階的に取り入れHisa Ando、逆に代表的なRISCプロセッサは命令数の追加を続けているためであるHisa Ando。

RISCの当初の設計思想は「少ない簡潔な命令数による、回路設計の単純化とパイプライン効果の最大化によって、性能向上と低コスト化、更には容易な動作周波数の向上を実現する」ものであった。しかし現在の主要なRISCプロセッサは、商用計算用の10進数演算や、暗号化、仮想化、アウト・オブ・オーダー実行などの複雑な命令を追加し続けている。この背景には、当初より幅広い用途や新しい機能が求められていること、性能を確保したまま多数の命令を実装できる半導体技術と回路設計技術の向上、単純な動作周波数の向上には消費電力や発熱などの副作用や限界があった。以降はマルチコア化へ性能向上の舵を切ることになる。このため現在では高性能なプロセッサの開発は、開発費用も製造費用も膨大になり、大規模なチップメーカー以外はハイエンドのプロセッサの開発・製造が困難となっている。

とはいえ、命令数と回路規模以外は依然としてRISCの設計思想が強く残る。命令は32ビットチップこそ固定小数32ビット、浮動小数64ビット、SIMDが128ビットとなるが各ユニットで常に固定長、アドレッシングモードもレジスタ - レジスタとロード・ストアの二種しかないことに変わりなく、レジスタはIA-64は別として、x64と比較しても倍の32本以上を持つ。こうしたこともあって、プロセッサの分類として、x86やSystem zなどを「CISC」、MIPS・POWER・SPARCなどを「RISC」と呼ぶ事は、なお一般的である。

市場別には、組み込み市場では命令セットの後方互換性は重視されず、低消費電力なプロセッサが強く求められることからRISCが優勢である。特に携帯電話・ネットワーク機器・ストレージのコントローラなど32ビット・64ビットの高性能品はほぼRISCが独占している。過去の命令セットとの後方互換性が重視されるパーソナルコンピュータは長らくCISC(x86）