【问题标题】:std::vector to array in CUDAstd::vector 到 CUDA 中的数组
【发布时间】:2013-07-08 08:50:43
【问题描述】:

有没有办法将二维向量转换为数组以便能够在 CUDA 内核中使用它?

声明为:

vector<vector<int>> information;

我想 cudaMalloc 并从主机复制到设备,最好的方法是什么?

int *d_information;
cudaMalloc((void**)&d_information, sizeof(int)*size);
cudaMemcpy(d_information, information, sizeof(int)*size, cudaMemcpyHostToDevice);

【问题讨论】:

    标签: cuda gpgpu


    【解决方案1】:

    据我了解,向量的向量不需要驻留在连续的内存中,它们可以被分段。

    根据您需要传输的内存量,我会做以下两个问题之一:

    1. 将您的记忆重新排序为单个向量,然后使用您的cudaMemcpy
    2. 创建一系列cudaMemcpyAsync,其中每个副本处理向量向量中的单个向量,然后进行同步。

    【讨论】:

      【解决方案2】:

      总之,没有。 CUDA API 不支持深度复制,也不知道std::vector 的任何信息。如果您坚持将向量向量作为宿主源,则需要执行以下操作:

      int *d_information;
      cudaMalloc((void**)&d_information, sizeof(int)*size);
      
      int *dst = d_information;
      for (std::vector<std::vector<int> >::iterator it = information.begin() ; it != information.end(); ++it) {
          int *src = &((*it)[0]);
          size_t sz = it->size();
          
          cudaMemcpy(dst, src, sizeof(int)*sz, cudaMemcpyHostToDevice);
          dst += sz;
      }
      

      [免责声明:在浏览器中编写,未经编译或测试。使用风险自负]

      这会将主机内存复制到 GPU 线性内存中的分配中,每个向量需要一个副本。如果向量的向量是一个“锯齿状”数组,您将需要在某处存储索引以供 GPU 使用。

      【讨论】:

      • 好的,所以在 CUDA 中没有 std::vector 。使用 Thrust 会有所帮助(并且容易)吗?我以前从未使用过它,但据我所知,它在某种程度上类似于 STL 库,但在 CUDA 中。有什么建议吗?
      • 不,thrust 也不支持这个。将主机数组扁平化为std::vector&lt;int&gt; 并像设备上的线性内存一样对其进行索引会更好。
      • @BRabbit27:我不知道您的编辑为什么被拒绝,它是正确的。我在浏览器中删除了该代码,当我放入免责声明时,我是认真的。
      • 是的,我分析了你提出的建议,我发现了错误并在我的代码上尝试了它,它运行良好。我知道免责声明在那里,因为你是认真的。无论如何,我更正了它,以防有人对类似的东西感兴趣,但仍应考虑免责声明。
      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2015-07-12
      • 2020-08-20
      • 2018-02-02
      相关资源
      最近更新 更多