使用推力计算直方图

时间:2013-02-01 08:40:39

标签: cuda thrust

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

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

在操作A[i]看起来像

之后,推力是否可能使A自动递增?
//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和随机游走索引矢量来实现我的目标吗?

1 个答案:

答案 0 :(得分:2)

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

  1. 密集直方图,使用sort对数组进行排序,然后使用upper_bound确定一个推理直方图,最后使用adjacent_difference来计算直方图; < / LI>
  2. 稀疏直方图,使用sort对数组进行排序,然后使用reduce_by_key,如@Eric在评论中所述。
  3. 从这两个线程

    我想说上面是使用Thrust实现直方图的唯一两种方法。我已经在Kepler K20c卡上计算了两种方法,这些都是时机:

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

    考虑到时间确实取决于输入数组的事实,我会说结果看起来并没有显着不同。

    应该注意的是,CUDA样本提供了直方图计算示例,但它针对64256个bin进行了优化,因此它与上述Thrust代码不同。