如果i
是像下面这样的随机游走(每个索引不是唯一的),并且有一个A
用零填充的设备向量。
{0, 1, 0, 2, 3, 3, ....}
Run Code Online (Sandbox Code Playgroud)
推力是否可以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}
Run Code Online (Sandbox Code Playgroud)
我试过几种情况,但这些情况只在A
宿主向量时工作正常,我猜是因为推力是并行的,所以以前的结果不能影响新的结果,结果可能看起来像 //only count once no索引出现多少次{1, 1, 1, 1}
推力可以通过设备向量 A 和随机游走索引向量实现我的目标吗?
如果您正在寻求 Thrust 的直方图计算,那么您可能希望注意,有一个Thrust 文档示例提供了两种不同的算法:
sort
对数组进行排序,然后用于upper_bound
确定计算直方图,最后用于adjacent_difference
计算直方图;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 示例提供了直方图计算示例,但它针对64
或256
bin 进行了优化,因此它与上述 Thrust 代码并不同质。