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在评论中提到的那样- )李>
<代码>#箱子=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内核代码都可以!但我仍然有兴趣知道当使用设备时推力能达到多快?