Arrays CUDA阵列/矢量删除

Arrays CUDA阵列/矢量删除,arrays,vector,cuda,Arrays,Vector,Cuda,我是CUDA的新手,正在尝试编写自己的内核 在CPU端,我有一系列包含int的向量(一个向量/GPU线程) 我希望每个GPU线程从其向量中删除一些元素,然后将这些元素复制回主机。在CPU端,可比较的操作为: vector.erase(element_number); 我的理解是,GPU不支持stl类型向量,我真的不能使用推力(因为我使用的是我自己的内核) 但是,我可以将CPU向量转换为数组(包括元素数量的数据),然后将数组复制到GPU。然后,如果我确定要删除的元素,我可以将下面的所有元素向上移

我是CUDA的新手,正在尝试编写自己的内核

在CPU端,我有一系列包含int的向量(一个向量/GPU线程)

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

vector.erase(element_number);
我的理解是,GPU不支持stl类型向量,我真的不能使用推力(因为我使用的是我自己的内核)

但是,我可以将CPU向量转换为数组(包括元素数量的数据),然后将数组复制到GPU。然后,如果我确定要删除的元素,我可以将下面的所有元素向上移动,并减少元素总数


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

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


如果您不关心向量中元素的顺序,您可以通过将要擦除的元素与向量中的最后一个元素交换,然后减小大小来实现擦除操作,而不是移动所有元素。

CUDA中没有内置任何提供向量操作或数组操作的功能。虽然这样的操作对程序员来说似乎很方便,但它们的性能并不是特别高,因此您可能希望提出一种不同的数据管理方案,它不需要那种插入/删除操作。谢谢您的回复。我明白这并没有充分利用GPU。底层算法强制您按顺序完成这一部分。尽管如此,由于数百/数千个线程将同时运行,这应该仍然比CPU版本快得多。这里的向量对应于OpenCV轮廓点,因此,您需要保留向量顺序以保持轮廓完整性。仍然有很多方法可以避免像这样逐个移动向量元素的痛苦过程。一个简单的间接方案可以奏效。如果偶尔有意义,您可以使用聚集方法恢复向量顺序。根据您的实际使用情况,这些方法可能比盲目使用向量插入/删除要有效得多。是否有您正在考虑的特定间接方案?考虑到元素只是int,非常简单的元素可能不起作用,因为节省的复制时间只会转移到元素访问所花费的时间(因为您必须计算位置)。从某种意义上讲,这些向量可能有2000个元素要开始,但随后会减少到总共20个元素。我正在使用的哑巴方案开始时速度很慢,但在删除元素后速度会加快。