並列処理レベルの実用的な分類:ILP(Instruction-Level Parallelism)

項目 説明
インターフェース プロセッサ命令(一般的にはSIMD命令、積和命令)
処理対象 プロセッサ命令に対応するデータ型
処理対象データ量 レジスタかメモリ上の基本データ型2〜数個(bit単位)
実行主体 プロセッサの実行ユニット(プロセッサコア1個の内部)
同期手法 ハードウェアが暗黙的に行う
同期間隔 1〜数百クロック(nsオーダー)
期待できる性能向上率範囲 最大でも4倍は超えないぐらい*1
制限要素ネック 並列処理対象データがメモリ上の近い距離に配置されていなければ利用できず、プロセッサの処理能力に見合ったメモリ転送能力がシステムに要求される

インターフェースで「一般的にはSIMD命令」と断りを入れているのは、プロセッサがスーパースカラーやスーパーパイプライン、VLIWを採用している場合は全ての命令でILPを意識したコーディングができるのと、アウトオブオーダーや投機的実行に対応していると処理時間が並列処理的に変化するからです。個人的にはSIMD命令を扱えることよりも、この辺のプロセッサの挙動を読んでプログラミングできることの方がILPのテクニックという印象があります。

性能向上率は通常は2倍前後だと思いますが、VLIWを含めても4倍を超えることはないかな〜と思って400%以下としてみました。

ボトルネックの項目についてですが、ILPはレジスタ上のデータを対象とする処理なのでメモリからレジスタへ滞りなくデータが読み込まれなければ並列性が活かされません。汎用プロセッサにおいては一次キャッシュを有効に使うために処理の仕方によってデータの格納形式を適切な形にしておく必要があります。Array-of-Structures (AoS)にするのか、Structure-of-Arrays (SoA)にするのか、はたまたHybrid SoAなのかの選択がそれに当たります。
逆にTLPはマルチコアの場合は特にキャッシュのハードウェア機構、一般的にもメモリ空間を共有しており、それらが並行性制御の対象になる共有オブジェクトであることに留意して処理対象データ間の距離を確保しないとメモリアクセスにペナルティが発生します。
ILPのメモリアクセスに特別なハードウェア機構を持つDSPについては酔漢師匠の2191空挺団に「バスアーキテクチャの図」があります。新しいDSPの話がよければBlackfin空挺団の「メモリ周り」。DSPが大好きな方は「Blackfin(ADSP‐BF533)活用ハンドブック」を買って読むといいらしいです。

ちなみにわたしはHyperThreadingを含むSMT(Simultaneous Multi-Threading)も、TLPの情報を利用するもののILPの技術だと考えています。これはSMTがプロセッサ内の実行ユニットの利用率を高めるという、まさにILPと同じことを目的としていることや、SMPでは当然期待される同種の処理を並列に実行した際の性能向上をメモリアクセスのレイテンシの隠蔽という限られた範囲以外で期待できないことからそう考えた方がいいと思っています。
分類はあくまで一般的なプロセッサではこうだろうと決めつけて書いています。「そうじゃない、こうだ」とわたしの代わりに並列処理コンテンツを書いてくれる人が現れることを期待しています。また、世の中には恐ろしい命令を持ったプロセッサがあるらしいので、ILPでわたしの想像もつかないような処理をするプロセッサがあるかもしれません。

#7/25 積和命令、VLIW、実行主体、性能向上率について加筆。
 7/27 ボトルネックについて加筆。細かい修正。
 8/27 期待できる性能向上率範囲を修正(%をやめて倍率に)。ボトルネックを制限要素に変更

*1:IPC*1命令当たりの処理データ単位数*並列処理区間の割合