我正在玩cuda。
目前我遇到了问题。我正在为特定的响应测试一个大型数组,当我得到响应时,我必须将数据复制到另一个数组上。
例如,我的5个元素的测试数组如下所示:
[] [] [v1] [] [] [v2]
结果必须如下所示:
[V1] [V2]
问题是如何计算存储结果的第二个数组的地址?第一个数组的所有元素都是并行检查的。
我想要声明一个设备变量int addr = 0.每次找到响应时,我都会增加 addr 。但我不确定,因为这意味着多个线程可以同时访问 addr 。这会引起问题吗?或者线程是否会等到另一个线程完成使用该变量?
答案 0 :(得分:1)
不像看起来那么微不足道。我刚刚完成了一个,我可以告诉你需要什么 请阅读scan Gpu Gems 3 Article特定章节 39.3.1流压缩。
要从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
玩得开心!
答案 1 :(得分:0)