CUDA Thrust reduce_by_key 使用更少的内存

CUDA Thrust reduce_by_key using less memory

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

reduction 的输出大小取决于输入数据,并且这个值在 reduction 之前通常是未知的。但是,根据您的问题,有时您知道这个尺寸。

合理的实现只需要至少 个键跨度 个元素用于输出。还有 thrust::reduce_by_key seems to be included in this list.


示例:

未排序(常见情况)

输出大小难以预测

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

reduced         3       2       1   1

已排序(最佳情况)

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

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

reduced     1           4         2

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

输出大小等于输入大小

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

另一件事是,如果您不需要输出密钥,您可以使用 thrust::discard_iterator 丢弃它们并保存一些额外的 space,如 here 所述。