開発日記

Erlangをダラダラ書きます。

CISCが生まれた背景を知りたいか.うん知りたい.

CISCが生まれた背景

時代がCPUの設計思想に大きく影響を与えている.

主に3つの要望があったと思われる.

1. メモリサイズを小さくしたい!そして消費電力とコストを下げたい!

  • 昔はメモリが高価でできるだけサイズを小さくしたかった.CISCではこの要望に応えるために,可変長命令を採用した.可変長であることで,命令の利用頻度に応じて機械語コードの長さをチューニングし,コードのビット数を削減できた.嬉しい.

2. メモリアクセス数を減らしたい!そして高速に動作させたい!

  • 昔はメモリが低速でフォンノイマンボトルネックが酷かった.キャッシュメモリも一般的ではなくCPUクロックをあげても高速動作には繋がらなかった.CISCではこの要望に応えるために,複雑な機能を予めサブルーチン化してCPU内に組み込み1命令で処理を実行できるようにすることで,必要な命令数を減らした.命令の数が減れば当然命令をフェッチする回数も減り,メモリが低速なシステムでも高パフォーマンスが出せるようになった.嬉しい.

3. アセンブラ記述を楽にしたい!ひたすら楽したい!

  • 昔はプログラムをアセンブラで直接記述するのが一般的で苦労することが多く,覚えることはできるだけ減らしたかった.CISCはこの要望に応えるために,レジスタや即値やメモリへのアクセスを同じ命令で扱えるようにし,命令ごとにオペランドを覚えたりする必要性を無くした.嬉しい.

  • 上記は,『命令がすべてのアドレッシングモードを利用できる』ようにしたとも言える.ここでもアドレッシングモードは広義のアドレッシングモードを指す.(下記に補足説明)また,これは命令の直交性が高いとも表現できる.(ちなみに,命令の直交性を上げようとするなら,可変長命令が自然な選択肢となる.なぜなら,レジスタへのアクセスとメモリへのアクセスで利用するビット数に差がありすぎるため,固定長だと無駄が多い設計となるから)

補足説明・アドレッシングモード

  • 広義の意味:操作対象をオペランドによって指定する,その指定方法

    • 例えば、命令がすべてのアドレッシングモードを利用できるとは、『add レジスタ, メモリ』や『add レジスタ, レジスタ』など同じadd命令で全ての対象(レジスタ・メモリ・即値)を扱えることを指す。
    • RISCでは、命令ごとに扱えるオペランドを制限している。そうすることで固定長命令になり、命令の読み込みと解釈を分けることができるようにしている。
  • 狭義の意味:メモリアクセスの指定方法

    • レジスタ間接(後述のインデックス付きレジスタ間接で,ベースをゼロレジスタにしたら良いのでわざわざレジスタ間接の命令は容易しなくていい)
    • ディスプレートメント付きレジスタ間接(PC相対・GP相対 etc,構造体アクセスとかに便利.構造体のポインタにメンバのオフセットを代入するだけで良く,わざわざレジスタを使うまでもない)
    • インデックス付きレジスタ間接(配列のアクセスなどに利用.配列の先頭アドレスをベースレジスタ,アクセス先までのオフセットをインデックスレジスタに格納)

その後どうなったか...

  • RISCの流れが生まれた.理由は,高クロックなCPUが欲しい!という要望があったからである.クロックをあげるためには動作をパイプラインにすると良い.このパイプラインの動作に『可変長命令』が邪魔をしてきた.可変長がゆえに命令メモリから命令をフェッチする際,次の命令がどこまでか見当がつかない.つまり,命令の読み込みと解釈を同時に実施する必要性が生まれ,『命令の読み込み』と『命令の解釈』を2段の別ステージに分けることができなくなってしまった.またシンプルに可変長命令の判断は遅延が生じル.高クロックを達成するためには可変長命令を諦めざるおえなくなった...

  • さらに,複雑な機能を予めサブルーチン化してCPU内に組み込むというのも,邪魔になった.なぜなら複雑なサブルーチンは処理がいつ終わるか予測できないため,ストールが発生しパイプライン処理が詰まってしまうからだ.ゆえにサブルーチンをCPUに組み込むことは諦めざるおえなくなった... (メモリ効率と速度はいつだってトレードオフ,とほほ)

  • さらにさらに,高級言語コンパイラの登場でアセンブラでプログラミングする必要性もなくなった...

RISCはパイプライン処理を効率的に動作させるために

❌ 可変長命令

❌ 命令の直交性

❌ 複雑な処理のサブルーチン化

⭕️ 固定長命令(即値フィールドも必要な量に抑える)

⭕️ アドレッシングモードを必要なものに限定

⭕️ 処理の単純化(空いたスペースにキャッシュメモリや多くのレジスタ

⭕️ ロード・ストアアーキテクチャキャッシュメモリを効率的に動作させるため,アクセスを1つのステージ限定させる.1命令1アクセスに限定する.)

⭕️ 多数の汎用レジスタレジスタはアクセス速度を予測できる.予測できるとコンパイラが最適化しやすくなる.)

他にもRISCは,3オペランドのものが多かったり,遅延スロットを持つ場合がある.


  • ただ今は,RISCCISCと明確に区別はできない.(可変長命令でも内部はRISCのように動作したりしてる)
  • 今は,すべてがRISCともいえる.(表面上の命令セットがCISCライクなだけ)

上記に関して,間違っていたらご指摘してくださると幸いです.

参考文献