CUDA使用更少的内存推动reduce_by_key

aat*_*ish 2 c++ cuda thrust

我正在尝试减少为我的用例计算reduce_by_key所需的内存.与值的数量(约1600万)相比,我有一个相对较少的唯一键(大约100-150).按键缩减示例显示分配给包含结果的device_vectors与输入的大小相同.是否总是有必要这样做?是否可以只分配尽可能多的内存来包含正确的输出?

Iva*_*rop 5

减少的输出大小取决于输入数据,并且在减少之前通常不知道该值.但是,根据您的问题,有时您会知道这个尺寸.

合理的实现只需要至少数量的键跨度元素用于输出.并且thrust::reduce_by_key 似乎包含在此列表中.


例子:

未分类(常见情况)

输出大小很难预测

keys        2   2   2   3   3   2   1
values      1   1   1   1   1   1   1
           |----------|------|----|---|
                    4 spans

reduced         3       2       1   1
Run Code Online (Sandbox Code Playgroud)

排序(最好的情况)

输出大小等于唯一键的数量

keys        1   2   2   2   2   3   3
values      1   1   1   1   1   1   1
           |--|---------------|------|
                    3 spans

reduced     1           4         2
Run Code Online (Sandbox Code Playgroud)

交错,没有相邻的键重复(最坏的情况)

输出大小等于输入大小

keys        1   2   3   1   2   3   1
values      1   1   1   1   1   1   1
           |--|---|---|---|---|---|--|
                    7 spans

reduced     1   1   1   1   1   1   1
Run Code Online (Sandbox Code Playgroud)

另一件事是,如果你不需要按键输出,你可以用放弃他们thrust::discard_iterator和节省一些额外的空间,如所描述这里.