我正在使用device_vector
来存储有关用户输入数据数组的信息。当我调用运行主算法的第二个内核时,这个信息是必要的,以加快速度。
在第一个内核结束后,device_vector
将只包含少量重要元素。因此,例如,如果最初device_vector
的大小为10000,那么只有10-20个元素将描述用户输入数据。
我现在正在做的是,我使用函数thrust::remove
来删除不必要的值,但是如果我理解正确,这个函数并没有真正删除不必要的值,而是返回一个迭代器到最后一个必要的价值。
例如假设我们有这个数组:
0 0 0 0 0 5 0 0 8 0 0 0 0 13 0 0
如果我将remove
称为值0,它将执行以下操作:
5 8 13 0 0 0 0 0 0 0 0 0 0 0 0 0
它会将end
迭代器返回到最后一个必要元素,在我的例子中是13。
但是,我想将这些信息用于第二个内核,如果我理解正确,仍然会分配不必要的元素,所以我会使用我不需要的内存。
我的问题是,通过将end
迭代器放到最后一个必要元素上,可以在不使用resize
的情况下删除不必要的元素吗?
resize
效率不高,因为它删除了所有元素,并为必要的元素分配内存,但内存已经分配,所以我没有看到这样做的重点。
答案 0 :(得分:1)
device_vector::resize
不一定会导致在收缩事件时发生重新分配。允许这样做,但从Thrust 1.8开始,当前的实现没有。
对于您的示例,您应该只需致电resize(3)
,而无需担心重新分配。