命令パイプライン II


4.3.1 フォワーディングによるデータハザードの解消

 

4.3.2 命令アドレスの生成タイミング

 

4.3.3  遅延分岐

 

4.3.4 分岐予測

 

1) if文の条件分岐へのコンパイル f, g, h, i, j $s0, $s1, $s2, $s3, $s4

        if ( i == j ) goto L1;
        f = g + h ;
L1:    f = f -i ;

        beq $s3, $s4, L1
        add $s0, $s1, $s2
L1:    sub $s0, $s0, $s3

2) if-then-else 文のコンパイル

if ( i == j ) f = g + h ; else f = g - h;

        bne $s3, $s4, Else
        add $ s0, $s1, $s2
        j Exit
Else:  sub $s0, $s1, $s2
Exit:   

3) 変数の配列インデックスを伴うループのコンパイル 
   f, g, h, i, j
$s0, $s1, $s2, $s3, $s4
   &A[0]
$s5と仮定する

Loop:     g = g + A[i];
            i = i + j ;
            if ( i != h ) goto Loop;

Loop:     add $t1, $s3, $s3             # 2*i
             add $t1, $t1, $t1              # 4*i
             add $t1, $t1, $s5              # &A[i] => $t1
             lw $t0, 0($t1)                  # A[i] => $t0
             add $s1, $s1, $t0             # g = g + A[1]
             add $s3, $s3, $s4             # i = i + j
             bne $s3, $s2, Loop

4) While ループのコンパイル i, j, k $s3, $s4, $s5、  &save[0] $s6

While (save[i] == k)
    i = i + j;

Loop:      add $t1, $s3, $s3        # 2*i
               add $t1, $t1, $t1        # 4*i
               add $t1, $t1, $s6        # &save[i]=> $t1
               lw $t0, 0($t1)
               bne $t0, $s5, Exit
               add $s3, $s3, $s4       # i = i + j
               j  Loop
Exit:

 


宿題5 学籍番号 名前 日付 を書くこと

上記アセンブラプログラム2)、4)に対するパイプライン処理を図示し、すべての命令が開始し実行を完了するまでのサイクル数はいくらか?ただし、教科書図4.14に示されている分岐予測を行う場合と行わない場合の2通りを検討せよ。分岐予測を用いる場合には分岐予測の2ビットレジスタの初期値を”11”と仮定せよ。

ただし、以下の条件を仮定する
1) データフォワーディングあり (したがって、データハザードは発生しない)
2) プログラム2)の bne 命令は not TAKEN すなわち分岐せず、次の命令が実際には実行されるが、当然分岐予測回路などはそのようなことは知らない。
3) プログラム4)では whileループは4回のみ回るとする。
4) jによる制御ハザードは図4.11の改善状態を仮定する。

解答には 4枚の図面と、4つのサイクル数が必要。

以上