我正在尝试减少为我的用例计算reduce_by_key所需的内存。与值的数量(大约 1600 万个)相比,我的唯一键数量相对较少(大约 100-150 个)。按键减少example显示分配用于包含结果的 device_vectors 的大小与输入的大小相同。总是有必要这样做吗?是否可以只分配包含正确输出所需的内存?
最佳答案
缩减的输出大小取决于输入数据,并且在缩减之前通常不知道该值。但是,根据您的问题,有时您知道这个大小。
合理的实现仅需要至少数量的键跨度元素来输出。和 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
另一件事是,如果您不需要输出 key ,您可以使用 thrust::discard_iterator
丢弃它们并节省一些额外的空间,如所述 here .
关于c++ - CUDA Thrust reduce_by_key 使用更少的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235288/