22

そのため、遅延スロットに関する私の理解では、分岐命令が呼び出されたときに発生し、分岐に続く次の命令もメモリからロードされます。これのポイントは何ですか?分岐が行われた場合に、分岐後のコードが実行されないと思いませんか? ブランチが取られなかった場合に時間を節約するためですか?

私はパイプライン図を見ていますが、とにかく分岐後の命令が実行されているようです..

4

5 に答える 5

27

最近のほとんどのプロセッサはパイプラインを使用しています。H&P の本からのアイデアや問題が随所に使われています。これらのオリジナルの執筆時点では、実際のハードウェアはパイプラインの特定の概念と一致していると思います。フェッチ、デコード、実行、書​​き戻し。

基本的に、パイプラインはアセンブリ ラインであり、ライン内に 4 つのメイン ステージがあるため、一度に処理できる命令は最大 4 つです。これは、命令を実行するのに何クロックかかるかという概念を混乱させます.1クロック以上かかります.

組み立てラインで分岐を行うと、失敗します。フェッチおよびデコード ステージの命令は破棄する必要があり、再度入力を開始する必要があるため、フェッチ、デコード、および実行に戻るまでに数クロックのヒットが必要です。ブランチ シャドウまたは遅延スロットのアイデアは、これらのクロックの 1 つを回復することです。分岐後の命令が常に実行されると宣言すると、分岐が行われるとデコード スロットの命令も実行され、フェッチ スロットの命令は破棄され、時間の穴が 2 つではなく 1 つになります。したがって、execute、empty、empty、execute、execute の代わりに、execute、execute、empty、execute、execute... がパイプラインの実行ステージに表示されます。分岐の痛みが 50% 軽減され、全体的な平均実行速度が向上します。

ARM には遅延スロットがありませんが、プログラム カウンターが 2 命令進んでいることを宣言することで、パイプラインの錯覚も与えます。プログラム カウンター (pc 相対アドレッシング) に依存する操作はすべて、2 命令先の pc を使用してオフセットを計算する必要があります。ARM 命令の場合、これは元の Thumb 4 バイトに対して 8 バイトであり、thumb2 命令を追加すると、乱雑になります。

これらは、学者の外の現時点では幻想であり、パイプラインはより深く、レガシーコードが機能し続けるために、および/またはアーキテクチャの変更ごとに命令がどのように機能するかを再定義する必要がないために、多くのトリックを持っています (mips rev を想像してください) x、1 遅延スロット、rev y 2 遅延スロット、rev z 条件 a の場合は 3 スロット、条件 b の場合は 2 スロット、条件 c の場合は 1 スロット プロセッサは先に進み、分岐後の最初の命令を実行し、残りの一握りを破棄しますまたは、パイプを再充填するときに数十回。パイプの実際の深さは、一般に公開されていないことがよくあります。

これがRISCのことであるというコメントを見ました。そこから始まった可能性がありますが、CISCプロセッサは同じ正確なトリックを使用して、レガシー命令セットの錯覚を与えるだけです。時には、CISCプロセッサはRISCまたはVLIWコアにすぎませんレガシー CISC 命令セット (マイクロコード) をエミュレートするラッパー。

その作り方をご覧ください。組み立てラインを視覚化します。ラインの各ステップにはタスクがあります。ラインの 1 つのステップで青色の whatsits が不足し、青色と黄色の製品を作るために青色の whatsits が必要になった場合はどうなるでしょうか。そして、誰かが台無しにしたため、新しい青のWhatsitsをもう1週間入手できません。したがって、ラインを停止し、各ステージへの供給を変更し、赤と緑の製品をしばらく作成する必要があります。これは、通常、ラインをダンプすることなく適切に段階的に導入できたはずです. これは、アセンブリ ラインのどこかで、何かが原因でラインを変更し、ラインをダンプしなければならないブランチで発生するようなものです。遅延スロットは、1 つの製品をラインで廃棄する必要がないようにする方法です。ラインが停止する前に N 個の製品が出てくる代わりに、生産実行ごとに N+1 個の製品が出てきました。

于 2013-03-13T14:00:10.927 に答える
15

分岐が行われた場合に、分岐後のコードが実行されないと思いませんか?

しかし、もう手遅れです。CPU パイプラインの全体的な目的は、サイクルごとに命令を完了することです。これを実現できる唯一の方法は、サイクルごとに命令をフェッチすることです。そのため、分岐命令の後のコードはすでにフェッチされており、CPU が分岐を行う必要があることに気付く前に実行中です。

これのポイントは何ですか?

意味はありません。これは機能ではなく、この種のパイプライン設計の成果物にすぎません。

于 2013-03-13T00:59:39.483 に答える
7

命令は分岐の後にプログラムに表示されますが、実際には分岐が行われる前に実行されます。遅延スロット分岐ハザードに関するウィキペディアのページを確認してください。

于 2013-03-13T00:53:32.833 に答える
6

RISC アーキテクチャの考え方は、デコードを簡素化し、パイプラインを最適化して速度を上げることです。CPU はパイプライン処理によって命令の実行をオーバーラップさせようとするため、複数の命令が一度に実行されます。

遅延スロットの具体的なポイントは、パイプラインの一部を既に通過しており、それ以外の場合は破棄する必要があるスロットにある命令を実行することです。

オプティマイザーは、分岐ターゲットで最初の命令を受け取り、それを遅延スロットに移動して、「無料で」実行することができます。

この機能が主流にならなかった主な理由は、世界が既存の ISA 1設計、つまり x86 および x86-64 で標準化したためですが、別の理由もあります。

トランジスタ数の二次爆発により、非常に洗練されたデコーダが可能になりました。いずれにせよ、構造的に目に見える ISA がマイクロオペレーションに変換されると、遅延スロットのような小さなハックは重要ではなくなります。


1. ISA:命令セット アーキテクチャ

于 2013-03-13T14:56:21.397 に答える
5

パイプライン化された実装の教科書的な例では、CPUはをフェッチし、デコードし実行し、書き戻します。これらのステージはすべて異なるクロック サイクルで発生するため、事実上、各命令は 4 サイクルで完了します。ただし、最初のオペコードがデコードされようとしている間に、次のオペコードがメモリからロードされます。CPU が完全に占有されている場合、4 つの異なる命令の一部が同時に処理され、CPU のスループットはクロック サイクルごとに 1 つの命令になります。

マシンコードにシーケンスがある場合:

      sub r0, #1
      bne loop
      xxx

プロセッサは のライト バックステージsub r0, #1からの実行ステージに情報をフィードバックできますbne loopが、同時に xxx はすでにfetchステージにあります。パイプラインを展開する必要性を簡素化するために、CPU 設計者は代わりに遅延スロットを使用することを選択します。遅延スロット内の命令がフェッチされた後、フェッチ ユニットは適切な分岐先アドレスを取得します。最適化コンパイラが遅延スロットに NOP を配置する必要があることはめったにありませんが、可能な両方の分岐ターゲットで必然的に必要とされる命令をそこに挿入します。

于 2013-03-13T07:06:08.297 に答える