对于我的应用程序,我必须处理一堆对象(比如说int
s),这些对象随后被划分并分类到更小的桶中。为此,我将元素存储在一个连续的数组中
arr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14...}
并且有关桶(子列表)的信息由各个桶中第一个元素的偏移量和子列表的长度给出。
因此,例如,给定
offsets = {0,3,8,..}
sublist_lengths = {3,5,2,...}
将导致以下分裂:
0 1 2 || 3 4 5 6 7 || 8 9 || ...
我正在寻找的是一种通用且有效的方法来运行算法,如减少,仅使用自定义内核或thrust
库在桶上。对桶求和应该给出:
3 || 25 || 17 || ...
我想出了什么:
选项 1:自定义内核需要大量修改、复制到共享内存、正确选择块和网格大小以及自己的算法实现,如扫描、减少等。此外,每个操作都需要自己的自定义核心。一般来说,我很清楚如何做到这一点,但在
thrust
过去几天使用之后,我的印象是可能有更聪明的方法选项 2:从偏移量生成一个键数组(
{0,0,0,1,1,1,1,1,2,2,3,...}
在上面的示例中)并使用thrust::reduce_by_key
. 不过,我不喜欢额外的列表生成。选项 3:
thrust::transform_iterator
与 一起使用thrust::counting_iterator
以即时生成上述给定的密钥列表。不幸的是,我想不出一个不需要增加设备上偏移列表的索引并破坏并行性的实现。
实现这一点的最明智的方法是什么?