并不像看起来那么简单。我刚刚完成了一个,我可以告诉你需要什么
阅读scan Gpu Gems 3 Article 的特别章节39.3.1 Stream Compaction。
从 SDK 中的 LargeArrayScan 示例开始实现您自己的开始,这将为您提供预扫描。假设您在设备内存中有选择数组(1 和 0 的数组表示 1-选择 0-丢弃), dev_selection_array 一个 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
玩得开心!