2

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

它被声明为:

vector<vector<int>> information;

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

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

2 回答 2

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 使用。

于 2013-07-10T12:33:38.117 回答
2

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

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

  1. 将您的记忆重新排序为单个向量,然后使用您的cudaMemcpy.
  2. 创建一系列cudaMemcpyAsync,其中每个副本处理向量向量中的单个向量,然后同步。
于 2013-07-10T12:29:07.440 回答