0

私はcudaで遊んでいます。

現時点では問題があります。特定の応答に対して大きな配列をテストしています。応答を取得したら、データを別の配列にコピーする必要があります。

たとえば、5 つの要素からなるテスト配列は次のようになります。
[ ][ ][v1][ ][ ][v2]

結果は次のようになります:
[v1][v2]

問題は、結果を格納する 2 番目の配列のアドレスをどのように計算するかです。最初の配列のすべての要素が並行してチェックされます。

デバイス変数 int addr = 0 を宣言しようと考えています。応答が見つかるたびに、addrをインクリメントします。しかし、addrは同時に複数のスレッドからアクセスされる可能性があるため、それについてはわかりません。それは問題を引き起こしますか?それとも、別のスレッドがその変数の使用を終了するまで、スレッドは待機しますか?

4

2 に答える 2

1

見た目ほど些細なことではありません。実装が完了したばかりで、スキャンGpu Gems 3の記事、特に39.3.1StreamCompactionの章を読む必要があることがわかります。

SDKのLargeArrayScanの例から独自の開始を実装するには、プレスキャンのみを実行します。デバイスメモリに選択配列(1と0の配列は1-選択0-破棄を意味します)があると仮定すると、dev_selection_array 、選択されるdev_elements_array要素、すべてサイズNのdev_prescan_arraydev_result_arrayを実行します。

prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
         dev_selection_array, dev_elements_array, N);

ここで、スキャッターは

 __global__ void scatter_kernel( T*dev_result_array, 
                   const T* dev_prescan_array, 
                   const T* dev_selection_array,
                   const T* dev_elements_array, std::size_t size){

unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
    dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}

プレスキャンの他の優れたアプリケーションについては、紙Ble93を参照してください。

楽しむ!

于 2010-03-19T17:27:18.630 に答える
0

あなたは古典的なストリーム圧縮について話している。一般的には、ThrustまたはCUDPPを参照することをお勧めします (これらのリンクは圧縮ドキュメントに移動します)。これらはどちらもオープン ソースです。自分で作成したい場合は、「スキャン」SDK サンプルも参照することをお勧めします。

于 2010-03-16T07:54:27.070 に答える