
命令レベル並列性(ILP)とは、コンピュータプログラムにおける一連の命令の並列実行または同時実行のことである。より具体的には、ILPとは、この並列実行のステップごとに実行される命令の平均数を指す。[ 2 ]: 5
ILPは並行処理と混同してはならない。ILPでは、プロセスの実行スレッドは1つだけである。一方、並行処理では、複数のスレッドをCPUのコアに厳密に交互に割り当てるか、十分なCPUコア数があれば真の並列処理(理想的には実行可能なスレッドごとに1つのコア)を行う。
命令レベルの並列処理には、ハードウェアとソフトウェアの2つのアプローチがあります。
ILP は、ハードウェアレベルの動的並列処理またはソフトウェアレベルの ILP 静的並列処理として実装されました。ハードウェアレベルの並列処理では、プロセッサはコードが既に実行されている時点で並列に実行する命令を決定しますが、ソフトウェアレベルの並列処理では、コンパイラが並列に実行する命令を事前に計画します。 [ 3 ]最新のx86プロセッサは、ハードウェアレベルの並列処理を実現するために複数の技術を使用していますが、Itaniumアーキテクチャは、ソフトウェアレベルの並列処理を大幅に可能にしただけでなく、コードの効率性のためにもそれに依存していました。
次のプログラムを検討してください。
e = a + b f = c + d m = e * f 操作3は操作1と操作2の結果に依存するため、両方の操作が完了するまで計算できません。しかし、操作1と操作2は他の操作に依存しないため、同時に計算できます。各操作が1単位時間で完了できると仮定すると、これら3つの命令は合計2単位時間で完了できるため、ILPは3/2となります。
コンパイラとプロセッサの設計者の目標は、可能な限り多くの命令レベル並列性(ILP)を特定し、活用することです。通常のプログラムは、命令がプログラマによって指定された順序で順番に実行される逐次実行モデルに基づいて記述されます。ILPにより、コンパイラとプロセッサは複数の命令の実行をオーバーラップさせたり、命令の実行順序を変更したりすることが可能になります。
プログラムにおける並列処理の量は、アプリケーションによって大きく異なります。グラフィックスや科学計算などの分野では、並列処理の量が非常に大きくなる可能性があります。しかし、暗号化などのワークロードでは、並列性ははるかに低くなる場合があります。
ILPを活用するために使用されるマイクロアーキテクチャ技術には、以下のようなものがあります。
命令レベル並列性(ILP)はコンパイラとハードウェアの両方で活用されますが、コンパイラはコンパイル時の最適化によって、プログラムに内在する暗黙的なILPをハードウェアに提供します。プログラム内で利用可能なILPを引き出すための最適化手法には、命令スケジューリング、レジスタの割り当て/名前変更、メモリアクセスの最適化などがあります。
データフローアーキテクチャは、ILPが明示的に指定されるアーキテクチャのもう1つのクラスです。最近の例としては、TRIPSアーキテクチャを参照してください。
近年、プロセッサの動作周波数とメモリへのアクセス時間の間の乖離が拡大しているにもかかわらず、ILP技術はパフォーマンスの向上に利用されてきました(IBM System/360 Model 91などの初期のILP設計では、比較的小さなレジスタファイルによって課せられる制限を克服するためにILP技術が使用されていました)。現在、メインメモリへのキャッシュミスによるペナルティは、数百CPUサイクルのコストを伴います。原理的には、ILPを使用してこのようなメモリレイテンシさえも許容することは可能ですが、関連するリソースと電力消費のコストは不釣り合いです。さらに、基盤となるハードウェア構造の複雑さと多くの場合レイテンシにより、動作周波数が低下し、あらゆる利点がさらに減少します。したがって、前述の技術は、チップ外データのためにCPUが停止するのを防ぐには不十分であることがわかっています。代わりに、業界はマルチプロセッシングやマルチスレッドなどの技術を通じて利用できる、より高いレベルの並列性を活用する方向に向かっています。[ 4 ]