我知道在 CUDA 内核中无法使用 std 类,例如字符串、向量、映射或集合。然而,没有它们就很不舒服。我必须在 CUDA 内核中编写大量代码,所以我想至少使用字符串和向量。我不是在谈论诸如推力之类的东西。我希望能够写出这样的东西:
__global__ void kernel()
{
cuda_vector<int> a;
for(int i=0;i<10;i++)
a.push_back(i);
}
int main()
{
kernel<<<1,512>>>();
return 0;
}
这应该创建 512 个线程,在每个线程中我想创建 cuda_vector 类并将其用作 std::vector。我在互联网上没有找到任何解决方案,我开始编写自己的类(class)。这个类的每个函数都被定义为“__ host __”和“__ device __”函数,这样我就可以在CPU和GPU上使用它。 理论上是可以实现的,但只能在费米架构上实现。因为,我们需要动态分配内存。我有 GTX 580 并开始编写自己的 Vector。但很累,需要很多时间。没有我可以使用的实现吗?我不敢相信没有。这么多软件开发人员在没有 CUDA 的情况下编写代码吗?没有人尝试编写他/她自己的版本?
最佳答案
你找不到像 cuda 的 std::vector 这样的东西的原因是性能。您的传统矢量对象不太适合 CUDA 模型。如果您计划仅使用 512 个线程,并且每个线程都管理一个类似 std::vector 的对象,那么您的性能将比在 CPU 上运行相同的代码更差。
GPU 线程与 CPU 线程不同,它们应该尽可能轻。使用线程 block 和共享内存让线程进行协作。如果您正在操作字符串,则每个线程应该处理一个字符,如果您在 CPU 中使用向量,则将其数组传递给 GPU,并让每个线程处理一个元素。基本上,考虑如何使用 CUDA 编程模型解决问题,而不是使用 CPU 方法解决问题,然后将其转换为 CUDA。
关于vector - CUDA 内核中的 STD 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8151442/