あるパイプライン化されたCPUは、通常の命令は1クロックで実行可能であるが、メモリからデータを読み込む際に1クロック、分岐命令を実行する際に1クロックストールする。このCPUが下に示すプログラムの一部を実行した場合の平均命令実行クロック数を計算し、最も近い値を次の中から選べ。
・・・
LDI R1, #10
LDI R2, #100
LDI R3, #0
Loop: LD R4, (R2)
ADD R3, R3, R4
ADDI R2,R2,#4
SUBI R1,R1,#1
BNEZ R1,Loop
END:
各命令の意味は以下の通りである。
LDI Rx、#Y :レジスタ Rx に値 Y を格納する。
LD Rx,(Ry): Ry の内容が示す番地のデータをメモリから読み出し、
Rx に格納する。
ADD Rx,Ry,Rz :Ry+Rz を Rx に格納する。
ADDI Rx,Ry,#Z:Ry+Z を Rx に格納する。
SUBI Rx,Ry,#Z:Ry-Z を Rx に格納する。
BNEZ Rx,label:Rx が0でなければ label に分岐する。
@ 1.22 A 1.28 B 1.32
C 1.38 D 1.41
C
メモリからデータを読み込む命令は2クロックで LD のみ。
分岐命令も2ブロックで BNEZ のみ。
他の命令は1クロックである。
(R1, R2, R3, R4) の値は以下のように変化する。なお、100番地以上の番地にはすべて1が入っていると仮定する。
LDI R1, #10 ・・・(10, 0, 0, 0)
LDI R2, #100 ・・・(10, 100, 0, 0)
LDI R3, #0 ・・・(10, 100, 0, 0)
→ここまでで3クロック
LD R4, (R2) ・・・(10, 100, 0, 1)
ADD R3, R3, R4 ・・・(10, 100, 1, 1)
ADDI R2,R2,#4 ・・・(10, 104, 1, 1)
SUBI R1,R1,#1 ・・・(9, 104, 1, 1)
BNEZ R1,Loop
→このブロックで7クロック
LD R4, (R2) ・・・(9, 104, 1, 1)
ADD R3, R3, R4 ・・・(9, 104, 2, 1)
ADDI R2,R2,#4 ・・・(9, 108, 2, 1)
SUBI R1,R1,#1 ・・・(8, 108, 2, 100)
BNEZ R1,Loop
→このブロックも7クロック
LD R4, (R2) ・・・(8, 108, 2, 1)
ADD R3, R3, R4 ・・・(8, 108, 3, 1)
ADDI R2,R2,#4 ・・・(8, 112, 3, 1)
SUBI R1,R1,#1 ・・・(7, 112, 3, 1)
BNEZ R1,Loop
→このブロックも7クロック
・・・
LD R4, (R2) ・・・(1, 136, 9, 1)
ADD R3, R3, R4 ・・・(1, 136, 10, 1)
ADDI R2,R2,#4 ・・・(1, 140, 10, 1)
SUBI R1,R1,#1 ・・・(0, 140, 10, 1)
BNEZ R1,Loop
→このブロックも7クロック
従って、実行完了まで
3クロック + 7クロック×10回 = 73クロック。
全部で53命令であるから、平均命令実行クロック数は、
73÷53 = 1.3773 ≒ 1.38クロックである。
W−6 | 目次 | W−8 |