1

CUDAを使用して次のアルゴリズムを実装する方法を考えようとしています。

大量のボクセルで作業し、ボクセルごとにインデックスiと値を計算しますc。計算後に実行する必要histogram[i] += c
cがあるのはfloat値であり、ヒストグラムには最大15,000のビンを含めることができます。

CUDAを使ってこれを効率的に実装する方法を探しています。最初の明らかな問題は、私が使用しているコンピューティング機能1.3ではatomicAdd()、フロートを実行することさえできないので、どうすれば確実に何かを蓄積できるかということです。

nVidiaによるこの例は、やや単純なことをします。ヒストグラムは共有メモリに保存され(サイズが原因で実行できません)、整数のみが累積されます。このアプローチを私の場合に一般化できますか?

4

2 に答える 2

1

おそらく、2 段階のアプローチが最適です。ボクセルのサブセットに対して複数のヒストグラムを作成し、それらをすべて合計してグローバル ヒストグラムにすることができます。

N 個のボクセルがあると仮定すると、最初にサイズ M x 15000 のグローバル デバイス メモリを作成します (ここで、M < N ですが、すべてのコアをビジー状態に保つのに十分な大きさです)。

cuda kernal を実行して、スレッド インデックスごとに N/M 数のボクセルのヒストグラムを計算します。すべてのスレッドが終了したら、最終的なヒストグラムの M ヒストグラムを合計する別の cuda カーネルを実行できます。

于 2010-06-04T00:49:38.463 に答える
0

atomAdd()を使用して外部メモリに直接ヒストグラムを作成することは、非常に非効率的です。ヒストグラムの範囲によっては、ソースデータの複数のパスを検討し、共有メモリ内の部分的なヒストグラムを更新してから、各パスの後に部分的なヒストグラムを書き出すことができます。入力データを何度も通過する必要がない限り、これははるかに効率的です。明らかに、必要なパスの数を最小限に抑えるために、使用可能な共有メモリの制限に従って、部分的なヒストグラムをできるだけ大きくする必要があります。

于 2010-05-31T16:38:31.287 に答える