【问题标题】:CUDA array/vector deleteCUDA 数组/向量删除
【发布时间】:2017-08-08 02:39:30
【问题描述】:

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

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

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

vector.erase(element_number);

我的理解是GPU不支持stl类型向量,我真的不能用Thrust(因为我用的是自己的内核)。

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

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

【问题讨论】:

  • CUDA 中没有内置任何东西来提供类似的向量操作或数组操作。尽管这些操作对程序员来说似乎很方便,但它们的性能并不是特别高,因此您可能想提出一种不需要那种插入/删除操作的不同数据管理方案。

标签: arrays vector cuda


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我知道这并没有充分利用 GPU。底层算法强制您按顺序执行此部分。尽管如此,由于成百上千的线程将同时运行,这仍然应该比 CPU 版本快得多。这里的向量对应于 OpenCV 轮廓点因此,您需要保留向量顺序以保持轮廓完整性。
  • 仍然有很多方法可以避免像这样一个一个地移动矢量元素的痛苦过程。一个简单的间接方案可以工作。如果它偶尔有意义,您可以使用收集方法恢复向量顺序。根据您的实际用例,这些可能比盲目地使用向量插入/删除更有效。
  • 您是否正在考虑特定的间接方案?鉴于元素只是整数,非常简单的元素可能不起作用,因为节省的复制时间只是转移到了进行元素访问所花费的时间(因为您必须计算位置)。从某种意义上说,这些向量一开始可能有 2,000 个元素,但后来总共减少到 20 个。我使用的愚蠢方案一开始很慢,但随着元素的删除而加快。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 2015-08-09
  • 2016-08-26
  • 2016-03-08
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多