ICDロゴ

EPIC (Explicitly Parallel Instruction Computing)

【イーピック】

別名
明示的並列命令コンピューティング技術 (EPIC:Explicitly Parallel Instruction Computing) 【メイジテキ・ヘイレツ・メイレイ・コンピューティング・ギジュツ】

最終更新日: 1999/07/14

 米Intel社と米HP社が共同で開発している次世代の64bit命令セットアーキテクチャ、IA-64において採用される命令の並列実行技術。明示的並列命令コンピューティング技術とも呼ばれる。プロセッサの性能を向上させるための鍵となる技術であり、明示的な並列実行、投機的データロード、プリディケーションの3つの要素で構成される。

 従来のプロセッサでは、高性能化を図るために、スーパースカラー方式や、アウトオブオーダー実行など、さまざまな高速化の手法が開発され、実用化されてきた。しかし、これらの方式では、同時に実行できる命令を、プロセッサ内部で実行時に動的に判断していた。フェッチ、デコードが終わった命令はプロセッサ内部で動的にチェックされ、実行する準備ができている命令(使用するリソースの準備ができている命令)から順に演算ユニットへ送り、命令を処理するのであるが、このリソースの準備ができているかどうかや、他の命令と使用するリソースが競合しないかどうか、などを実行時に判断していたのである。このため命令の並列実行度を上げようとすると、命令のスケジューラが複雑になり、高速化ができないという問題点がある。また、分岐があれば命令のフェッチやデコードはすべてやり直しになるので、分岐の予測精度を上げる必要があるが、それにも限界があるし(最大でも90%程度といわれている)、メモリアクセスがあると、演算ユニットが長時間遊んでしまうという問題もある。それに、いくら分岐予測精度を上げて、さらに並列に実行できる命令の数を増やしても、実際のプログラムでは、相互に干渉せずに同時・並列的に実行できる命令の数は2〜4命令といわれており、投入したリソースの割には得られる効果が少なくなってきている。

 このような状況を打開し、従来とは全く異なるアプローチで命令の並列実行度を上げようとして開発されたのがEPIC技術である。これは、従来のプロセッサのように同時に実行できる命令を実行時に動的に判断するのではなく、あらかじめコンパイル時に、並列に実行できる命令を解析して、明示的にプログラム中に記述しておき、実行時にはそれらの命令をすべて同時に実行する、という技術である。プロセッサ内に用意された各演算ユニットを使う命令を、なるべく多く同時に実行できるように、あらかじめプログラムのコンパイル時にスケジューリングしておくのである。実行時における動的なリソースの割り当てや、衝突の検出などを行わなくてすむ分、ハードウェア構造が単純になり、高速化が行える。同時に実行できる命令の数は、プロセッサが備えている演算ユニットの数に制限されるが(この数はインプリメンテーション依存)、実行時に動的に判断する方式に比べると、各演算ユニットをより高速に、有効に活用することができる。これはVLIWアーキテクチャに似ているが、VLIWでは固定長の命令だったので、融通性が低く、演算ユニットの構成を変えるだけでもオブジェクトコードの互換性がなくなるなどの欠点があった。EPICでは、可変長の命令コードにするなどの工夫により、これらの欠点を改良・克服している。

 さらにEPICでは、データロードの投機的な実行により、メモリアクセスの遅延の影響を最小限にしている。プロセッサの高速化により、最近では外部メモリへのアクセス速度と、プロセッサ内部で必要とされるデータ供給速度のかい離が大きくなってきている。データをロードする命令を出しても、キャッシュがミスすれば非常に低速な外部のメモリにアクセスする必要があり、パイプラインが長時間停止(ストール)してしまうのである。そこでEPICでは、データのロード開始命令(投機的ロード命令)と、実際の使用命令を分離している。データを実際にアクセスするよりも(数命令以上も)前に先行してロード開始要求を出しておき、実際に必要になった時点ではすぐにデータを利用できるようにしているのである。これにより、非常に早い時点で外部メモリへのアクセスを開始して、キャッシュやプロセッサ内部への読み込みを開始することができ、演算ユニットを有効に活用できる。

 EPICにおけるもう一つの重要な技術が、プリディケーション(predication、述語)による命令実行である。従来のプロセッサでは、条件分岐の予測が外れた場合、命令フェッチやデコードなどをやり直す必要があり、これがパフォーマンス向上をはばむ原因となっていた。しかしEPICにおけるプリディケーションでは、条件が成立した場合と、条件が不成立になった場合の両方の命令を並列的に記述しておいて、条件が確定した方の命令だけを選択的に実行することができる。ちょうどCMOV命令のように(指定された条件が成立した場合だけMOVE命令を実行するという、x86アーキテクチャやRISC系プロセッサに用意されている命令。Conditional Move命令の略。分岐を行わずに条件的な処理を記述することができるようになる)、並列に並べた複数の命令のうちから、条件にマッチしたものだけを選択的に実行することができるのである。条件比較の結果はプリディケーションレジスタという1bitのレジスタに入れられるが、各命令ではこのプリディケーションレジスタを参照して(ほとんどすべての命令でプリディケーションレジスタを参照することができる)、1なら実行し、0なら実行しないというふうに動作する。これにより、条件分岐とその失敗によるペナルティをなくして、すべての命令を並列に記述し、シーケンシャルに実行することができる。プリディケーションレジスタは64本あるので、IA-64プロセッサでは、理論的には最大64条件まで並列に評価・実行できることになる。このプリディケーションは、先の投機的なデータロードにも適用されるため(ロード開始命令を実行しても、条件不成立の場合は、そのデータを無視してもよい)、ロード命令も分岐を越えて配置することができる。これにより、より早い時点でデータの投機的なロードを開始することができる。

 EPICが効率よく機能するためには、コンパイラによる命令の綿密なスケジューリングが欠かせない。ソースプログラムから、いかに多くの並列実行可能な命令を引き出し、それをスケジューリングするかによって、実行性能は大きく変わることが予想される。

Copyright (C) 2000-2007 Digital Advantage Corp.

アイティメディアの提供サービス

キャリアアップ