在CUDA上使用多个线程的设备变量

时间:2010-03-16 04:43:23

标签: cuda race-condition

我正在玩cuda。

目前我遇到了问题。我正在为特定的响应测试一个大型数组,当我得到响应时,我必须将数据复制到另一个数组上。

例如,我的5个元素的测试数组如下所示:
[] [] [v1] [] [] [v2]

结果必须如下所示:
[V1] [V2]

问题是如何计算存储结果的第二个数组的地址?第一个数组的所有元素都是并行检查的。

我想要声明一个设备变量int addr = 0.每次找到响应时,我都会增加 addr 。但我不确定,因为这意味着多个线程可以同时访问 addr 。这会引起问题吗?或者线程是否会等到另一个线程完成使用该变量?

2 个答案:

答案 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)

你在谈论经典的流压缩。通常我建议查看ThrustCUDPP(这些链接转到压缩文档)。这两个都是开源的,如果你想自己滚动,那么我也建议你看一下'扫描'SDK样本。