有没有办法将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);
答案 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)
据我了解,矢量矢量不需要驻留在连续的存储器中,即它们可以被分段。
根据您需要传输的内存量,我会执行以下两个问题之一:
cudaMemcpy
。cudaMemcpyAsync
,其中每个副本处理矢量矢量中的单个矢量,然后进行同步。