0

我在玩cuda。

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

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

结果必须如下所示:
[v1][v2]

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

我正在考虑声明一个设备变量 int addr = 0。每次找到响应时,我都会增加addr。但我不确定,因为这意味着addr可能同时被多个线程访问。这会导致问题吗?或者线程会等到另一个线程完成使用该变量吗?

4

2 回答 2

1

并不像看起来那么琐碎。我刚刚完成了一个,我可以告诉你需要什么阅读扫描 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

玩得开心!

于 2010-03-19T17:27:18.630 回答
0

你说的是经典的流压缩。一般来说,我建议查看ThrustCUDPP(这些链接转到压缩文档)。这两个都是开源的,如果你想自己动手,那么我还建议查看“扫描”SDK 示例。

于 2010-03-16T07:54:27.070 回答