在CUDA中将std::vector转换为数组

3

有没有一种方法可以将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个回答

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上存储索引以供使用。


好的,所以在CUDA中没有std :: vector的方法。使用Thrust是否有帮助(并且容易)?我以前从未使用过它,但据我所读,它与STL库类似,但在CUDA中。有什么建议吗? - BRabbit27
2
不,thrust也不支持这个。你最好将主机数组展平成一个std::vector<int>,并像在设备上线性访问内存一样对其进行索引。 - talonmies
@BRabbit27: 我不知道你的编辑为什么被拒绝了,它是正确的。我在浏览器中匆忙编写了那段代码,当我加上免责声明时,我真的是这个意思。 - talonmies
是的,我分析了你提出的建议,找到了错误并在我的代码中尝试了一下,结果它起作用了。我知道免责声明存在是因为你是有意这样做的。无论如何,我已经纠正了它以便其他人可以使用,但仍应考虑免责声明。 - BRabbit27

2
据我所知,向量的向量不需要驻留在连续的内存中,即它们可以是分散的。
根据您需要传输的内存量,我建议您采取以下两种方法之一:
1. 重新排列内存以成为单个向量,然后使用cudaMemcpy。 2. 创建一系列cudaMemcpyAsync,其中每个复制处理向量的一个单独部分,然后进行同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接