我有一个稀疏的直方图,其中键为bin,值为count。我想使用直方图中的键和计数来创建另一个键值数组。此数组中的键是二进制数,但重复计数次数,最后每个键的值等于相应的计数。直方图和数组中的键按升序排序。
例如,如果直方图看起来像这样:
Key/Bins: 0 2 4 5 6 7
Values/Counts: 3 2 1 4 2 3
我希望找到其值的键数组如下所示:
Key: 0 0 0 2 2 4 5 5 5 5 6 6 7 7 7
使用直方图填充值后,新的键值数组 看起来像这样:
Key: 0 0 0 2 2 4 5 5 5 5 6 6 7 7 7
Values: 3 3 3 2 2 1 4 4 4 4 2 2 3 3 3
我可以使用循环并检查两个键是否相同但是使用Thrust有效的方法吗?
谢谢!
答案 0 :(得分:1)
这是一种可能的方法:
使用thrust::transform
数组的两个偏移版本来标记每个段的开头
key
标记每个细分的开头,执行Key: 0 0 0 2 2 4 5 5 5 5 6 6 7 7 7
seg: 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0
将细分标记转换为一组查找索引
thrust::inclusive_scan
然后可以将这些查找索引与Key: 0 0 0 2 2 4 5 5 5 5 6 6 7 7 7
seg: 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0
idx: 0 0 0 1 1 2 3 3 3 3 4 4 5 5 5
一起使用,将索引值从values / counts数组复制到所需的输出
thrust::permutation_iterator
这是一个有效的例子:
Key: 0 0 0 2 2 4 5 5 5 5 6 6 7 7 7
seg: 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0
idx: 0 0 0 1 1 2 3 3 3 3 4 4 5 5 5
Val: 3 3 3 2 2 1 4 4 4 4 2 2 3 3 3
推力优化的一个典型例子是寻找" fusion"的运作。在这种情况下,由于我们有一个转换操作,紧接着是一个包容性扫描,一个简单的融合示例就是用thrust::transform_inclusive_scan
替换它们
答案 1 :(得分:1)
您似乎正在GPU中进行表查找。这是使用CUDA在GPU上使用cuckoo哈希的实现。 https://github.com/shixing/cuckoo/tree/master
构建过程在CPU上实现:
create_hash_cpu(h_keys,h_values,h_key_1,h_key_2,h_value_1,h_value_2,N,EMPTY_KEY);
查找过程在GPU上:
cuckoo_lookup<<<(M + 255)/ 256,256>>>(d_keys_lookup,d_values_lookup,d_key_1,d_value_1,d_key_2,d_value_2,M,N,EMPTY_KEY,EMPTY_VALUE);