並列性の粒度
並列性の粒度には3つのレベルがある。
もっとも小粒な並列性がDLPでもっとも大粒な並列性がTLP。
DLP
データレベル並列性
画像のピクセル間、配列形式のデータ
SIMD型のプロセッサ(GPU、ベクトルプロセッサ、AVX)で効率よく処理可能
ILP
命令レベル並列性
複数の命令を同時に実行しても結果が変わらない
スーパースカラやVLIWはこの並列性を利用
TLP
タスクレベル並列性
異なる処理を同時に行う
マルチコアにおいてコアごとに違う処理を行う
小さな並列性から大きな並列性まで十分に利用することで大きくスループットを向上させることができる。
この3つの中でDLPとTLPは十分にスケーラビリティがあるが、ILPでスケーラビリティを出すのは難しい。このため、今後はDLPとTLPを中心に発展が進むのではないかと思う。
なぜILPは難しいかというとひとつはコンパイラの解析性能がある。DLPやTLPは手動で書くことも比較的容易であるが、ILPを行おうとするとコンパイラに頼らざるを得ない。したがってコンパイラが十分に賢くなければならないのだが実際はそうではない。また、ILPを見つけたとしてもせいぜい3並列程度が限界なのではないだろうか。そもそも並列性がそんなにないのでスケーラビリティがないのである。これをILPの収穫逓減などという。
一方でILPにはもうひとつ大切な役割があり、それがメモリレベル並列性だ。メモリレベル並列性はILPに分類されるのだが、これは何かというとload命令のレイテンシを隠蔽できる個数はどのくらいかという点だ。現代のプロセッサはメモリと比べて何十倍も早いため、キャッシュミスを起こした時のペナルティが大きい。このためload命令を待たずに命令を実行し続けられることは重要である。この点ではILPは研究され続けるだろう。