有没有办法使用推力或cuda来计算数组中重复项的出现次数?
例如,如果我有一个设备矢量{11,11,9,1,3,11,1,2,9,1,11} 我应该得到1:3 2:1 3:1 9:2,11:4
如果推力无法做到这一点,我如何使用内核来做到这一点?
谢谢!我正在做浓度计算。这就是我问这个问题的原因。 假设在域中有100000个粒子具有nx X ny X 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];
}
答案 0 :(得分:2)
您可以先使用thrust::sort对矢量进行排序,然后使用thrust::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.
答案 1 :(得分:1)
您可以使用thrust::unique
和thrust::binary_search
的组合来查找重复项。使用这种方法你无法使用这种方法,但只需使用推力代码就可以完成。