首页 > 解决方案 > 在 CUDA 中使用 std 容器作为内核输入的可能性

问题描述

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

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

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

标签: algorithmcudastd

解决方案


tl; dr:你不能这样做,如果可以的话,它不会帮助你。

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

此外,这些容器中的大多数在设计时都没有考虑并行或并发执行:通过两个非序列化 CPU 或 GPU 线程向一个std::vector或一个或一个添加或删除元素很可能会导致数据损坏,甚至可能更糟。std::map因此,即使在 CPU 上,您也不想这样做。

要记住的另一点是内存分配,它在 GPU 和 CPU 上以不同的方式完成。并且大多数情况下您希望避免在 GPU 内核中进行动态内存分配。

但是,您问,使用向量图的原始数据而不是代码呢?

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


推荐阅读