2017-03-16 187 views
1

我是CUDA的新手,正在尝试编写自己的内核。CUDA数组/矢量删除

在CPU方面,我有一系列包含整数(一个向量/ GPU线程)的向量。

我希望每个GPU线程从其向量中移除一些元素,然后我将其复制回主机。在CPU方面可比的操作是:

vector.erase(element_number); 

我的理解是,STL型矢量不支持GPU,我真的不能使用推力(因为我用我自己的内核)。但是,我可以将CPU向量转换为数组(包括元素数量的数据),然后将这些数组复制到GPU。然后,如果我确定了一个要删除的元素,我可以将下面的所有元素向上移动并减少元素的总数。

在我重新创建轮子并写入之前,我的问题是:是否有一些CUDA支持的操作已经这样做?

+1

CUDA没有内置任何内容提供像这样的矢量操作或数组操作。虽然这样的操作对程序员来说似乎很方便,但它们并不是特别高的性能,所以你可能想要提出一种不需要这种插入/删除操作的不同的数据管理方案。 –

回答

1

不是。您必须按照您描述的方式编写自己的矢量类。

如果您不关心矢量中元素的顺序,可以通过交换要删除的元素和矢量中的最后一个元素来实现删除操作,然后递减大小而不是移动一切。

+0

感谢您的回复。我知道这不能充分利用GPU。底层算法强制您按顺序执行此部分。尽管如此,因为数百/数千个线程将同时运行,所以这应该仍然比CPU版本快得多。这里的向量对应于OpenCV轮廓点因此,您需要保持向量顺序以保持轮廓完整性。 – user1805103

+0

还有很多方法可以避免像这样一个接一个地移动矢量元素的痛苦过程。一个简单的间接方案可以工作。如果它偶尔有意义,你可以使用收集方法恢复向量顺序。根据您的实际使用情况,这些可能比仅仅使用向量插入/删除更有效。 –

+0

你有没有一种特定的间接方案?由于元素只是整数,所以非常简单的元素可能无法工作,因为节省的复制时间只是转移到元素访问花费的时间(因为您必须计算位置)。为了说明一下,这些矢量可能有2000个元素,但是最终会减少到20个。我正在使用的愚蠢计划开始缓慢,但随着元素被移除而加速。 – user1805103