计算CUDA数组中数字的出现次数

Pat*_*rik 7 cuda thrust

我有一个存储在GPU上的无符号整数数组,带有CUDA(通常是1000000元素).我想计算数组中每个数字的出现次数.只有少数不同的数字(约10),但这些数字可以从1到1 1000000.关于9/10这些数字0,我不需要它们的数量.结果看起来像这样:

58458 -> 1000 occurrences
15 -> 412 occurrences
Run Code Online (Sandbox Code Playgroud)

我有一个使用atomicAdds 的实现,但它太慢(许多线程写入相同的地址).有人知道快速/有效的方法吗?

Jar*_*ock 7

您可以通过首先对数字进行排序,然后进行键控缩减来实现直方图.

最直接的方法是使用thrust::sort然后thrust::reduce_by_key.它通常比基于原子的ad hoc binning快得多.这是一个例子.