|
命令レベルの並列性(''Instruction-level parallelism''、ILP)とは、プログラムの中で並行して実行できる処理がいくつあるかの尺度である。 ==概要== 例として以下のようなプログラムを考える。 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 はコンパイラやプロセッサが複数の命令を同時に実行することを可能にしたり、順番を全く変えて実行することを可能にする。 プログラム内の命令レベルの並列性は、個々のアプリケーションによって異なる。グラフィックスや科学技術計算といった特定の分野では、計算量は多いが単純計算の繰り返しが多く、命令レベルの並列性は大きいことが多い。しかし、暗号などの処理では条件判定を多用するため結果の分岐次第でプログラムルーチンが変化してしまい、並列性は小さい。 ILPを増やすためのアーキテクチャ上の技法としては、以下のようなものがある。 * 命令パイプライン メモリよりも高速なキャッシュメモリを使うことでアクセスにかかる待ち時間を軽減する。しかしキャッシュメモリ自体のアーキテクチャにも依存する。 * レジスタ・リネーミング 論理レジスタ(の写像)による不必要なプログラムの順序性を防ぐテクニック。物理レジスタリソースが少ない場合は割り当てができないことがある。 * 投機的実行 条件分岐によるパイプラインストールを減らす。パイプラインが深い場合は特に有効だが、ハードウェアリソースを増大させる。 * 分岐予測 パイプラインを最充満状態にしておくために使われる。しばしば投機的実行とともに実装する。 * スーパースケーラ 複数の実行ユニットが並行して複数の命令を実行する。並列計算ではなく並行計算にあたる。 * アウト・オブ・オーダー実行 メモリアクセスによるパイプラインストールを減らす。だが製造価格に大きく影響するほどのハードウェアリソースを必要とするため、かつては純粋な実装は現実的でなかった。近年は新しいスキームの提案や改良を加えたアーキテクチャの実装により実現している。 アウト・オブ・オーダー実行の現在の実装では、普通のプログラムから(コンパイラの助けを借りずに)動的に命令レベルの並列性を引き出す。並列性をコンパイル時に引き出し、その情報をハードウェアに伝えるという方法もある。アウト・オブ・オーダー実行は大規模化すると実装するのが難しくなるため、命令セットを見直して、一つの命令に独立して実行可能な複数の操作を符号化する方法が見直された。そのような手法として、VLIW と EPICアーキテクチャがある。VLIW とアウト・オブ・オーダー実行は同時に使用することも可能である。 データフローアーキテクチャは命令レベルの並列性を明示的に引き出す別の手法である。 近年、ILP技法はプロセッサに比較してメモリが遅いという問題を克服して性能向上させる方法(メモリレイテンシーの隠蔽策)として使われている(System/360のころのILP技法はレジスタ数の少なさへの対処であった)。キャッシュミス時のペナルティは(21世紀初頭でも)数百サイクルにもなる。メモリレイテンシへの対処として上に挙げたようなILP技法を使うということは、リソースや電力消費の点であまりにも不釣合いである。さらに、ハードウェアが複雑化することでかえって動作周波数を上げられなくなり、性能が頭打ちになるという問題も生じている。従って、CPUがチップ外のデータを待って停止するのを避けるためにILP技法を利用するのは不適切であるとの考え方が出てきた。その代わりに、業界はマルチプロセッシングやハードウェアマルチスレッディングのような技法で明確でより高レベルな並列性を利用する方向へと進んでいる〔Reflections of the Memory Wall 〕 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「命令レベルの並列性」の詳細全文を読む スポンサード リンク
|