11

PUSHPOPが RISC 命令か CISC 命令かをインタビューで尋ねられました。RISC だと言いましたが、実際には CISC 命令であると言われました。私は ARM (一般的な RISC 実装) にこれらの命令があることを提案しましたが、ARM は混在しており、もはや純粋な RISC ではないと指摘されました。

いずれにせよ決定的な証拠をオンラインで見つけることができません。PUSHおよびPOP命令は本当に CISC アーキテクチャの特徴と見なされているのでしょうか、それとも RISC システムで見られるのでしょうか? なんで?

4

2 に答える 2

11

RISC は「縮小された命令セット」を意味します (通常、LOAD レジスタ、STORE レジスタ、ADD レジスタ、CMP レジスタ、Branch conditional + その他いくつか)。

概念と経験では、複雑な命令は、単純な命令シーケンスでは達成できない有用な効果を達成しないことが多いということです。特に、そのような複雑な命令を実装するために使用される追加のロジックが、単純な RISC 命令を実行するために投資されている場合は特にそうです。もっと早く。

PUSH と POP は、基本的に STORE/LOAD 間接とレジスタへの定数の ADD の単純な組み合わせです。したがって、スタック ポインター専用のレジスターを使用すると、PUSH と POP は簡単にシミュレートされ、高速のパイプライン マシンは、対応する RISC 命令とほぼ同じ速さで PUSH と POP を実行できる可能性があります。そのため、ほとんどの場合、PUSH と POP は CISC 命令であると考えられています。彼らは本当にあなたをたくさん買っていません。

CALL (== PUSH PC + JMP) と RET (POP PC) を考えると、人生はもっと面白くなります。これらは、適切な RISC アーキテクチャで簡単にシミュレートできます。ただし、POP PC ではパイプライン バブルが発生します。これは、プロセッサが新しい PC がどこにあるかを予測するのが難しく、プリフェッチを実行できないためです。メモリが「時間的に離れている」ため、サブルーチン呼び出しが多いコードでは、これがパフォーマンスの主要な阻害要因になる可能性があります。

ここで、ある種のCISCに行きたいと思っています。本当に必要なのは、PC が返されることを予測する何らかの方法です。最新の CPU の多くは、ハードウェアに「シャドウ コール スタック」を保持することでこれを行っています。各 CALL は、PC をメモリ スタックにプッシュし、シャドウ スタックにもプッシュします。各 RET はメモリ スタックから PC 値をポップしますが、本質的にゼロタイム アクセスを持つシャドウ スタックのトップ エントリを使用して命令ストリーム フローを予測します (そしてもちろん、シャドウ スタックをポップします)。このようにして、命令ストリームが中断されないため、CISC マシンがパフォーマンスで勝ちます。

(多くのレジスターを備えた RISC マシンは、リーフ関数呼び出しをコンパイルして常にレジスターを使用してリターン PC を格納するので、シャドウ スタックほど効果的ではないのではないかと思います。Sun Sparc は、レジスター ウィンドウでこれを行います)。

これは、RISC と CISC が設計のトレードオフを単純化しすぎていることを示しています。より複雑になって実際に何かが得られない限り、あなたが望むものは単純です。たとえば、ハードウェアの IEEE 浮動小数点は、RISC命令を使用したシミュレーションよりもはるかに高速です。

結果として、最新のマシンのほとんどは、きちんとした RISC または CISC ではありません。パフォーマンス プロファイリングが選択します。

于 2016-12-08T03:06:17.830 に答える