GPU プログラミングには、CPU 上の DMIP 関数合成と同様の概念があります。GPU で「自動化」するのは簡単ではありませんが (一部のサードパーティ製ライブラリでは自動化できる場合があります)、手動で行う方が CPU プログラミングよりも簡単です (以下の Thrust の例を参照)。
DMIP の 2 つの主な機能:
- データがキャッシュに収まるように画像フラグメントによる処理。
- 異なるフラグメントへの並列処理、またはグラフの異なる独立したブランチの実行。
大きな画像に一連の基本操作を適用する場合、機能 1 は基本操作間の RAM 読み取り/書き込みを省略します。すべての読み取り/書き込みはキャッシュで行われ、機能 2 はマルチコア CPU を利用できます。
GPGPU の DMIP 機能 1 の同様の概念は、カーネル フュージョンです。基本操作の複数のカーネルを画像データに適用する代わりに、基本操作を 1 つのカーネルに組み合わせて、複数の GPU グローバル メモリの読み取り/書き込みを回避できます。
Thrustを使用した手動のカーネル フュージョンの例は、このスライドの 26 ページにあります。
ライブラリArrayFireは、自動カーネル フュージョンに多大な努力を払っているようです。
GPGPU の DMIP 機能 2 の同様の概念は、カーネルの同時実行です。この機能は必要な帯域幅を拡大しますが、ほとんどの GPGPU プログラムは既に帯域幅に制限されています。そのため、カーネルの同時実行はあまり頻繁には使用されません。
CPU キャッシュと GPGPU 共有メモリ/キャッシュの比較
CPU キャッシュは DMIP で RAM の読み取り/書き込みを省略しますが、GPGPU の融合カーネルの場合、レジスタは同じことを行います。DMIP の CPU のスレッドは小さな画像フラグメントを処理しますが、GPGPU のスレッドは 1 ピクセルしか処理しないことがよくあります。いくつかのレジスタは、GPU スレッドのデータをバッファリングするのに十分な大きさです。
画像処理では、GPGPU 共有メモリ/キャッシュは、結果のピクセルが周囲のピクセルに依存する場合によく使用されます。画像の平滑化/フィルタリングは、GPGPU 共有メモリ/キャッシュを必要とする典型的な例です。