RISC(リスク)とは、Reduced Instruction Set Computer(縮小命令セットコンピュータ)の略で、マイクロプロセッサのアーキテクチャすなわち設計手法の一つである。制御命令の数を減らし、加減算などの単純な処理の組み合わせによって回路を単純化し演算速度の向上を図ろうとする手法である。
このアーキテクチャの着想は、CPUに備わっていた様々な制御命令の大部分が、実際にはプログラムを書く際に無視されて使われていないことが発見されたことであった。 CISCアーキテクチャでは(命令の種類×アドレッシングモードの種類)個の命令が存在するが、実際に使用される命令はそのうち限られたごくわずかな命令であることが判り、それに基づいて命令セットを簡単な命令に絞って実装化することで全体としての高速化を図るアーキテクチャである。
特徴としては
もうひとつの発見は、あまり使われていない複雑な処理を行う命令と同等のことをする単純な命令の組み合わせを比較したとき、前者が遅いということである。 このパラドックスは、CPU設計にかける期間の問題であった。設計者は十分な時間を与えられないため全ての命令の処理を最適化することができず、結果としてよく使われる命令だけを最適化したのである。 有名な例としてVAXのINDEX命令がある。 この命令はループを使った同等機能のプログラムコードよりも遅かった。
そのころ、CPUはメモリよりも速度向上が著しくなってきていた。1970年後半でさえ、その速度向上の傾向が今後10年にわたって拡大し続けていくことが明らかだった。すなわち、10年間の間にCPUの速度はメモリの10倍、100倍となってゆくのである。 こうしてより高速化していくCPUの演算速度が効果を発揮するには、レジスタ(後にはキャッシュ)を増やさなければならいことは明らかだった。 レジスタやキャッシュメモリのために、チップやボード内の領域を空ける必要がある。CPUの複雑性を低減した結果、空いた領域をそのために使うことができた。
さらに別のRISCデザインは実際に使われているプログラムの性能計測からも浮上してきた。 アンドリュー・タンネンバウムは様々なプログラムを集めて計測結果をまとめ、多くのプロセッサは機能を詰め込みすぎであることを立証した。 例えば、彼はプログラム内の定数値のうち98%が13ビットに収まることを示した。 しかし、ほとんどのCPUは定数値を格納するエリアのサイズとして8ビットの倍数にあたるサイズを用意していた。 つまり、典型的には8ビット、16ビット、32ビットである。 これが意味するのは、定数を命令の中の使われていないビット列に格納することによってメモリアクセスを減らすことができるということである。 数値をメモリやレジスタから取ってくるのではなく、CPUが必要な数値がすでにそこにあることで速度を向上させることができる。 しかし、これを実現するためには命令本体を小さくする必要がある。そうでないと命令の中にそれなりのサイズの数値を埋め込むことができないからである。
これがアドレッシングモードの削減と命令の削減であり、縮小命令セット (Reduced Instruction Set)という用語が生まれた。 RISCデザインのプロセッサは巨大な命令セットを持つこともあるので、これは正確な用語ではない。 本当の違いは、全ての演算をレジスタ間で行い、メモリへの読み書きもレジスタとメモリの間でのみ行う点である。 このためRISCはload-storeとも呼ばれる。 後に従来の設計手法はComplex Instruction Set Computer(CISC)として知られるようになった。 ただし、これはあくまでもRISCと対比させて使う用語である。
RISCの設計思想は命令セットを縮小することであった。 この副作用として命令内にデータを直接含ませる余地が大きくなり(命令そのものを識別するためのオペコードが少ないビットで済むため)、レジスタやメモリを使わずに済む場面が多くなった。 同時にメモリへのインタフェースが単純化され(メモリにアクセスするタイミングが単純化され)、最適化できるようになった。
しかし、RISCにも欠点があった。単純な命令でプログラムを書くため、同じタスクを実現する場合でも命令数が増え、結果としてプログラムが大きくなる。 当時、利点と欠点のどちらが性能にインパクトがあるかは議論の的となった。
高度な命令の追加を必要とする別の要因としてメモリ空間が小さかったことが上げられる。 メモリが小さいので、プログラムを縮小することは大きな利点となった。 メモリは非常に高価だった。例えば、当時のシステムには数キロバイトしかメモリが搭載されていなかった。 そのため、業界は高度で複雑な命令を必要としていたし、命令は様々なサイズになっていて、ひとつの命令でいくつものことをこなし、ひとつの命令でデータの転送と計算を同時に行っていた。 当時は命令のデコードの単純化よりも命令にいろいろな機能を組み込むことが優先された。
メモリは小さいだけでなく、磁気コアメモリが主流だったため、遅かった。 そのため、情報の密度を高める必要があった。 情報の密度が高ければ、この遅いメモリにアクセスする回数を減らすことができる。
CPU内のレジスタ本数が少なかったのは以下のような理由からである。
以上のような理由から、CPU設計者は可能な限り命令に機能を詰め込んだ。 これにより、ひとつの命令で次のようなことを全て行うようになった。 例えば、ふたつの数値をロードして加算し結果を直接メモリに格納する。 あるいは、ふたつの数値をロードして、加算結果はレジスタに格納する。 あるいは、ひとつの数値をメモリからロードしてもうひとつはレジスタにあるものを使い、加算結果をメモリに格納する。 などなどである。 この設計思想がCISCと呼ばれるようになった。
当時の目標は考えられる全てのアドレッシングモードを全ての命令で使えるようにすることであった。これを直交性と称した。 これはCPUを複雑にしたが、処理を個別に最適化することができるようになったとも言える。つまり、単純な命令のみを使えば高速に動作するようにである。
CISC的な設計の極致としてふたつの実例がある。ひとつは6502で、もうひとつはVAXである。 25USドルの6502はひとつしかレジスタを持たない。メモリインタフェースが最適化されているため、高速で動作できる(4MHzのザイログのZ80も同様)。 VAXはミニコンピュータであり、ひとつのCPUにつき3個の筐体(ラック)を必要とする。特筆すべきはそのアドレッシングモードの豊富さで、全ての命令で全てのアドレッシングモードが使用できた。
1980年代初頭、既存の設計は限界に来ていると考えられていた。 将来の性能向上は半導体プロセスの進歩にたよるしかないが、それが限界に達するということはつまりチップ上の機能を削減するということである。 チップの複雑性はそのままであるが、チップの面積を縮小することで動作周波数を上げることができる。 通信リンクを組み込んだ並列コンピューティングの研究に少なからぬ投資が行われた。 高速なチップを作る代わりにたくさんのチップを並べ、処理すべき問題を分割して各チップに割り当てるのである。 しかし、当初の恐れは杞憂であった。 1980年代後半には劇的に性能を向上させるいくつかのアイデアが出てきた。
ひとつのアイデアは命令の処理を複数のステップに分割して命令パイプラインをCPUに導入することであった。 これにより、いくつかの命令についてそれぞれ別の処理ステージを実行することで命令の並列実行を実現するのである。 一般的なプロセッサは、命令を読み込み、デコード(解釈)し、必要ならばデータをメモリから取ってきて、実際の処理を実行し、結果を指定された場所に格納する。 パイプラインという手法が生まれたのは、命令を読み込んだら、その後の処理の完了を待たずに次の命令を読み込むことができるという洞察からであった。 そうすると、実質的にふたつの命令が並行して処理されていることになる(一方は読み込んでいるところで、もう一方はデコード中)。 そして、次のサイクルがくれば三つである。 個々の命令を見ると、処理の完了までに数サイクルかかっていて決して高速ではないが、次の命令との関係を見れば次々と命令が完了していることになる。 これにより高速なシステムができ、プロセッサ内の資源が効率的に利用される。
もうひとつの解決法は処理ユニットをプロセッサ内に複数装備して、並行して動作させるというものである。 ふたつの数値を加算するというひとつの命令を実行する代わりに、スーパースケーラプロセッサはパイプラン上の次の命令を別の処理ユニットで実行させようと試みる。 これは簡単なことではない。多くの命令は他の命令の実行結果に依存しているからである。
これらの手法はCPUの基本的なレイアウトを複雑化して性能を向上させようというものである。 この点が命令を複雑化させようとしたCISCの手法と対照的である。 チップの面積は有限なので、これらの機能を入れようとすると何かを削らなくてはならない。 RISCはこれらの手法を実現するに当たっておあつらえ向きだった。RISCのCPUの回路はCISCに比べて非常に単純だったからである。 初期のRISCの性能は低かったが、これらの新しい設計手法を取り入れることによって1980年代後半にはCISCを大きく引き離す性能となった。 半導体プロセスの進歩によってこれらの手法をCISCに導入できるようになるには90年代初頭まで待たねばならなかった。
RISCチップはそのコアを実現するのに必要なトランジスタ数が少なくて済んだため、以下のような様々な機能をマイクロプロセッサに取り入れることができた。
RISCデザインで一般的な特徴は以下の通りである。
RISCはハーバード・アーキテクチャを実現したものとも言われる。概念的に命令の流れとデータの流れが分離されているからである。 つまりこれは特別な動機命令を実行するまで、コードが存在する位置のメモリを書き換えても命令実行に影響しないということである(なぜならCPUは分離された命令キャッシュとデータキャッシュを持っているため)。 これによって、命令キャッシュとデータキャッシュは同時にアクセスすることができ、性能向上に寄与する。
初期のRISCの設計にはそれほどすばらしいとは言えない分岐ディレイスロットというものがあった。 分岐ディレイスロットはジャンプ命令や分岐命令の直後の命令のある場所のことである。 この場所にある命令は分岐するしないに関わらず実行される(逆に言えば分岐の効力が発揮されるのが遅れる)。 これは、分岐実行時もALUに仕事をさせるための手法である。 現在ではこれはRISCを実用化するにあたっての良くない副作用と考えられていて、最近のRISCでは存在しなくなっている。
もうひとつの初期のロード/ストアマシンとしては1968年に設計されたデータ・ゼネラルのNovaがある。
最も一般に知られているRISCはDARPAのVLSI計画の一環で行われた大学での研究である。VLSI計画は今日ではあまり知られていないが、チップの設計、製造、コンピュータグラフィックスなど様々な特筆すべき成果を生み出している。
カリフォルニア大学バークレー校のRISCプロジェクトはDavid Pattersonの指揮の下1980年に開始された。 基本的な考え方はパイプラインと今日レジスタ・ウィンドウとして知られている大胆なレジスタの使用であった。 一般的なCPUはレジスタ本数は少数に限られていて、プログラムはそれを自由に使う。レジスタ・ウィンドウを持つCPUでは、128本ものレジスタを持つが、プログラムは一度に8本までしか使えない。 プログラムはプロシージャ(ルーチン、関数)ごとに8本のレジスタを割り当てる。 そのためプロシージャコールや復帰が極めて高速化される(通常のCPUでは、サブルーチンコール時にレジスタをメモリ(スタック)に退避させ、復帰するときにメモリからレジスタに戻す)。
このRISCプロジェクトは1982年にRISC-Iを完成させた。 わずか44,420個のトランジスタ(当時のCISCプロセッサでは10万個)からなるRISC-Iは32種類の命令しか持たなかったが、極めて高性能だった。 次いで1983年にRISC-Iの3倍の性能のRISC-IIが登場した。 RISC-IIは40,760個のトランジスタからなり、39種類の命令を持っていた。
同じころ、ジョン・L・ヘネシーは1981年、スタンフォード大学でMIPSプロジェクトを開始した。 MIPSではパイプラインを可能な限りフルに動作させることを目標としていた。 パイプラインはすでに他でも使われていたが、いくつかの工夫によりMIPSのパイプラインは非常に高速に動作した。 最も重要な点は全ての命令を1クロックサイクルで実行されるようにしたことである。 これによりパイプラインは最大限に効果を発揮しプロセッサの高速化を実現した。 しかし、そのために掛け算や割り算といった有用な命令が排除されてしまった。
チップ上にRISCのCPU作るという最初の試みはIBMは1975年に開始したもので、上述の大学の研究よりも早い。 プロジェクトが開始された建物の番号をとってIBM 801と名づけられたプロセッサファミリはIBMのマシンに広く使われた。 1981年に製造されたシングルチップのROMPはResearch (Office Products Division) Mini Processorの略であり、名前が小型の市場を意識していることを示している。 これを使って1986年にIBM RT-PCをリリースしたが、性能的には問題があった。 とはいうものの、801はいくつかのプロジェクトを生み出し、POWERが生まれることになった。
初期のRISCは、効果は知られていたものの研究室レベルで留まっていた。 バークレーの成果はよく知られるようになったため、RISCという言葉が一般化することになった。 多くのコンピュータ業界関係者は、実際の商用アプリケーションを高速に実行できなければ意味がないと批評し、それを使おうとしなかった。 しかし1986年、各研究プロジェクトの成果が製品となっっていった。 実際、ほとんどのRISCプロセッサはRISC-IIの設計をコピーするところからはじまっている。
しかし、RISCはデスクトップPCの市場には全く食い込めなかった。そこはインテルのx86プラットフォームが独占している(最近ではAMDが参入しているが、それもx86アーキテクチャである)。これには3つの理由がある。
人々はチップの速度とコスト、互換性に重きを置く。決して新しいチップの開発費用を気にしたりはしない。これにより興味深い一連の事象が発生する。より高性能なCPUの開発は、より困難な複雑さが生じる。このため、ハイエンドのCPUでは開発費用も製造費用(設備投資など)も膨大になる。RISCを採用することによるコスト削減効果は最近のCPU開発においては非常に小さい。そのため今日では最も大きなチップメーカー以外はハイエンドCPU開発/製造が不可能となっている。その結果、2000年代になってIBMのPOWER/PowerPCを除いて全てのRISCプラットフォームは高性能CPUの開発の規模を縮小するか(SPARCやMIPS)、やめてしまう(AlphaやPA-RISC)。2004年、x86アーキテクチャのマイクロプロセッサがSPECintの最高記録を保持しており、SPECfpの最高記録保持者はIBM Power 5プロセッサである。
RISC | RISC | Reduced Instruction Set Computing | Reduced instruction set computer | RISC | RISC | Reduced instruction set computer | RISC לעומת CISC | RISC | RISC | RISC | RISC | Reduced Instruction Set Computer | RISC | RISC | RISC | RISC | RISC | RISC | RISC | Reduced instruction set computer | 精简指令集