3

私は次の MIPS コードを持っており、 正確性を維持しながら適切なパイプライン実行に必要なnop命令の数を減らすことができるように、コードを書き直し/並べ替えようとしています。データパスは停止も転送もしないと想定されています。この問題は 2 つのヒントを与えてくれます。分岐とジャンプが遅延し、遅延スロットを埋める必要があることを思い出させてくれます。また、必要に応じてメモリ アクセス命令 (lw、sw) のオフセット値を変更することを示唆しています。

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

このコードが 1 つの配列の内容をインクリメントし、それを別の配列に格納していることは明らかです。したがって、ループを完了する前にインデックスを計算する必要があるため、このコードをどのように再配置できるか正確にはわかりません。

私の推測では、(私が理解している限りでは) 遅延スロット内の命令は常に実行されるため、分岐命令の後にlw命令を移動することになります。繰り返しますが、私はこの主題をよく理解していません。説明をいただければ幸いです。パイプライン処理全般は理解していますが、遅延分岐はあまり理解していません。ありがとう

4

2 に答える 2

3

2番目のヒントに関して:

4 番目の命令を 2 番目にします。最初の命令がまだ実行されている間に (P/H 用語を使用する場合は、最初の命令の ID の後) パイプライン化できます。次に、(古い) 3 番目の命令のオフセットを 500 ではなく 496 にします。

最初のヒントについては、私は遅延分岐がどのように実行されるかについてあまり詳しくありません (SPIM には実装されていないので気にしませんでした)。古い最後の命令は、「遅延」という名前が示すように、おそらく最後から 2 番目にすることができますが、その方法と理由については説明できませんでした。

于 2013-11-07T03:47:28.310 に答える
2

分岐遅延スロットを埋める 1 つの方法は次のとおりです。

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2
于 2013-11-07T06:51:48.603 に答える