2

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

4

1 回答 1

1

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

对于您的示例,您应该能够简单地调用resize(3)而不必担心发生重新分配。

于 2013-05-22T17:28:42.813 回答