見た目ほど些細なことではありません。実装が完了したばかりで、スキャンGpu Gems 3の記事、特に39.3.1StreamCompactionの章を読む必要があることがわかります。
SDKのLargeArrayScanの例から独自の開始を実装するには、プレスキャンのみを実行します。デバイスメモリに選択配列(1と0の配列は1-選択0-破棄を意味します)があると仮定すると、dev_selection_array 、選択されるdev_elements_array要素、すべてサイズNのdev_prescan_arrayとdev_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を参照してください。
楽しむ!