使用推力进行直方图计算



如果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. 密集直方图,使用 sort 对数组进行排序,然后使用 upper_bound 确定组合直方图,最后使用 adjacent_difference 计算直方图;
  2. 稀疏直方图,使用 sort 对数组进行排序,然后reduce_by_key,正如@Eric在他的评论中提到的。

从这两个线程

  • 直方图或count_by_key图;
  • 如何从排序序列中获取直方图。

我想说的是,以上是使用推力实现直方图的仅有的两种方法。我已经在开普勒 K20c 卡上对两种方法进行了计时,这些是计时:

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

考虑到时序确实取决于输入数组这一事实,我想说结果似乎没有显着差异。

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

最新更新