并不像看起来那么琐碎。我刚刚完成了一个,我可以告诉你需要什么阅读扫描 Gpu Gems 3 文章,特别是第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
玩得开心!