ミニクイズ 4 E ハザード ( つ前の命令の結果を必要とする状況 ) が発生する条件を つ挙げよ. また それぞれの時に 制御線 ForwardA, ForwardB はどのように設定すれば良いか? ( 回答 ) E/.RegWrite= かつ E/.RegisterRd = ID/.RegisterRs この時,ForwardA = と制御すれば良い. E/.RegWrite= かつ E/.RegisterRd = ID/.Register この時,ForwardB = と制御すれば良い. ( 解説 ) E/.RegisterRd は, 今 ステージにある命令 ( 先行命令 ) の書き込みレジスタ番号 * 教科書には E/.RegisterRd も条件に書かれていますが, 本質でないので割愛します.
ミニクイズ 5 前ページのミニクイズ 4 の回答は, 実は不完全です. どのような場合に正しく動作しないか? そして, 正しい回答を示せ. ( 回答 ) E/.RegWrite= かつ E/.RegisterRd = ID/.RegisterRs に加えて, /E.RegisterRd ID/.RegisterRs この時,ForwardA = と制御すれば良い. E/.RegWrite= かつ E/.RegisterRd = ID/.Register に加えて, /E.RegisterRd ID/.Register この時,ForwardB = と制御すれば良い. ( 前ページのままではうまくいかない例 ) add $, $, $ add $, $, $3 3add $, $, $4 3 の実行時に, フォワードしないといけないのは, それとも どちらの結果でしょう? 4
重要問題 クロックサイクル で, 以下の命令列の最初の sub 命令のフェッチを開始するとする 最初に $=, $=, $3=3 であったとする それ以前の命令は全て無視することにする クロックサイクル,,3,4 のそれぞれの時刻に, 図 6.36 の回路の各結線の値とレジスタ $ の値を述べよまた,ALU の入力となっている が何を選択しているかも回答せよ. ( この問題の設定だけでは値が不明な結線は答える必要はない ) sub $, $, $3 #$に引き算の結果を格納 and $, $, $5 # 第 オペランドがsubに依存 or $3, $6, $ # 第 オペランドがsubに依存 add $4, $, $ # 第, オペランドがsubに依存 sw $5, ($) # インデックスがsubに依存
IF/IDWrite 重要問題 回答 clock= ハザード 検出ユニット ID/.emRead 現在の $= PCWrite and IF/ID 制御 sub ID/ /E E/ PC 命令メモリ 3 reg 書込 reg reg レジスタ IF/ID.RegisterRs IF/ID.Register IF/ID.RegisterRd 3 3 ForwardB Rd ALU ForwardA アドレス データメモリ データ /E.RegisterRd ID/.Register Rs フォワーディング ユニット E/.RegisterRd sub 命令は 番レジスタ 3 番レジスタから読み出し その値の と 3 は次のステージで使うためにパイプラインレジスタにいったん覚えられる IF/ID.Register の Rs,, Rd は sub 命令の rs, rt, rd フィールドで指定されたレジスタ番号で これがパイプラインレジスタを介して 次のステージに渡される
IF/IDWrite 重要問題 回答 clock= ハザード 検出ユニット ID/.emRead $5 の値は不明 現在の $= PCWrite or IF/ID 制御 and ID/ sub /E E/ PC 命令メモリ 5 reg 書込 reg reg レジスタ IF/ID.RegisterRs IF/ID.Register IF/ID.RegisterRd ID/.Register $5 5 3 3 Rs ALU ForwardA ForwardB Rd フォワーディング ユニット - アドレス データメモリ データ /E.RegisterRd E/.RegisterRd sub 命令は と 3 の引き算をして結果の - をパイプラインレジスタに保存 ALU の入力の は上下とも 番ポートを選択 Sub の書き込みレジスタの番号は rd で指定された 番であるため 一番下の は Rd の を選択して この情報は 書き込みレジスタ番号 (Rd) としてパイプラインレジスタを介して次の段に送られる
IF/IDWrite 重要問題 回答 clock=3 ハザード 検出ユニット ID/.emRead $6 の値は不明 現在の $= PCWrite add IF/ID 制御 or ID/ and /E sub E/ PC 命令メモリ 6 reg 書込 reg reg レジスタ IF/ID.RegisterRs IF/ID.Register IF/ID.RegisterRd ID/.Register $6 6 3 $5 5 - ALU ForwardA ForwardB Rd Rs フォワーディング ユニット - アドレス データメモリ データ /E.RegisterRd E/.RegisterRd sub 命令の結果の-は 次のステージで書き込むためにE/レジスタに書き込まれる また 番レジスタに書き込まないといけないが その の情報は 上記 /E.RegisterRdを通してパイプラインレジスタに書き込まれる ステージは ALUの上側の入力には $が来ないといけないが これはレジスタから読み出したではなく 先行命令の結果の-をフォワードしてくる そのため 上側のはポートを選択している フォワーディングユニットへの入力 Rs, /E.RegisterRdがともにで等しいため 上側のはポートを選択するようにForwardAを設定する 3
IF/IDWrite 重要問題 回答 clock=4 ハザード 検出ユニット ID/.emRead 現在の $=- ( このクロックの途中で - に更新され 新しい値が add 命令のために正しくパイプラインレジスタに保存される :Chap5 p 参照 ) PCWrite sw IF/ID 制御 add ID/ or /E and E/ sub PC 命令メモリ reg 書込 reg reg レジスタ IF/ID.RegisterRs IF/ID.Register IF/ID.RegisterRd ID/.Register - - 4 $6 6 - ALU ForwardA ForwardB Rd 3 Rs 3 フォワーディング ユニット アドレス データメモリ データ /E.RegisterRd E/.RegisterRd - sub 命令の結果の - は このステージでやっと書き込まれる レジスタを高速なものを使うようにしたので (Chap5 p 参照 ) このステージで書き込んだと同時にステージの後半では その新しい - という値はレジスタの読み出しポートに出てくる ( 上図はその様子 ) そのため add 命令の ID ステージの最後には正しく読み出せて パイプラインレジスタには - が書き込まれる ステージは ALU の下側の入力には clock=4 で読み出した $ の値ではなく E/ レジスタから適切にフォワードされた sub の結果の - が選ばれるように は設定される 4
章末問題 の回答その 単一サイクルの 命令の実行時間 +5+++5 = 7ps ( 命令フェッチ + レジスタ読み出し +ALU+ メモリアクセス + レジスタ書き込みの時間 ) マルチサイクルの クロックは 各ステップのうち時間が一番長いものにあわせないといけないので ps となる また ロード (5%) は 5 サイクルストア (%) は 4 サイクル分岐 (%) は 3 サイクルジャンプ (%) は 3 サイクル ALU 命令 (5%) は 4 サイクルそれぞれかかるので 命令にかかるサイクル数は平均で 5x.5 + 4 x. + 3x. + 3x. + 4 x.5 = 4. サイクルである そのため 命令にかかる平均時間は x4.=84ps 5
章末問題 の回答その パイプラインの クロックは マルチサイクル同様 ps 基本的に平均すると クロックで 命令の処理が終わる しかし ハザードで以下の場合は余分なクロックがかかる. lw 命令の半分はその結果を使用する命令が直後に続く クロックストール. ジャンプ命令, 分岐命令の予測が外れた場合は,3 クロック分ストールする ( 講義で行った単純な方式 ) とする. ロード全体の半分なので 5/ =.5% の命令は余分に クロックかかる ジャンプ命令は その後余分に 3 クロックかかり それは全体の % 分岐命令のうち /4 は予測に失敗して そのとき余分に 3 クロックかかる そのような命令の割合は 全体の /4=.75 % 以上を考えると 平均 クロックでは命令は終了せず 全体の平均では x.5 + 3 x. + 3 x.75 =.675 つまり 命令にかかるクロック数は平均で.675 クロックのため そのため 命令にかかる平均時間は x.675 = 53.5 ps と他の方式の 倍以上早いことになります 6