如何使用推力将值从一个数组复制到另一个数组?

时间:2017-03-14 21:31:03

标签: c++ cuda thrust

我有一个稀疏的直方图,其中键为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有效的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一种可能的方法:

  1. 使用thrust::transform数组的两个偏移版本来标记每个段的开头

    key
  2. 标记每个细分的开头,执行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
  3. 然后可以将这些查找索引与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
  4. 这是一个有效的例子:

    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);