CUDA を使用して配列からゼロ値を並列に効率的に削除するにはどうすればよいですか。ゼロ値の数に関する情報は事前に入手できるため、このタスクは簡単になります。
結果の配列にコピーするときは、番号がソース配列と同じ順序のままであることが重要です。
例:
配列には、たとえば次の値が含まれます: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] 5 つの値がゼロであるという追加情報。望ましい最終結果は、[19, 7, 3, 5, 1] を含む別の配列になります。
配列からいくつかの要素を削除するには、Thrust Library の並べ替え操作を使用できます。ゼロ値is_not_zero
を返すpredicateを指定すると、次のように操作を記述できます。false
true
thrust::copy_if(in_array, in_array + size, out_array, is_not_zero);
述語がゼロでないことを示しているため、出力配列にはゼロ以外の値のみが含まれます。
true
また、「remove_if」関数を、ゼロを返す逆述語と一緒に使用することもできfalse
ます。
thrust::remove_if(in_array, in_array + size, is_zero);
Thrust ライブラリのコンパクションの例、または一般的なコンパクションの概念をご覧になることをお勧めします。
https://github.com/thrust/thrust/blob/master/examples/stream_compaction.cu
奇偶転置ソートのバリエーション、または実際には、順序付けがによって定義される任意のソートアルゴリズムについてはa < b === (a != 0 && b == 0)
どうでしょうか。