命令レベルの並列性
依存関係には2つの種類がある。データの依存関係と制御の依存関係である。一般のプログラムは逐次実行モデルを前提として書かれている。このモデルにおいては、命令はひとつずつ実行され、個々の命令は不可分であり(すなわち、任意の時点で実行されている命令は1つだけである)、プログラムが指定した順序通りに実行される。
命令レベルの並列性を妨げる依存関係は様々である。複数の命令の並列実行を行えば、命令の実行順序が変わってしまい、そこに依存関係があれば、最終的な結果が期待したものとは変わってしまう。データの依存関係には、以下のようなものがある。
メモリアクセスによるパイプラインストールを減らす。だが製造価格に大きく影響するほどのハードウェアリソースを必要とするため、かつては純粋な実装は現実的でなかった。近年は新しいスキームの提案や改良を加えたアーキテクチャの実装により実現している。
アウト・オブ・オーダー実行の現在の実装では、普通のプログラムから(コンパイラの助けを借りずに)動的に命令レベルの並列性を引き出す。並列性をコンパイル時に引き出し、その情報をハードウェアに伝えるという方法もある。アウト・オブ・オーダー実行は大規模化すると実装するのが難しくなるため、命令セットを見直して、一つの命令に独立して実行可能な複数の操作を符号化する方法が見直された。そのような手法として、VLIW と EPICアーキテクチャがある。VLIW とアウト・オブ・オーダー実行は同時に使用することも可能である。
データフローアーキテクチャは命令レベルの並列性を明示的に引き出す別の手法である。