Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 带推力的直方图计算_Cuda_Thrust - Fatal编程技术网

Cuda 带推力的直方图计算

Cuda 带推力的直方图计算,cuda,thrust,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} 我试过几个例子,但是这些例子只有当

如果
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和随机游动索引向量,推力能否实现我的目标?

如果您正在通过推力进行直方图计算,那么您可能希望注意,有一种方法提供了两种不同的算法:

  • 密集直方图,使用
    排序
    对数组进行排序,然后使用
    上限
    确定累积直方图,最后使用
    相邻差值
    计算直方图
  • 稀疏直方图,使用
    排序
    对数组排序,然后
    按_键减少
    ,正如@Eric在评论中提到的那样
  • 从这两个线程

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

    • N=1024*16
      <代码>#箱子=
      16*16
      ;密集=
      2.0ms
      ;稀疏=
      2.4ms
    • N=1024*128
      <代码>#箱子=
      16*128
      ;密集=
      3.4ms
      ;稀疏=
      3.1ms
    考虑到计时确实取决于输入数组,我想说的是,结果似乎没有显著的不同


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

    推力::sort then推力::reduce_by_key我尝试过排序,但性能不够好,所以现在我使用“主机向量+直方图”方法来实现我的目标。新方法(包含devicehost开销)的执行时间比排序版本短。我对更好的分辨率很感兴趣,并在这里提问。您需要使用推力吗?使用推力或cuda内核代码都可以!但我仍然有兴趣知道当使用设备时推力能达到多快?