RISC 命令セットアーキテクチャではなぜコンパイラが「よりスマート」になる必要があるのか

RISC 命令セットアーキテクチャではなぜコンパイラが「よりスマート」になる必要があるのか

RISC (縮小命令セットアーキテクチャ) は、命令の数を減らしてパフォーマンスを向上させることを目的としています。このアプローチの唯一の欠点は、コンパイラが「よりスマート」でなければならないことです。

私の講師が「コンパイラはもっと賢くならなければならない」と言ったのはどういう意味ですか?そしてなぜそうなるのでしょうか?

答え1

RISC は、正直に言えば、「Reduced Instruction Set Complexity (命令セットの複雑さの低減)」の略です。命令の数は必ずしも削減されるわけではありませんが、各命令は、実行に必要なマシン サイクルと、実装に割り当てられたゲート数 (またはマイクロコード ストア) の点で、より単純化されます。

理論としては(少なくとも部分的には実現されていますが)、制御ロジックの量を減らすことで、レジスタとデータ パスに使用できるチップ スペースが増えるというものです。したがって、RISC マシンには通常、CISC マシンの 2 ~ 4 倍のレジスタがあります。

これにより、省略された制御ロジックの作業はコンパイラに任されます。これには、たとえば、2 つの加算を連続して実行するのではなく、加算してからシフト (異なるレジスタで) を実行するなど、操作の「スケジュール設定」(順序付け) が含まれます。これにより、加算器とシフタの両方が最適に使用されます。また、コンパイラはレジスタ セットを管理して、レジスタへの移動とレジスタからの移動を最適化し、ストレージ アクセスを最小限に抑える必要があります。さらに、コンパイラは、奇妙な命令 (「左に 1 つシフトしてリテラルでマスクする」など) を最適に活用する方法を知っている必要があります。これらの命令は通常、比較的強力になる (おそらく奇妙な) シナリオがあるためです。

その結果、優れた RISC コンパイラによって生成された命令を解読することは事実上不可能です。命令セットをよく知っていても、複雑なシフト操作やマスク操作が常に行われていなくても、30 分前の値がまだレジスタ 12 にあると判断するのは困難です。

(私が何を言っているのか信じられないという人のために言っておくと、私が最初に RISC に関わったのは 70 年代前半の IBM 801 で、ジョージ・ラディンやマーティ・ホプキンスとはファーストネームで呼び合う仲でした。)

答え2

RISC CPU には命令が少ないため、単一の高レベルステートメントが単一のマシン言語オペコードにうまく変換される可能性は低くなります。

RISC CPU の同義語は「ロード ストア アーキテクチャ」です。基本的に、実際に機能する RISC 命令は一般にレジスタのみで機能することを意味します。RAM に格納されている値を操作する場合は、明示的に LOAD 命令を発行する必要がありますが、x86 などの CISC CPU にはそれを自動的に実行する命令があります。RISC CPU は歴史的に x86 よりも多くのレジスタを持っており、優れたコードは利用可能なレジスタを適切に管理して不要なメモリ アクセスを回避するため、コンパイラはそれを考慮する必要があります。

もう 1 つは、RISC CPU は通常、リンクに必要な最小限の「インフラストラクチャ」のみを提供するという点です。

たとえば、x86 CPU には「スタック」という概念があり、値をプッシュして後で「ポップ」することができます ( およびPUSH命令があります)。 また、現在の命令ポインタをスタックにプッシュし、宛先アドレス (通常はサブルーチンまたは関数) にジャンプする命令もPOPあります。 その後、保存された命令ポインタをポップして元の関数から再開する命令を発行できます。 サブルーチンをネストすると便利で、およびを使用してサブルーチンのパラメータを簡単に設定できます。CALLRETPUSHPOP

たとえば、MIPS では、jal「ジャンプとリンク」の 1 つしか使用できません。これは、現在の命令ポインタをレジスタに配置し、そのアドレスにジャンプします。スタックや x86CALL命令などを実行したい場合は、手動で実行する必要があります。これには、コンパイラからのより高度なインテリジェンスが必要です。

答え3

CISC (Complex Instruction Set Computing) プロセッサでは、RISC (Reduced Instruction Set Computing) プロセッサよりも広範囲の命令を使用できます。

CISC での乗算の例は、MUL 1:3, 4:2 (1:3 と 2:4 を乗算) です。このコマンドは、レジスタの位置 1:3 の値をロードし、4:2 の値をロードし、それらを乗算して 1:3 に戻して格納します。

RISC CPU には次の機能が必要です。

  • ロードA、1:3
  • ロードB、4:2
  • 製品A、B
  • ストア 1:3、A

...4 つの RISC 操作を 1 つの CISC 操作に。

RISC では、最も単純な乗算計算を実行するのにも多くの演算が必要になるため、ビデオのレンダリングやゲームなどの処理にはどれだけ多くの作業が必要になるか想像してみてください。

これを念頭に置くと、プログラマーが入力したコードからソフトウェアを構築するコンパイラーは、RISC アーキテクチャの複雑なコード部分や複雑なコマンドを簡素化する方法を理解できるように、「よりスマート」になる必要があります。

これが意味を成すといいのですが、さらに読むには、次のものを見る価値があるかもしれません: http://www.engineersgarage.com/articles/risc-and-cisc-architecture?page=5

関連情報