cuda – 使用推力计算直方图

如果我是如下所示的随机游走(每个索引不是唯一的),并且有一个设备向量A用零填充.

{0, 1, 0, 2, 3, 3,  ....}

在操作A可能看起来之后,推力是否有可能使A [i]自动递增

//2 means appears count of 0's
//1 means appears count of 1's
//1 means appears count of 2's
//2 means appears count of 3's
{2, 1, 1, 2}

我曾经尝试了几种情况,但这些情况只有在A是主机矢量时才能正常工作,我想因为推力做并行,以前的结果不能影响新的,结果可能看起来像
    //只计算一次,无论索引出现多少次
    {1,1,1,1}

可以通过设备矢量A和随机游走索引向量来实现我的目标吗?

最佳答案 如果您正在通过Thrust寻求直方图计算,那么您可能希望注意到有一个
Thrust documentation example提供了两种不同的算法:

>密集直方图,使用sort对数组进行排序,然后使用upper_bound确定一个组合直方图,最后使用adjacent_difference计算直方图;
>稀疏直方图,使用排序对数组进行排序,然后使用reduce_by_key,如@Eric在其评论中所述.

从这两个线程

> histogram or count_by_key;
> How to obtain a histogram from a sorted sequence.

我会说上面是使用Thrust实现直方图的唯一两种方法.我已经在Kepler K20c卡上设置了两种方法,这些都是时间:

> N = 1024 * 16; #bins = 16 * 16;密集= 2.0毫秒;稀疏= 2.4ms;
> N = 1024 * 128; #bins = 16 * 128;密集= 3.4ms;稀疏= 3.1ms;

考虑到时间确实取决于输入数组的事实,我会说结果似乎没有显着不同.

应该注意的是,CUDA样本提供了直方图计算示例,但它针对64或256个区间进行了优化,因此它与上述推力代码不同.

点赞