2010-03-16 53 views
0

我正在玩cuda。通过CUDA上的多个线程使用设备变量

此刻我有一个问题。我正在测试一个特定的响应大数组,并且当我得到响应时,我必须将数据复制到另一个数组。

例如,我的5种元素的测试阵列看起来像这样:
[] [] [V1] [] [] [V2]

结果必须是这样的:
[V1] [V2 ]

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

我想声明的设备变量int 地址 = 0。每当我找到一个回答,我将递增地址。但我不确定,因为这意味着addr可能会被多个线程同时访问。会导致问题吗?或者线程会等到另一个线程完成使用该变量?

回答

1

并不像看起来那么微不足道。我刚刚完成实施一个,我可以告诉你需要什么 阅读scan Gpu Gems 3 Article特别是章节39.3.1流压实

要从SDK中的LargeArrayScan示例实现您自己的开始,它将为您提供预扫描。假设你有在设备存储器中的选择阵列(1和0的含义1-阵列选择0 - 丢弃),dev_selection_array一个dev_elements_array元件要选择的dev_prescan_arraydev_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

玩得开心!

0

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