gpt4 book ai didi

c++ - 如何将 STL vector 矩阵转换为二维数组矩阵(或一维数组)

转载 作者:行者123 更新时间:2023-11-30 04:13:59 31 4
gpt4 key购买 nike

我正在使用 CUDA,但似乎我无法将 STL vector 作为参数传递,因此我需要将这些 vector 矩阵转换为动态数组。

std::vector< std::vector<float> > some_matrix;float **f;

我尝试使用 memcpy 函数,但由于某种原因它没有按预期工作,如果我尝试复制内容,原始矩阵中的某些值将被更改为垃圾。我避免使用 for 循环,因为那会降低效率。

最佳答案

正如您所发现的,不可能传递 std::vector到 CUDA 内核并在内核代码中使用它,并且不可能传递您可能从 std::vector< std::vector<float> > 构建的简单主机指针数组到 CUDA 内核。

您需要做的是首先创建一个设备指针 的主机数组(因此您复制到设备的每一行都有一个条目)并将该指针数组复制到设备。这意味着您需要为复制到设备的每个矩阵行或列调用 cudaMalloc 和 cudaMemcpy。你可以这样做:

std::vector< std::vector<float> > some_matrix;

float** f = new float*[some_matrix.size()];
for (int i = 0; i < some_matrix.size(); ++i) {
size_t szp = sizeof(float) * some_matrix[i].size();
float* p;
cudaMalloc((void **)&p, sz);
cudaMemcpy(p, &some_matrix[i][0], szp, cudaMemcpyHostToDevice);
f[i] = p;
}

float** f_dev;
size_t szf = sizeof(float*) * some_matrix.size();
cudaMalloc((void **)&f_dev, szf);
cudaMemcpy(f_dev, f, szf, cudaMemcpyHostToDevice);

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

在此之后 f_dev可以安全地传递给 CUDA 内核并在设备上使用。

希望你能从上面的代码中看出为什么这种数据结构在 GPU 上不太好用。设置和传输它有很多 API 开销,然后在设备上你有延迟惩罚,因为将值获取到内存需要双指针间接。

对于源数据不是“锯齿状数组”(即矩阵中所有行的长度都相同)的情况,存储在线性内存中的扁平列主数组或行主数组是更好的解决方案。如果源数组参差不齐,请考虑使用类似于 CSR 或 CSC 稀疏矩阵格式的结构。这些不会在设备上提供太多性能改进,但它们确实减少了管理它们的主机端 API 开销。

关于c++ - 如何将 STL vector 矩阵转换为二维数组矩阵(或一维数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139138/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com