我正在和库达一起玩。

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

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

结果必须像这样:
V1] [V2

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

我正在考虑声明设备变量int addr = 0。每次我找到答复时,我都会增加 addr. 。但是我不确定这一点,因为这意味着 addr 可以同时通过多个线程访问。那会引起问题吗?还是线程会等到使用该变量完成另一个线程完成?

有帮助吗?

解决方案

并不像看起来那么微不足道。我刚刚完成了一个,我可以告诉您您需要阅读的内容 扫描GPU宝石3文章 特别是章节 39.3.1流压实.

要从SDK中的LargeArrayscan示例实现自己的起点,这将为您提供Prescan。假设您在设备内存中具有选择数组(1和0的数组含义1-选择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];
}
}

有关Prescan的其他不错的应用,请参阅论文 Ble93

玩得开心!

其他提示

您正在谈论经典的流压实。通常,我建议看 推力 或者 cudpp (这些链接转到压实文档)。这两个都是开源的,如果您想滚动,我还建议您查看“扫描” SDK样本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top