Thrust库copy_if是否支持原地操作以减少设备显存分配
Thrust库copy_if原地操作相关问题解答
核心结论
你给出的第一种原地调用thrust::copy_if的写法是合法有效的,和第二种额外分配临时数组的写法最终输出结果完全等价,且能大幅降低设备端显存峰值占用,完全匹配你的核心诉求。
具体说明
- 关于原地操作的合法性:
thrust::copy_if属于顺序执行的流压缩算法,执行逻辑是从左到右遍历输入区间,每遇到一个符合谓词判断条件的元素,就按顺序写入输出迭代器指向的位置。由于写入位置的偏移永远不会超过当前遍历到的输入位置,不会出现还没读取源元素就被写入覆盖的问题,因此输入起点和输出起点相同的原地调用是被Thrust支持的,不会触发未定义行为。 - 关于两种写法的等价性:两种写法最终保留的元素集合、元素顺序完全一致。唯一的差异是第二种写法需要额外开辟一块和输入等长的设备端临时内存,峰值显存占用是输入大小的2倍;第一种原地写法不需要分配全量临时内存,仅Thrust算法内部会占用极少量的临时显存(用于存储块级前缀和、计数等临时变量,占用量远小于输入数组本身),显存开销远低于第二种写法。
- 注意适用边界:该原地使用的结论仅适用于
copy_if这类输出长度不超过输入长度、顺序遍历写入的算法,不要直接套用到其他Thrust算法上——比如普通的copy、transform等算法如果输入输出范围存在重叠,会触发未定义行为。
你给出的示例代码中存在两处占位导致的笔误,实际编写时注意修正:一是谓词中的占位符正确写法为
thrust::placeholders::_1,二是第二种写法中临时vector的元素类型需要和输入vector保持一致。
内容的提问来源于stack exchange,提问作者DysonSphere
相关产品推荐
相关产品推荐

