ILP
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ILP(Instruction-level parallelism、命令レベルの並列性)とは、プログラムの中で並行して実行できる処理がいくつあるかを計測する方法である。 例として以下のようなプログラムを考える。
1. e = a + b 2. f = c + d 3. g = e * f
処理3は、処理1と処理2の結果に依存している。したがって、処理3は処理1と処理2が完了してからでないと計算を開始できない。 しかし、処理1と処理2は何にも依存していないので並行して実行できる。 それぞれの処理にかかる時間が同じだとして、それを1とすると、これら3命令が完了するのにかかる時間は2となり、結局ILPは3/2となる。
コンパイラとCPUの設計者の目標のひとつは、可能な限りILPを高めることである。
ILPを増やすためのアーキテクチャ上の技法としては、以下のようなものがある。
- 命令パイプライン:キャッシュメモリに依存する。
- レジスタ・リネーミング:これはレジスタの再利用による不必要なプログラムの順序性を防ぐテクニックである。
- 投機的実行:条件分岐によるパイプラインストールを減らす。
- 分岐予測:パイプラインをいっぱいにしておくために使われる。
- スーパースケーラ:複数の実行ユニットが並行して複数の命令を実行する。
- アウト・オブ・オーダー実行:メモリアクセスによるパイプラインストールを減らす。
最後のふたつの技法を実現するのは難しいため、命令セットを変更して明示的に複数の処理をひとつの命令に入れる手法に注目が集まっている。そのような命令セットとしては、VLIWと、それに良く似たEPICアーキテクチャがある。
2004年時点では、ILPを向上させることによる性能向上は壁に突き当たっている。 その代わり、より高レベルな並列性、例えばマルチプロセッシングや同時マルチスレッディングが注目されてきた。