c++ 推力计数发生[重复]

68bkxrlz  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(124)

此问题已在此处有答案

十年前就关门了。

可能重复:

Counting occurences of numbers in cuda array
有没有一种方法可以使用Thrust或CUDA来计算数组中重复项的出现次数?
例如:
如果我有一个设备向量

{11, 11, 9, 1, 3, 11, 1, 2, 9, 1, 11}

我应该

1:3, 2:1, 3:1, 9:2, 11:4

如果Thrust不能做到这一点,我如何使用内核来做到这一点?
谢谢!我正在计算浓度。所以我才问这个问题。
假设有100000个粒子在有nx * ny * nz个细胞的域中,我需要计算每个细胞的浓度(每个细胞中有多少个粒子)。
我的内核是这样的

__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]; 
}
6ie5vjzr

6ie5vjzr1#

你可以先使用thrust::sort对向量进行排序,然后使用thrust::reduce_by_key。但是,在排序之后,您还需要创建一个1的新向量(称为values)(与排序后的向量具有相同的长度)。将这些值相加以获得计数:
reduce_by_keyreduce到键值对的推广。对于[keys_first, keys_last)范围内相等的每组连续键,reduce_by_key将该组的第一个元素复制到keys_output。使用plus减少范围中的相应值,并将结果复制到values_output

6yt4nkrj

6yt4nkrj2#

您可以使用thrust::uniquethrust::binary_search的组合来查找重复项。您无法使用这种方法在适当的位置执行此操作,但可以使用thrust代码完成此操作。

相关问题