vector - CUDA 内核中的 STD 类

标签 vector std cuda

我知道在 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/

相关文章:

c++ - 为什么 std::vector 不使用偏移量?

c++ - 拥有 std::map 的最佳方法,如果没有 key ,我可以在其中定义返回的内容?

c++ - vector push_back 和析构函数(?): push_back(~Dword(0))

在查找数组的最大元素时比较 2 种不同架构上的 2 种不同场景

linux - opencv cuda程序编译报错

cuda - FFMPEG 是否使用 CUDA 或任何其他硬件加速?

c++ vector 和数组使用相同的txt文件

matlab - 在 3d 中绘制法向量

c++ - 填充指向 vector 的指针 vector 会产生奇怪的结果

c++ - std::endl 导致崩溃