1

ユニファイド シェーダー アレイが GPU メモリにアクセスする方法に関する情報を見つけて、それを効果的に使用する方法を理解する必要があります。私のグラフィックス カードのアーキテクチャのイメージでは、はっきりとはわかりません。

ここに画像の説明を入力

C++Amp を使用して大きな画像を GPU メモリにロードし、それを小さな断片 (4x4 ピクセルなど) に分割する必要があります。すべてのピースは、異なるスレッドで計算する必要があります。スレッドが画像へのアクセスを共有する方法がわかりません。

ここに画像の説明を入力

イメージへのアクセス中にスレッドが互いにブロックされないようにする方法はありますか? 排他的にアクセスできる独自のメモリを持っているのでしょうか?

ここに画像の説明を入力

それとも、ユニファイド メモリへのアクセスが非常に高速であるため、気にする必要がないのでしょうか (ただし、私はそれを信じていません)。画像ごとに約 10,000 のサブセットを計算する必要があるため、これは非常に重要です。

4

2 に答える 2

0

この特定のケースでは、心配する必要はありません。OpenCL イメージを使用するだけです。GPU は、単純に画像を読み取るのが非常に得意です (テクスチャリングのため)。ただし、この方法では結果を別のイメージに書き込む必要があります。これは、単一のカーネルで同じイメージから読み書きすることができないためです。計算を 1 回のパスとして実行できる場合は、これを使用する必要があります (反復する必要はありません)。

もう 1 つの方法は、通常のメモリ バッファとしてアクセスし、ウェーブフロント (同期して実行されるスレッドのグループ) 内のパーツをローカル メモリ (このメモリは非常に高速です) にロードし、計算を実行し、計算後に完全な最終結果を統合メモリに書き戻すことです。 . 計算中に同じイメージに値を読み書きする必要がある場合は、このアプローチを使用する必要があります。メモリに縛られていない場合でも、テクスチャから元の値を読み取り、ローカル メモリで繰り返し、最終結果を別の画像に書き込むことができます。

const * restrict ではなく、複数のスレッドが同じ場所を読み取る場合にのみ、ユニファイド メモリからの読み取りが遅くなります。一般に、後続のスレッド ID が後続の場所を読み取る場合、かなり高速です。ただし、スレッドがユニファイド メモリへの書き込みと読み取りの両方を行う場合、速度が低下します。

于 2014-01-07T19:34:31.250 に答える