CPUとパイプライン
Fetch(取り込み)、Decode(解読)、Execute(実行)を平行作業して時間短縮したい!
というのがパイプラン処理
計算は式を覚えるがいいな。
(Depth+Instruction-1)*p
パイプラインバブル
パイプラインなんでジャンプ命令を実行しているときにはジャンプ命令の次の番地
に配置されている命令は取り込まれている、ジャンプしちゃうから使わないのに。。
その無駄がパイプラインバブル、無駄に実行される命令を遅延スロットという
しかたなくNOPをはさむとか??
1:add.w d0,d0
2:jmp HOGE
3:move.l a0,d0 ← 取り込んでも無駄!
パイプラインバブルを解消するアプローチ
<遅延分岐>
やってくれるのアセンブラの仕事になるけど?分岐命令の直前にある命令と
分岐命令の前後位置を入れ替えてアセンブルする。
そうするとjmp命令の実行時にはフェッチすべき命令が判明していることに
なるので無駄が発生しない。
上の例だと1と2を入れ替えてプログラムが作成される、つまり1の結果が
2に影響する場合はダメ。
ところで問題文の後続の命令を無条件に実行した後、実際の分岐が発生するって分かり難い
1を無条件実行したあと2による分岐が発生するということかな。
<投機的実行>
分岐しない方向の命令を先読みしておき、分岐するときには先読みしたものをキャンセルする。
分岐する方向を予測し,予測した方向の命令をあらかじめ実行しておく。