Не так тривиально, как кажется. Я только что закончил, чтобы реализовать один, и я могу сказать, что вам нужно
прочитайте статью scan Gpu Gems 3 , в частности главу 39.3.1 Сжатие потока .
Для реализации собственного запуска из примера LargeArrayScan в SDK, который даст вам только предварительное сканирование. Предполагая, что у вас есть массив выбора в памяти устройства (массив 1 и 0, означающий 1 - выберите 0 - отбросьте), dev_selection_array a dev_elements_array элементов для выбора dev_prescan_array и 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];
}
}
для другого хорошего применения предварительного сканирования см. Бумагу Ble93
Веселись!