推力计数发生

thrust count occurence

本文关键字:      更新时间:2023-10-16

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

有没有办法使用 推力 或 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]; 
}

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

reduce_by_keyreduce对键值对的推广。对于范围[keys_first, keys_last)范围内的每组连续键相等,reduce_by_key将组的第一个元素复制到keys_output .范围内的相应值使用plus和结果复制到values_output .

您可以使用 thrust::uniquethrust::binary_search 的组合来查找重复项。使用此方法将无法就地执行此操作,但只需使用推力代码即可完成。

相关文章:
  • 没有找到相关文章