8

CUDA を使用して配列からゼロ値を並列に効率的に削除するにはどうすればよいですか。ゼロ値の数に関する情報は事前に入手できるため、このタスクは簡単になります。

結果の配列にコピーするときは、番号がソース配列と同じ順序のままであることが重要です。


例:

配列には、たとえば次の値が含まれます: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] 5 つの値がゼロであるという追加情報。望ましい最終結果は、[19, 7, 3, 5, 1] を含む別の配列になります。

4

3 に答える 3

7

配列からいくつかの要素を削除するには、Thrust Library の並べ替え操作を使用できます。ゼロ値is_not_zeroを返すpredicateを指定すると、次のように操作を記述できます。falsetrue

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

于 2012-09-17T19:33:06.037 に答える
0

奇偶転置ソートのバリエーション、または実際には、順序付けがによって定義される任意のソートアルゴリズムについてはa < b === (a != 0 && b == 0)どうでしょうか。

于 2012-09-17T19:45:43.107 に答える