1

可能重复:
计算 cuda 数组中数字的出现次数

有没有办法使用推力或 cuda 来计算数组中重复项的出现次数?

例如,如果我有一个设备向量 { 11, 11, 9, 1, 3, 11, 1, 2, 9, 1, 11} 我应该得到 1 :3 2:1 3:1 9:2, 11:4

如果推力不能做到这一点,我该如何使用内核来做到这一点?

谢谢!我正在做浓度计算。这就是我问这个问题的原因。假设在具有 nx X ny X nz 细胞的域中有 100000 个粒子,我需要计算每个细胞的浓度(每个细胞中有多少粒子)

我的内核是这个

__global__ void concentration_kernel(float3* posPtr, uint* device_cons) 
{
    __shared__ uint cache[256];
    uint x = threadIdx.x + blockIdx.x * blockDim.x;
    uint y = threadIdx.y + blockIdx.y * blockDim.y;
    uint offset = x + y * blockDim.x * gridDim.x; 

    float3 posf3 = posPtr[offset];//make_float3(43.5,55,0.66);//
    uint cellIndex = (uint)(posf3.z+1)*153*110 + (uint)(posf3.y)*153 + (uint)posf3.x;

    cache[threadIdx.x] = device_cons[cellIndex];
    __syncthreads();
    uint a = cache[threadIdx.x];
    a++;
    cache[threadIdx.x] = a;
    __syncthreads();

    device_cons[cellIndex] = cache[threadIdx.x]; 
}
4

2 回答 2

2

您可以先使用推力::sort对向量进行排序,然后使用推力::reduce_by_key。但是,您还需要在排序后创建一个 1 的新向量(称为值)(并且与排序后的向量长度相同)。这些值将相加以获得计数:

reduce_by_key is a generalization of reduce to key-value pairs. 
For each group of consecutive keys in the range [keys_first, keys_last) 
that are equal, reduce_by_key copies the first element of the group to 
the keys_output. The corresponding values in the range are reduced using 
the plus and the result copied to values_output.
于 2012-07-19T04:29:02.440 回答
1

您可以使用thrust::unique和的组合thrust::binary_search来查找重复项。您将无法使用这种方法就地完成它,但可以仅使用推力代码来完成。

于 2012-07-19T14:16:01.853 回答