std :: vector to CUDA中的数组

时间:2013-07-10 12:15:02

标签: cuda gpgpu

有没有办法将2D矢量转换为数组,以便能够在CUDA内核中使用它?

声明为:

vector<vector<int>> information;

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

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

2 个答案:

答案 0 :(得分:3)

总之,没有。 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使用。

答案 1 :(得分:2)

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

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

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