【问题标题】:Histogram calculation with Thrust使用推力计算直方图
【发布时间】:2013-02-01 08:40:38
【问题描述】:

如果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}

thrust 可以用设备向量 A 和随机游走索引向量实现我的目标吗?

【问题讨论】:

  • thrust::sort 然后thrust::reduce_by_key
  • 我尝试了排序,但性能不够好,所以现在我使用“宿主向量+直方图”的方法来实现我的目标。新方法(包含设备主机开销)的执行时间比排序版本短。我对更好的解决方案很感兴趣,并在这里询问。
  • 需要使用推力吗?
  • 使用thrust或者cuda内核代码都可以!但是我仍然很想知道 Thrust 在使用 device_vector 时能达到多快?

标签: cuda thrust


【解决方案1】:

如果您正在通过 Thrust 寻求直方图计算,那么您可能需要注意,有一个 Thrust documentation example 提供两种不同的算法:

  1. 密集直方图,使用sort对数组进行排序,然后使用upper_bound确定一个累积直方图,最后使用adjacent_difference计算直方图;
  2. 稀疏直方图,使用sort 对数组进行排序,然后使用reduce_by_key,正如@Eric 在他的评论中提到的那样。

来自这两个线程

我想说,以上是使用 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 bins 进行了优化,因此与上述推力代码不齐。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2012-06-09
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多