命令レベル並列処理
from コンピュータアーキテクチャ 電子情報通信レクチャーシリーズ C-9
パイプライン処理は命令をいくつかの工程に分けることで効率化を図る
工程はステージと呼ぶ. ステージ間にデータ保存のためレジスタ (パイプラインレジスタ) があるが, これによってパイプライン処理はどう頑張っても効率化に限界がある
そこで, 演算能力を増やして並列に処理することを考える
プロセッサ自体を増やすか, プロセッサ内の演算機 (ALU) を増やす. 命令フェッチが複数行えるので, 遅延が緩和される
より回路が複雑になったり, 資源が必要になるのは当然だが, 特にハザードの問題がある. ハザードは命令が上手く処理されずに滞る状態のことを言う (e.g. データハザード) . つまり, 命令同士に依存関係があって上手く処理できていない
ちなみに, フォワーディング機構は前後に依存関係を持つ命令がある時に, レジスタに記録せず実行前のデータ置き場に演算結果を持っていき, 遅延を起こさずに処理する. これは依存関係にある命令が同時に処理される場合, 効果がない. この仕組みでは遅延が生じ, 解決できない
命令同士に依存関係があると, 単純に演算機を増やしても上手く実行できない可能性がある. そこで, 予め命令の依存関係を考慮した処理順にするなどの対策が考えられる
並列処理パイプラインの図について
?ALUを増やすらしい. なぜ?
ここがボトルネックになり得るから
仮に命令フェッチとデコードで依存関係を処理でき, メモリアクセスも問題ない場合, 演算装置の数が不足すると処理が止まる
?メモリアクセスがALUの演算実行とは並列化できるとあるが, それはどういう状況で, どんな効果がある?
おそらく, ALUの計算がそこそこ重い場合, メモリアクセスの遅延が隠蔽できるということ
Compute-Bound
あるいはキャッシュできるとか, 命令と別にデータを読み出すためのバスがあるとか
ハーバード型. 命令バスとデータバスを別に持つ
逆にメモリがボトルネックになる場合もある
Memory-Bound
プロセッサを増やすのだから, その分色々な機器を増やさないと動かない
肝心の問題は並列実行を制御すること
命令の依存関係がある時, それらが同時にフェッチされると, データハザード, つまり処理できずに待機する時間がフォワーディングで解消されない
依存関係のある命令が並列実行された場合, フォワーディングは無力. 元々, 前後で実行された場合に対処する機構
並列に命令を実行する際, これらの間に依存関係があると片方の命令を待たせねばならず, せっかく演算装置を増やしても意味がない. よって, 上手く依存関係のない命令が実行されるよう制御する必要がある
命令レベル並列処理は制御法によって分類できる