RISC (4)
CPUの性能向上のための他の方法 (1)
一方で、CPUの性能を向上する技術が導入されていった。
1980年代初頭、既存の設計技法は限界に来ていると考えられていた。将来の性能向上は半導体プロセスの進歩に依存するしかないが、それが限界に達するということはつまりチップ上の機能を削減するということである。チップの複雑性はそのままであるが、チップの面積を縮小することで動作周波数を上げることができる。通信リンクを組み込んだ並列コンピューティングの研究に少なからぬ投資が行われた。高速なチップを作る代わりにたくさんのチップを並べ、処理すべき問題を分割して各チップに割り当てるのである。しかし、当初の恐れは杞憂であった。1980年代後半にはCPUの性能を向上させるいくつかの技術が導入された。
ひとつは、1960年代よりメインフレーム用など高価なCISCのCPUで採用されていた技術であるが、命令の処理を複数のステップに分割する命令パイプラインや、その効果を高める分岐予測などである。これにより、複数の命令のそれぞれ別の処理ステージを同時に実行することで命令の並列実行を実現するのである。一般的なプロセッサは、命令を読み込み、デコード(解釈)し、必要ならばデータをメモリから取ってきて、実際の処理を実行し、結果を指定された場所に格納する。パイプラインという手法が生まれたのは、命令を読み込んだら、その命令の処理の完了を待たずに次の命令を読み込むことができるという洞察からであった。そうすると、実質的にふたつの命令が並行して処理されていることになる(後続の命令を読み込んでいる一方で先行の命令をデコードする)。そして、次のサイクルがくれば三つとなる。個々の命令を見ると、処理の完了までに数サイクルかかっていて決して高速ではない(レイテンシは短縮しない)が、次の命令との関係を見れば順次命令が実行され、1サイクル毎に命令の実行が終了していくことになる(スループットは高い)。これにより高速なシステムができ、プロセッサ内の資源が効率的に利用される。
もうひとつの解決法は処理ユニットをプロセッサ内に複数装備し、複数の演算を同時に行うスーパースケーラプロセッサの概念である。連続して読み込んだ複数の命令を、複数の処理ユニットに同時に投入して並列処理を行う。ただし、ある命令を実行するためには前の命令の実行結果を用いる(依存性がある)場合がしばしばあり、常にこの方法で性能を向上できるとは限らない。
パイプラインを導入したりスーパースケーラ化する手法は、単純なRISCアーキテクチャの設計に、調停機能や複数のデータパス、パイプラインレジスタを追加して性能を向上させようというものである。CISCでは複雑な命令を実装して、これにより一挙に複数の処理を行うことで性能を高めようとするのと対照的である。チップの面積は有限なので、性能向上のための仕組みを追加するためには何かを削らなくてはならないが、基本的なRISCアーキテクチャのCPUは非常に単純で面積が小さく、追加機能を実装する面積を確保するうえで非常に好都合だった。初期のRISCの性能は低かったが、これらの設計手法を取り入れることによって1980年代後半にはCISCを大きく引き離す性能を達成した。半導体プロセスの進歩によってこれらの手法をCISCに導入できるようになるには1990年代初頭のPentium、Pentium Proまで待たねばならなかった。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
一方で、CPUの性能を向上する技術が導入されていった。
1980年代初頭、既存の設計技法は限界に来ていると考えられていた。将来の性能向上は半導体プロセスの進歩に依存するしかないが、それが限界に達するということはつまりチップ上の機能を削減するということである。チップの複雑性はそのままであるが、チップの面積を縮小することで動作周波数を上げることができる。通信リンクを組み込んだ並列コンピューティングの研究に少なからぬ投資が行われた。高速なチップを作る代わりにたくさんのチップを並べ、処理すべき問題を分割して各チップに割り当てるのである。しかし、当初の恐れは杞憂であった。1980年代後半にはCPUの性能を向上させるいくつかの技術が導入された。
ひとつは、1960年代よりメインフレーム用など高価なCISCのCPUで採用されていた技術であるが、命令の処理を複数のステップに分割する命令パイプラインや、その効果を高める分岐予測などである。これにより、複数の命令のそれぞれ別の処理ステージを同時に実行することで命令の並列実行を実現するのである。一般的なプロセッサは、命令を読み込み、デコード(解釈)し、必要ならばデータをメモリから取ってきて、実際の処理を実行し、結果を指定された場所に格納する。パイプラインという手法が生まれたのは、命令を読み込んだら、その命令の処理の完了を待たずに次の命令を読み込むことができるという洞察からであった。そうすると、実質的にふたつの命令が並行して処理されていることになる(後続の命令を読み込んでいる一方で先行の命令をデコードする)。そして、次のサイクルがくれば三つとなる。個々の命令を見ると、処理の完了までに数サイクルかかっていて決して高速ではない(レイテンシは短縮しない)が、次の命令との関係を見れば順次命令が実行され、1サイクル毎に命令の実行が終了していくことになる(スループットは高い)。これにより高速なシステムができ、プロセッサ内の資源が効率的に利用される。
もうひとつの解決法は処理ユニットをプロセッサ内に複数装備し、複数の演算を同時に行うスーパースケーラプロセッサの概念である。連続して読み込んだ複数の命令を、複数の処理ユニットに同時に投入して並列処理を行う。ただし、ある命令を実行するためには前の命令の実行結果を用いる(依存性がある)場合がしばしばあり、常にこの方法で性能を向上できるとは限らない。
パイプラインを導入したりスーパースケーラ化する手法は、単純なRISCアーキテクチャの設計に、調停機能や複数のデータパス、パイプラインレジスタを追加して性能を向上させようというものである。CISCでは複雑な命令を実装して、これにより一挙に複数の処理を行うことで性能を高めようとするのと対照的である。チップの面積は有限なので、性能向上のための仕組みを追加するためには何かを削らなくてはならないが、基本的なRISCアーキテクチャのCPUは非常に単純で面積が小さく、追加機能を実装する面積を確保するうえで非常に好都合だった。初期のRISCの性能は低かったが、これらの設計手法を取り入れることによって1980年代後半にはCISCを大きく引き離す性能を達成した。半導体プロセスの進歩によってこれらの手法をCISCに導入できるようになるには1990年代初頭のPentium、Pentium Proまで待たねばならなかった。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
RISC (3)
RISC以前の設計思想
初期のプログラミング環境では、コンパイラは存在しなかった。プログラミングは機械語かアセンブリ言語で行われた。プログラミングをより簡単にするため、コンピュータの設計者はどんどん複雑な処理を行う命令を追加していった。それはつまり、現在ならば高度なプログラミング言語で関数(サブルーチン)レベルで実現されるべきものだった。当時の風潮としてコンパイラの設計よりもハードウェアの設計のほうが簡単であるという考えがあり、結果として複雑なことはハードウェアに担わせることとなった。
高度な命令の追加を必要とする別の要因としてメモリ空間が小さかったことが上げられる。メモリは非常に高価で、システムに用意できるメモリ空間が限られていたので、プログラム容量を縮小することは大きな利点となった。例えば、当時のシステムには数キロバイトしかメモリが搭載されていなかった。そのため、業界は高度で複雑な命令を必要としていたし、命令は可変長になっていて、ひとつの命令でいくつものことをこなし、ひとつの命令でデータの転送と演算を同時に行っていた。当時は命令デコードを単純化するよりも命令にいろいろな機能を組み込むことが優先された。
メモリは容量が小さいだけでなく、当時主流であった磁気コアメモリのアクセス速度は遅かった。そのため、情報の密度を高めアクセスする回数を減らすことで、アクセス速度の問題を軽減できる。
CPU内のレジスタ本数が少なかったのは以下のような理由からである。
・レジスタの記憶セルは外部のメモリの記憶セルよりさらに高価だった。当時の集積回路のレベルでは、大きなレジスタセットはチップやボードのエリアの無駄遣いとしか思われなかった。
・レジスタ数を増やすと、命令コード内でレジスタを指定するためのビットフィールドが増大し、結果として命令のサイズが大きくなって、貴重なメモリを浪費することになる。
以上のような理由から、CPU設計者は可能な限り一つの命令に多くの機能を詰め込んだ。これにより、例えば、ひとつの命令でメモリからふたつの数値をロードして加算し結果を直接メモリに格納する。あるいは、ふたつの数値をロードして、加算結果はレジスタに格納する。あるいは、ひとつの数値をメモリからロードしてもうひとつはレジスタにあるものを使い、加算結果をメモリに格納する、などの命令が実装されている。この様な設計思想はRISCの概念が広まった後に、対比してCISCと呼ばれるようになった。
当時の目標は実装されている全ての演算命令で全てのアドレッシングモードを使えるようにすることであった。これを直交性と称した。これはCPUを複雑にしたが、処理を個別に最適化することができるようになったとも言える。つまり、単純な命令のみを使えば高速に動作するようにである。
CISC的な設計の極致としてふたつの実例がある。ひとつは6502で、もうひとつはVAXである。25USドルの6502はひとつしかレジスタを持たないが、メモリインタフェースが最適化されているため、高速で動作できる(4MHzのザイログのZ80も同様)。VAXはミニコンピュータであり、ひとつのCPUにつき3個の筐体(ラック)を必要とする。特筆すべきはそのアドレッシングモードの豊富さで、全ての演算命令で全てのアドレッシングモードが使用できた。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
初期のプログラミング環境では、コンパイラは存在しなかった。プログラミングは機械語かアセンブリ言語で行われた。プログラミングをより簡単にするため、コンピュータの設計者はどんどん複雑な処理を行う命令を追加していった。それはつまり、現在ならば高度なプログラミング言語で関数(サブルーチン)レベルで実現されるべきものだった。当時の風潮としてコンパイラの設計よりもハードウェアの設計のほうが簡単であるという考えがあり、結果として複雑なことはハードウェアに担わせることとなった。
高度な命令の追加を必要とする別の要因としてメモリ空間が小さかったことが上げられる。メモリは非常に高価で、システムに用意できるメモリ空間が限られていたので、プログラム容量を縮小することは大きな利点となった。例えば、当時のシステムには数キロバイトしかメモリが搭載されていなかった。そのため、業界は高度で複雑な命令を必要としていたし、命令は可変長になっていて、ひとつの命令でいくつものことをこなし、ひとつの命令でデータの転送と演算を同時に行っていた。当時は命令デコードを単純化するよりも命令にいろいろな機能を組み込むことが優先された。
メモリは容量が小さいだけでなく、当時主流であった磁気コアメモリのアクセス速度は遅かった。そのため、情報の密度を高めアクセスする回数を減らすことで、アクセス速度の問題を軽減できる。
CPU内のレジスタ本数が少なかったのは以下のような理由からである。
・レジスタの記憶セルは外部のメモリの記憶セルよりさらに高価だった。当時の集積回路のレベルでは、大きなレジスタセットはチップやボードのエリアの無駄遣いとしか思われなかった。
・レジスタ数を増やすと、命令コード内でレジスタを指定するためのビットフィールドが増大し、結果として命令のサイズが大きくなって、貴重なメモリを浪費することになる。
以上のような理由から、CPU設計者は可能な限り一つの命令に多くの機能を詰め込んだ。これにより、例えば、ひとつの命令でメモリからふたつの数値をロードして加算し結果を直接メモリに格納する。あるいは、ふたつの数値をロードして、加算結果はレジスタに格納する。あるいは、ひとつの数値をメモリからロードしてもうひとつはレジスタにあるものを使い、加算結果をメモリに格納する、などの命令が実装されている。この様な設計思想はRISCの概念が広まった後に、対比してCISCと呼ばれるようになった。
当時の目標は実装されている全ての演算命令で全てのアドレッシングモードを使えるようにすることであった。これを直交性と称した。これはCPUを複雑にしたが、処理を個別に最適化することができるようになったとも言える。つまり、単純な命令のみを使えば高速に動作するようにである。
CISC的な設計の極致としてふたつの実例がある。ひとつは6502で、もうひとつはVAXである。25USドルの6502はひとつしかレジスタを持たないが、メモリインタフェースが最適化されているため、高速で動作できる(4MHzのザイログのZ80も同様)。VAXはミニコンピュータであり、ひとつのCPUにつき3個の筐体(ラック)を必要とする。特筆すべきはそのアドレッシングモードの豊富さで、全ての演算命令で全てのアドレッシングモードが使用できた。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
RISC (2)
RISC設計思想
1970年代後半、IBMなどの研究で、実際に使用されているプログラムを解析したところ、いわゆる直交性のある命令とアドレッシングモードの組み合わせの大部分は実際のプログラムでは使われていないことが判明した。これは、プログラミング技法が、従来のアセンブリ言語を直接使った記述から、高級言語で記述してコンパイラを使ってバイナリを得る形態に移り変わったことの副産物である。CISCの命令セットには、初期にはアセンブリ言語でプログラムを記述するうえで便利な命令が含まれ、後にはコンパイラのコード生成を前提に、高級言語の制御構文を機械語のレベルでそのまま実装できる、複雑な命令も含む様になったが、当時のコンパイラはCISCのCPUが持つ利点をあまり生かせていなかった。というのもコンパイラの開発は非常に高度な技術を要し、困難を伴うことだったからである。市場にはそれでもコンパイラが浸透していき、直交性の利点は薄められていった。
もうひとつの発見は、複雑な処理を行う命令の所要時間と、同等のことをする単純な命令の組み合わせの所要時間を比較したとき、しばしば前者が遅いということである。このパラドックスは、CPUの設計に許容される期間の制限から生じた。設計者は十分な時間を与えられず、全ての命令の処理を最適化することができずに、結果としてよく使われる命令の処理時間だけを最適化したのである。有名な例としてVAXのINDEX命令がある。この命令はループを使った同等機能のプログラムコードよりも遅かった。
一方で、メモリの速度よりもCPUの速度の向上が著しくなってきていた。1970年後半の時点でも、以後、CPUの演算速度の向上に対してメモリアクセスの速度の向上は限定的であり、速度差が拡大することが明らかだった。すなわち、今後10年の間にCPUの演算速度は相対的にメモリアクセスの10倍、100倍となってゆくのである。こうしてより高速化していくCPUの演算速度を維持するためにはアクセスまでの時間が短いレジスタ(後にはキャッシュ)を増やさなければならいことは明らかだった。これら多数のレジスタやキャッシュメモリを実装するための面積をシリコン上に確保する必要が生じた。これに対し、CPUのアーキテクチャを単純にしてその面積を削減することで、レジスタやキャッシュの為の面積を確保できた。
さらにRISCアーキテクチャの別の優位性が、実際に使われているプログラムの解析結果からも明らかになった。アンドリュー・タネンバウムは様々なプログラムを集めて計測結果をまとめ、多くのプロセッサの備える仕様は、実際のプログラムで要求されるものより過剰であることを立証した。例えば、プログラム内の定数値のうち98%が13ビットに収まることを示したが、一方で既存のCPUのほとんどは定数値を格納するエリアのサイズとして8ビットの倍数にあたるサイズを用意していた。典型的には8ビット、16ビット、32ビットである。 これが意味するのは、命令のビット・フィールド構成を適切に設計することで、命令に使用する定数を命令のオペランド・フィールドに格納し、メモリアクセスを減らすことができるということである。定数をメモリやレジスタから取ってくるのではなく、命令に必要な定数を当該命令の中に格納することで速度を向上させることができる。 しかし、これを実現するためには命令を表現するビット・フィールド幅を小さくする必要がある。さもなければ命令の中にそれなりのサイズの定数を埋め込むことができないからである。
これらの要素を背景に、アドレッシングモードと命令数を削減する、縮小命令セット (Reduced Instruction Set) という用語が生まれた。 但し、RISCアーキテクチャと言われるCPUであっても、機種によっては巨大な命令セットを持つこともあるので、これは正確な用語ではない。従来のアーキテクチャとRISCの本質的な違いは、全ての演算をレジスタ間で行い、メモリへの読み書きをレジスタとメモリの間の転送に限る点である。このためRISCはロード/ストア・アーキテクチャとも呼ばれる。RISCアーキテクチャの概念と対比して、従来の設計手法はComplex Instruction Set Computer (CISC) として知られるようになった。ただし、これはあくまでもRISCと対立する概念として捉えるときに使う用語である。
RISCの設計思想は命令セットを縮小することにある。この副作用として、命令を識別するのに必要なビットフィールド幅が小さくできるため、命令内にオペランドデータを直接含ませる余地が生じ、レジスタやメモリを使わずに済む場面が多くなった。同時にメモリへのインタフェースが単純化され(メモリにアクセスするタイミングが単純化され)、最適化できるようになった。
しかし、RISCにも欠点があった。単純な命令を組み合わせてプログラムを書くため、複雑な命令を持つCISCに比べて同じタスクを実現する場合に必要な命令数が増えた。加えて初期のRISCは命令語長が32ビット幅であり、プログラム容量が大きくなり、コード密度が低くなると指摘された。当時、利点と欠点のどちらが性能にインパクトがあるかは議論の的となった。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
1970年代後半、IBMなどの研究で、実際に使用されているプログラムを解析したところ、いわゆる直交性のある命令とアドレッシングモードの組み合わせの大部分は実際のプログラムでは使われていないことが判明した。これは、プログラミング技法が、従来のアセンブリ言語を直接使った記述から、高級言語で記述してコンパイラを使ってバイナリを得る形態に移り変わったことの副産物である。CISCの命令セットには、初期にはアセンブリ言語でプログラムを記述するうえで便利な命令が含まれ、後にはコンパイラのコード生成を前提に、高級言語の制御構文を機械語のレベルでそのまま実装できる、複雑な命令も含む様になったが、当時のコンパイラはCISCのCPUが持つ利点をあまり生かせていなかった。というのもコンパイラの開発は非常に高度な技術を要し、困難を伴うことだったからである。市場にはそれでもコンパイラが浸透していき、直交性の利点は薄められていった。
もうひとつの発見は、複雑な処理を行う命令の所要時間と、同等のことをする単純な命令の組み合わせの所要時間を比較したとき、しばしば前者が遅いということである。このパラドックスは、CPUの設計に許容される期間の制限から生じた。設計者は十分な時間を与えられず、全ての命令の処理を最適化することができずに、結果としてよく使われる命令の処理時間だけを最適化したのである。有名な例としてVAXのINDEX命令がある。この命令はループを使った同等機能のプログラムコードよりも遅かった。
一方で、メモリの速度よりもCPUの速度の向上が著しくなってきていた。1970年後半の時点でも、以後、CPUの演算速度の向上に対してメモリアクセスの速度の向上は限定的であり、速度差が拡大することが明らかだった。すなわち、今後10年の間にCPUの演算速度は相対的にメモリアクセスの10倍、100倍となってゆくのである。こうしてより高速化していくCPUの演算速度を維持するためにはアクセスまでの時間が短いレジスタ(後にはキャッシュ)を増やさなければならいことは明らかだった。これら多数のレジスタやキャッシュメモリを実装するための面積をシリコン上に確保する必要が生じた。これに対し、CPUのアーキテクチャを単純にしてその面積を削減することで、レジスタやキャッシュの為の面積を確保できた。
さらにRISCアーキテクチャの別の優位性が、実際に使われているプログラムの解析結果からも明らかになった。アンドリュー・タネンバウムは様々なプログラムを集めて計測結果をまとめ、多くのプロセッサの備える仕様は、実際のプログラムで要求されるものより過剰であることを立証した。例えば、プログラム内の定数値のうち98%が13ビットに収まることを示したが、一方で既存のCPUのほとんどは定数値を格納するエリアのサイズとして8ビットの倍数にあたるサイズを用意していた。典型的には8ビット、16ビット、32ビットである。 これが意味するのは、命令のビット・フィールド構成を適切に設計することで、命令に使用する定数を命令のオペランド・フィールドに格納し、メモリアクセスを減らすことができるということである。定数をメモリやレジスタから取ってくるのではなく、命令に必要な定数を当該命令の中に格納することで速度を向上させることができる。 しかし、これを実現するためには命令を表現するビット・フィールド幅を小さくする必要がある。さもなければ命令の中にそれなりのサイズの定数を埋め込むことができないからである。
これらの要素を背景に、アドレッシングモードと命令数を削減する、縮小命令セット (Reduced Instruction Set) という用語が生まれた。 但し、RISCアーキテクチャと言われるCPUであっても、機種によっては巨大な命令セットを持つこともあるので、これは正確な用語ではない。従来のアーキテクチャとRISCの本質的な違いは、全ての演算をレジスタ間で行い、メモリへの読み書きをレジスタとメモリの間の転送に限る点である。このためRISCはロード/ストア・アーキテクチャとも呼ばれる。RISCアーキテクチャの概念と対比して、従来の設計手法はComplex Instruction Set Computer (CISC) として知られるようになった。ただし、これはあくまでもRISCと対立する概念として捉えるときに使う用語である。
RISCの設計思想は命令セットを縮小することにある。この副作用として、命令を識別するのに必要なビットフィールド幅が小さくできるため、命令内にオペランドデータを直接含ませる余地が生じ、レジスタやメモリを使わずに済む場面が多くなった。同時にメモリへのインタフェースが単純化され(メモリにアクセスするタイミングが単純化され)、最適化できるようになった。
しかし、RISCにも欠点があった。単純な命令を組み合わせてプログラムを書くため、複雑な命令を持つCISCに比べて同じタスクを実現する場合に必要な命令数が増えた。加えて初期のRISCは命令語長が32ビット幅であり、プログラム容量が大きくなり、コード密度が低くなると指摘された。当時、利点と欠点のどちらが性能にインパクトがあるかは議論の的となった。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
RISC
RISC(リスク)とは、Reduced Instruction Set Computer(縮小命令セットコンピュータ)の略で、マイクロプロセッサのアーキテクチャすなわち設計手法の一つである。命令の種類を減らし、回路を単純化して演算速度の向上を図ろうとする手法である。
このアーキテクチャの着想は、従来のCPUに備わっていた様々な命令の大部分が、実際のプログラムを書く際にはほとんど使われていないことが見出されたことにある。CISCアーキテクチャでは、複数の処理を一挙にこなす複雑な命令をもち、また、個々の演算命令につき、任意のアドレッシングモードを組み合わせることが可能(直交性がある)で、総数として(演算命令の種類×アドレッシングモード)個の命令が存在する。だが実際に作成されたプログラムを解析すると、使用される命令はそのうちのごくわずかなものに限られることが判り、それに基づいて命令セットを簡単な命令に絞って実装することで全体としての高速化を図るアーキテクチャである。
特徴
RISCアーキテクチャの特徴としては
・固定命令語長
命令の解読に際して可変長命令では命令の切り出し等に時間がかかっていた欠点を排除し、命令デコードに要する時間を短縮すると共に、命令の先読みをしてパイプラインの効率を上げる。
・全ての演算は1クロックで実行する。
パイプライン動作にウエイトを生じさせない。初期のアーキテクチャでは乗除算命令を排除し、複数の命令を組み合わせて乗除算を実現した。
・演算はレジスタ‐レジスタ間演算のみ
回路の単純化を図るとともに、メモリ・アクセスのレイテンシがパイプライン動作に悪影響を与えるのを避ける。
・ワイヤードロジックで構成する
マイクロコードによる命令実行を排して命令に所要のクロックサイクル数を削減するとともに、命令解析・実行を行う回路をゲートの組み合わせで実装し、高クロック動作を可能にする。
・多数のレジスタを備える
メモリへのアクセスを減らし、メモリ・アクセスによるレイテンシで動作が遅延するのを避ける 。
・遅延実行スロット
パイプラインハザードを避ける 。
などが挙げられるが、例外も多い。
CISCではハードウエアでサポートされているスタック操作命令がRISCにはなく、スタック操作[1]などの処理は単純な命令を組み合わせてソフトウエアで明示的に実現することになる。命令の組み合わせによって発生するパイプラインハザードはコンパイラでコード生成時に検出し、命令の順序を最適化することで回避する。排他制御などで不可欠なアトミック命令はRISCでもサポートされる。
命令語長を固定長にすることでパイプライン処理の処理効率を向上させることができるが、プログラムをコンパイルする際にパイプライン動作を前提とした最適化を行う必要があり、コンパイラは複雑になりがちである。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
このアーキテクチャの着想は、従来のCPUに備わっていた様々な命令の大部分が、実際のプログラムを書く際にはほとんど使われていないことが見出されたことにある。CISCアーキテクチャでは、複数の処理を一挙にこなす複雑な命令をもち、また、個々の演算命令につき、任意のアドレッシングモードを組み合わせることが可能(直交性がある)で、総数として(演算命令の種類×アドレッシングモード)個の命令が存在する。だが実際に作成されたプログラムを解析すると、使用される命令はそのうちのごくわずかなものに限られることが判り、それに基づいて命令セットを簡単な命令に絞って実装することで全体としての高速化を図るアーキテクチャである。
特徴
RISCアーキテクチャの特徴としては
・固定命令語長
命令の解読に際して可変長命令では命令の切り出し等に時間がかかっていた欠点を排除し、命令デコードに要する時間を短縮すると共に、命令の先読みをしてパイプラインの効率を上げる。
・全ての演算は1クロックで実行する。
パイプライン動作にウエイトを生じさせない。初期のアーキテクチャでは乗除算命令を排除し、複数の命令を組み合わせて乗除算を実現した。
・演算はレジスタ‐レジスタ間演算のみ
回路の単純化を図るとともに、メモリ・アクセスのレイテンシがパイプライン動作に悪影響を与えるのを避ける。
・ワイヤードロジックで構成する
マイクロコードによる命令実行を排して命令に所要のクロックサイクル数を削減するとともに、命令解析・実行を行う回路をゲートの組み合わせで実装し、高クロック動作を可能にする。
・多数のレジスタを備える
メモリへのアクセスを減らし、メモリ・アクセスによるレイテンシで動作が遅延するのを避ける 。
・遅延実行スロット
パイプラインハザードを避ける 。
などが挙げられるが、例外も多い。
CISCではハードウエアでサポートされているスタック操作命令がRISCにはなく、スタック操作[1]などの処理は単純な命令を組み合わせてソフトウエアで明示的に実現することになる。命令の組み合わせによって発生するパイプラインハザードはコンパイラでコード生成時に検出し、命令の順序を最適化することで回避する。排他制御などで不可欠なアトミック命令はRISCでもサポートされる。
命令語長を固定長にすることでパイプライン処理の処理効率を向上させることができるが、プログラムをコンパイルする際にパイプライン動作を前提とした最適化を行う必要があり、コンパイラは複雑になりがちである。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
CISC (2)
構造
CPUの単一パイプラインを1/8語、1/4語、1/2語、1語、2語、3語、4語・・・と自在な演算器(実行ユニット)資源にて実現できる柔軟性を持つ構造。マイクロプログラム方式にすることで外部には同じインストラクションセットを維持したまま、このように内部マイクロアーキテクチャを増強していくことができる。マイクロプログラミング方式とはマイクロアーキテクチャたる内部CPUが万能チューリングマシンとして外部CPUをシミュレートすることである。その時点の実装技術で最も有効な内部CPUが外部CPUをシミュレートして後方互換性を実現する。このようにCISCは後方互換性を維持したまま持続的に性能と機能を向上できるアーキテクチャである。
歴史
初期のCPUは半導体の集積度が低いため、内部の演算器や実行ユニットのbit長がワード長より大幅に短かった。典型的には32bit=1ワードに対して演算器は4bitで8回の演算を繰り返して32bit同士の計算を実行していた。この繰り返し演算がCPUパイプラインの単一「実行」ステージの内部で行われていた。このようなアーキテクチャをビットスライスプロセッサと呼び、実行ユニットが4bitの場合に16進アーキテクチャと呼ばれた。
半導体の集積度が向上するにしたがって演算器のビット幅は向上し、CPUの内部構造は変更される。インストラクションセットの互換性を保ったまま内部アーキテクチャを容易に更新するためにマイクロプログラム方式が採用された。CISCは当初から単純なマイクロアーキテクチャで豊富な機能を実現するためにマイクロプログラム方式を使っていた。実行ステージで時間がかかるのでメモリレイテンシは問題ではなかった。メモリ間演算は理にかなっていた。
半導体の集積度が向上し、単一CPUの実行パイプラインが1/8語、1/4語、1/2語、1語実行ユニットと向上したときにRISCコンセプトが標榜された。RISCは1チップに集積されたCMOSマイクロプロセッサが32bit 1ワード実行ユニットで固定されるという前提に立って、単純化した構造で最適化すればCISCに勝てると考えていたようである。しかしCMOS半導体の集積度は向上し続け、スケーリング則により内部クロックは向上し続けた。オンチップキャッシュからのメモリレイテンシは増え続け、前提はすぐに崩れた。
CISCは引き続きCMOS半導体の集積度の向上に伴って、単一CPUのパイプラインを2語、3語、4語同時実行ユニットに向上した。複数実行ユニットにする方法がスーパースカラであり、更にその実行ユニット数を向上させる手法がアウトオブオーダ、投機的実行である。これらは増加したメモリレイテンシの時間を有効利用して、複数可変長パイプライン実行ユニットに対してレジスタリネーミングを割り当てる複雑な内部構造になる。
CISCはマルチ実行ユニットの改良をサブ実行ユニット時代と同じようにマイクロプログラム方式で吸収してRISCやEPICアーキテクチャとの性能競争に勝ち抜いた。現在、汎用高性能CPUは一部のスーパーコンピュータやサーバで利用されるPowerPC・IA-64・NEC SX等を例外として、CISCアーキテクチャに収斂された。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
CPUの単一パイプラインを1/8語、1/4語、1/2語、1語、2語、3語、4語・・・と自在な演算器(実行ユニット)資源にて実現できる柔軟性を持つ構造。マイクロプログラム方式にすることで外部には同じインストラクションセットを維持したまま、このように内部マイクロアーキテクチャを増強していくことができる。マイクロプログラミング方式とはマイクロアーキテクチャたる内部CPUが万能チューリングマシンとして外部CPUをシミュレートすることである。その時点の実装技術で最も有効な内部CPUが外部CPUをシミュレートして後方互換性を実現する。このようにCISCは後方互換性を維持したまま持続的に性能と機能を向上できるアーキテクチャである。
歴史
初期のCPUは半導体の集積度が低いため、内部の演算器や実行ユニットのbit長がワード長より大幅に短かった。典型的には32bit=1ワードに対して演算器は4bitで8回の演算を繰り返して32bit同士の計算を実行していた。この繰り返し演算がCPUパイプラインの単一「実行」ステージの内部で行われていた。このようなアーキテクチャをビットスライスプロセッサと呼び、実行ユニットが4bitの場合に16進アーキテクチャと呼ばれた。
半導体の集積度が向上するにしたがって演算器のビット幅は向上し、CPUの内部構造は変更される。インストラクションセットの互換性を保ったまま内部アーキテクチャを容易に更新するためにマイクロプログラム方式が採用された。CISCは当初から単純なマイクロアーキテクチャで豊富な機能を実現するためにマイクロプログラム方式を使っていた。実行ステージで時間がかかるのでメモリレイテンシは問題ではなかった。メモリ間演算は理にかなっていた。
半導体の集積度が向上し、単一CPUの実行パイプラインが1/8語、1/4語、1/2語、1語実行ユニットと向上したときにRISCコンセプトが標榜された。RISCは1チップに集積されたCMOSマイクロプロセッサが32bit 1ワード実行ユニットで固定されるという前提に立って、単純化した構造で最適化すればCISCに勝てると考えていたようである。しかしCMOS半導体の集積度は向上し続け、スケーリング則により内部クロックは向上し続けた。オンチップキャッシュからのメモリレイテンシは増え続け、前提はすぐに崩れた。
CISCは引き続きCMOS半導体の集積度の向上に伴って、単一CPUのパイプラインを2語、3語、4語同時実行ユニットに向上した。複数実行ユニットにする方法がスーパースカラであり、更にその実行ユニット数を向上させる手法がアウトオブオーダ、投機的実行である。これらは増加したメモリレイテンシの時間を有効利用して、複数可変長パイプライン実行ユニットに対してレジスタリネーミングを割り当てる複雑な内部構造になる。
CISCはマルチ実行ユニットの改良をサブ実行ユニット時代と同じようにマイクロプログラム方式で吸収してRISCやEPICアーキテクチャとの性能競争に勝ち抜いた。現在、汎用高性能CPUは一部のスーパーコンピュータやサーバで利用されるPowerPC・IA-64・NEC SX等を例外として、CISCアーキテクチャに収斂された。
引用元 : Wikipedia http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
