ユーザと設計者がCPU性能を議論する場合、最終的な性能測定基準はCPU実行時間である。
あるプログラムのCPU実行時間 = CPUクロック・サイクル数 X クロック・サイクル時間
あるプログラムのCPU実行時間 = CPUクロック・サイクル数 / クロック・サイクル周波数
CPUクロック・サイクル数=プログラム中の実行命令数 X 1命令当たりの平均クロック数(CPI)
以下の公式も便利
CPU時間 = 実行命令数 X CPI X クロック・サイクル時間
図6.2
このような並列実行を行うには、C並列実効の制御にあるように 同時実行する命令に依存性がないことを保証する必要がある。依存関係のある命令が同時にフェッチされた場合、どちらかを待たせるなどの工夫が必要。
Cの解決法1: 並列実行できる命令の組をコンパイラが指定する → VLIW
Cの解決方法2:ハードウエアが並列可能な命令を選んで並列実行する → スーパースカラー
1命令中に複数の演算を入れたアーキテクチャ
命令長が100ビット以上にもなるので、VLIWという
コンパイラーが命令中のハザードを解決ずみ(静的スケジューリング)である。
特徴: 並列化によって生じるハザードを検出するハードウエアが不要
これにより、アセンブラプログラムが他のプロセッサと互換性がない。
また、静的なスケジューリングでは並列化の限界が低い
図6.3
あらかじめ機械語を最適化することを静的最適化という。静的最適化を行うのはコンパイラである。
ハザードを減らすために、依存関係を解消したり、減らしたりする。
依存関係のある命令をプログラム中で離れた位置に置く。
もちろん、プログラムの意味を変えてはならない。(あたりまえ)
ループアンローリング
分岐命令の頻度を下げる(数を減らす)ことで、分岐命令によるハザードを減らす。
ソフトウエアパイプライニング
トレーススケジューリング
図6.8
レジスタの番号の置き換えによって並列性を向上
以上