質問

私はcudaと遊んでいます。

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

たとえば、5つの要素のテスト配列は次のようになります。
] [] [V1] [] [] [V2

結果は次のように見えなければなりません:
V1] [V2

問題は、結果を保存するために2番目の配列のアドレスを計算する方法です。最初の配列のすべての要素は、並行してチェックされます。

デバイス変数intを宣言することを考えています addr = 0。応答を見つけるたびに、 addr. 。しかし、私はそれについてそれについてはわかりませんそれはそれを意味します addr 複数のスレッドが同時にアクセスできる場合があります。それは問題を引き起こしますか?または、スレッドはその変数を使用して別のスレッドが終了するまで待ちますか?

役に立ちましたか?

解決

見た目ほど些細なことではありません。私はちょうどそれを実装しました、そして私はあなたが読む必要があるものを知ることができます GPU GEMS 3の記事をスキャンします 特に章 39.3.1ストリーム圧縮.

SDKのLargearrayscanの例から独自のスタートを実装するには、Prescanだけを提供します。デバイスメモリに選択配列があると仮定します(1と0の配列1- Select 0-廃棄)、 dev_selection_array a dev_elements_array 選択する要素a dev_prescan_array そしてa dev_result_array すべてのサイズ n それからあなたはします

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];
}
}

Prescanの他の素晴らしいアプリケーションについては、論文を参照してください BLE93

楽しむ!

他のヒント

あなたは古典的なストリーム圧縮について話している。一般的に私は見ることをお勧めします 推力 また cudpp (これらのリンクは圧縮文書に届きます)。これらはどちらもオープンソースです。独自のロールをしたい場合は、「スキャン」SDKサンプルを見ることもお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top