私は3年前にプロセッサアーキテクチャを学びました。
今日まで、私はシーケンシャルインストラクションの前になぜexecute
位置していたのか理解できません。memory
命令の実行中に、[ mov (%eax) %ebx]
メモリにアクセスする必要はありませんか?
ありがとう!
私は3年前にプロセッサアーキテクチャを学びました。
今日まで、私はシーケンシャルインストラクションの前になぜexecute
位置していたのか理解できません。memory
命令の実行中に、[ mov (%eax) %ebx]
メモリにアクセスする必要はありませんか?
ありがとう!
通常研究されている古典的な RISC パイプラインを思い出してみましょう: http://en.wikipedia.org/wiki/Classic_RISC_pipeline。その段階は次のとおりです。
load
RISC では、メモリを操作するためにs とsのみを使用できstore
ます。そしてEX
、メモリアクセス命令のステージは、メモリ内のアドレスを計算します(レジスタファイルからアドレスを取得し、それをスケーリングするか、オフセットを追加します)。MEM
次に、アドレスがステージに渡されます。
あなたの例mov (%eax), %ebx
は、実際には追加の計算なしのメモリからのロードであり、RISC パイプラインでも表すことができます。
IF
- 命令メモリから命令を取得するID
- 命令をデコードし、「eax」レジスタをオペランドとして ALU に渡します。WBの出力として「ebx」を覚えておいてください(コントロールユニット内)。EX
- ALU で「eax+0」を計算し、結果を次のステージに渡しMEM
ます (メモリ内のアドレスとして)MEM
-EX
ステージから (ALU から) アドレスを取得し、メモリに移動して値を取得します (このステージでは、パイプラインのブロックにより、メモリに到達するまでに数ティックかかる場合があります)。値を渡すWB
WB
- から値を取得しMEM
、レジスタ ファイルに戻します。コントロールユニットはレジスタファイルを次のモードに設定する必要があります:「書き込み」+「EBX選択」真の CISC 命令では、状況はより複雑です。たとえば、 (メモリからadd (%eax), %ebx
ワードをロードし、次に T+を にストアします)。この命令は、アドレス計算と ALU での加算の両方を必要とします。これは、最も単純な RISC (MIPS) パイプラインでは簡単に表すことができません。T
[%eax]
%ebx
%ebx
最初の x86 CPU (8086) はパイプライン処理されず、常に 1 つの命令しか実行されませんでした。しかし、80386 以降では 6 ステージのパイプラインがあり、RISC よりも複雑です。MIPS と比較したパイプラインに関するプレゼンテーションがあります: http://www.academic.marist.edu/~jzbv/architecture/Projects/projects2004/INTEL%20X86%20PIPELINING.ppt
スライド 17 は次のように述べています。
mem
とEX
ステージを組み合わせてロードとストールを回避しますが、アドレス計算のストールを作成します私の例では、いくつかの CPU ティックに対してadd
結合された " " ステージで実行され、多くのストールが生成されます。MEM+EX
最新の x86 CPU はパイプラインが非常に長く (通常は 16 ステージ)、内部的に RISC に似た CPU です。デコーダー ステージ (3 ステージ以上) は、ほとんどの複雑な x86 命令を一連の内部 RISC のようなマイクロ操作に分割します (マイクロコードの助けを借りて、命令ごとに最大 450 のマイクロ操作が生成される場合があります。より一般的なのは 2 ~ 3 のマイクロ操作です)。複雑な ALU/MEM 操作の場合、アドレス計算用の microop、メモリ ロード用の microop、ALU アクション用の microop があります。マイクロオペレーションはそれらの間に依存し、異なる実行ポートに計画されます。