是否可以在不使用resize的情况下为thrust :: device_vector的N个最后元素释放内存?

时间:2013-05-21 13:52:06

标签: cuda gpu thrust gpu-programming

我正在使用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效率不高,因为它删除了所有元素,并为必要的元素分配内存,但内存已经分配,​​所以我没有看到这样做的重点。

1 个答案:

答案 0 :(得分:1)

device_vector::resize不一定会导致在收缩事件时发生重新分配。允许这样做,但从Thrust 1.8开始,当前的实现没有。

对于您的示例,您应该只需致电resize(3),而无需担心重新分配。