0

Intel のIntegrated Performance Primitives (IPP)ライブラリには、 Deferred Mode Image Processing (DMIP)と呼ばれる機能があります。これにより、一連の関数を指定し、関数を構成し、構成された関数をキャッシュに適したタイル処理によって配列に適用できます。これにより、関数ごとに配列全体を単純に反復するよりもパフォーマンスが向上します。

この手法は、GPU 上で実行されるコードにもメリットがあるようです。NVIDIA Performance Primitives (NPP)など、利用可能な GPU ライブラリは多数ありますが、DMIP のような機能を備えているものはないようです。何か不足していますか?それとも、GPU ライブラリが自動化された関数構成の恩恵を受けない理由はありますか?

4

1 に答える 1

1

GPU プログラミングには、CPU 上の DMIP 関数合成と同様の概念があります。GPU で「自動化」するのは簡単ではありませんが (一部のサードパーティ製ライブラリでは自動化できる場合があります)、手動で行う方が CPU プログラミングよりも簡単です (以下の Thrust の例を参照)。

DMIP の 2 つの主な機能:

  1. データがキャッシュに収まるように画像フラグメントによる処理。
  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 共有メモリ/キャッシュを必要とする典型的な例です。

于 2013-01-09T22:19:53.233 に答える