在 CUDA 中使用标准容器作为内核输入的可能性

possibility using std container as input of a kernel in CUDA

我的代码严重依赖标准算法。是否可以通过某些接口将 std::map 的数据用作 CUDA 内核的输入?例如,使用

std::map<int, vector<float>> 

是否可以使用 GPU 在地图中搜索而不是在主机中搜索。

tl;dr:你不能这样做,即使你能这样做也无济于事。

大多数标准库容器的代码是 CPU 特定的 - 其中 none 有非 CPU 特定的部分用 __host__ __device__ 标记并编译可在内核中使用(<algorithm> 代码也是如此)。所以,从技术上讲,不。 (警告:C++20 中无处不在的 constexpring 会稍微复杂一些。)

此外,大多数这些容器在设计时并未考虑并行或并发执行:通过两个非序列化 CPU 添加或删除元素到 std::vectorstd::map或 GPU 线程很可能会导致数据损坏甚至更糟。所以,即使在 CPU.

上你也不想这样做

要记住的另一点是内存分配,这在 GPU 和 CPU 上是不同的;并且大多数情况下您希望避免 GPU 内核中的动态内存分配。

但是,您问过,使用向量图的原始 数据 而不是 code 怎么样?

好吧,如果你在主系统内存中有一个向量图数据结构,你将不会通过使用 GPU 来搜索它来获得任何加速。更一般地说,您不太可能使用独立的 GPU 来加速主内存结构的搜索:在常见的硬件平台上,CPU 为您提供比 GPU 更高的带宽和更低的主内存访问延迟,并且搜索是通常是零星的非连续内存访问,所以你的希望会落空。