algorithm - 在 CUDA 中使用 std 容器作为内核输入的可能性
问题描述
我的代码严重依赖标准算法。是否可以通过某些接口将 std::map 的数据用作 CUDA 内核的输入?例如,与
std::map<int, vector<float>>
是否可以使用 GPU 在地图中进行搜索,而不是在主机中进行搜索。
解决方案
tl; dr:你不能这样做,如果可以的话,它不会帮助你。
__host__ __device__
大多数标准库容器的代码都是特定于 CPU 的——它们都没有标记和编译为可在内核中使用的非 CPU 特定部分(<algorithm>
代码也是如此)。所以,从技术上讲,没有。(警告:在无处不在的 C++20 中,事情会稍微复杂一些constexpr
。)
此外,这些容器中的大多数在设计时都没有考虑并行或并发执行:通过两个非序列化 CPU 或 GPU 线程向一个std::vector
或一个或一个添加或删除元素很可能会导致数据损坏,甚至可能更糟。std::map
因此,即使在 CPU 上,您也不想这样做。
要记住的另一点是内存分配,它在 GPU 和 CPU 上以不同的方式完成。并且大多数情况下您希望避免在 GPU 内核中进行动态内存分配。
但是,您问,使用向量图的原始数据而不是代码呢?
好吧,如果您在主系统内存中有一个向量图数据结构,那么使用 GPU 搜索它不会获得任何加速。更一般地说,您不太可能使用离散 GPU 来加快主内存结构的搜索速度:在常见的硬件平台上,CPU 为您提供比 GPU 更高的带宽和更低的主内存访问延迟,并且搜索通常是关于零星的非- 连续的内存访问,所以你的希望会落空。
推荐阅读
- python - Django - calling function does not redirect
- python - 如何将信息从 GUI 发送到 Excel 电子表格?下面是我的代码
- sql - 我可以使用 SQL 构建包含系列的 Access 图表吗?
- python-3.x - 如何为python构建一个Web应用程序>?
- php - 使 /storage 文件夹在 laravel 中公开可用
- windows - Windows 认为 Sublime Text 是什么用户或组?
- build - 有没有办法让 Bazel 与传递存储库一起工作?
- ruby-on-rails - 删除附件时跳过 ActiveStorage 文件清除
- c - 有符号位域的多个不一致行为
- c# - C# ASP.NET Core - Data.Annotations - 特定电子邮件的正则表达式