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 所述。
我正在尝试减少为我的用例计算 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 所述。