CUDA如何利用vector实现参数传递
程序员文章站
2022-07-12 21:00:37
...
在C++中,我十分喜欢使用vector作为数据结构来处理数据。使用vetor进行数据存储于参数传递十分方便。
但是,在cuda中,是不支持在核函数中直接使用vector的。所以通常情况下是要使用动态数组将vector的数据提取,然后进行计算。
这里我们来介绍下如何将vector的数据转换为动态数组,并传入到核函数进行计算的。
一维vector:
一维的vector相对容易理解,可以把他看作是一个数组。
vector<int> b;
int* a;
cudaMalloc((void**)& a, sizeof(int) * b.size());
cudaMemcpy(a, &boxPointNum_3[0], sizeof(int) * b.size(), cudaMemcpyHostToDevice);
二维vector
二维的vector就会麻烦很多,因为在显存上定义二维指针,所有的地址都是指向显存,可是这些操作都是要在host端完成,所以需要有一个中间寄存的指针数组在记录,方法如下:
vector<vector<int>> b
int** a_2d = new int* [b.size()];
int** a_2d_Cu;
for (int i = 0; i < b.size(); i++)
{
int* dev_1d;
int length = b[i].size()
cudaMalloc((void**)& dev_1d, sizeof(int) * length);//该指针指向的是一个float数组
cudaMemcpy(dev_1d, &boxPoints_4[i][0], sizeof(int) * length, cudaMemcpyHostToDevice);
boxPoints_4_2d[k] = dev_1d;
}
cudaMalloc((void**)& a_2d_Cu, sizeof(int*) * b.size());
cudaMemcpy(a_2d_Cu, a_2d, sizeof(int*) * b.size(), cudaMemcpyHostToDevice);
即在内存定义一个二维指针数组,然后逐个开辟显存空间,并把显存地址存在二维指针数组里,然后在显存开辟一个二维指针数组,把之前的二维指针数组赋值,这样就实现了从内存vector到显存的载入。
然后需要注意就是提取数据,示例如下:
int** c = new int* [b.size()];
cudaMemcpy(c, b, sizeof(int*) * b.size(), cudaMemcpyDeviceToHost);
for (int i = 0; i < boxPoints_4.size(); i++) {
int *c_i = new int [b[i].size()];
cudaMemcpy(c_i, b[i], sizeof(int) * b[i].size(), cudaMemcpyDeviceToHost);
c[i] = c_i;
}
与存储分配的时候类似,取数据的时候也要将二维数据中的一维指针取出来,并一个一个的取一维数据到数组中。
上一篇: Webpack Webpack打包文件配置基本使用
下一篇: 三种基于CUDA的归约计算
推荐阅读
-
C语言函数的参数传递实例:利用函数交换两个变量的值实现教程
-
CUDA如何利用vector实现参数传递
-
java如何实现参数传递方法 JavaJavaScript框架
-
java如何实现参数传递方法 JavaJavaScript框架
-
JSP页面如何实现从一个页面传递一个参数到另外一个页面?
-
C语言函数的参数传递实例:利用函数交换两个变量的值实现教程
-
JQuery中如何传递参数如click(),change()等具体实现_jquery
-
JQuery中如何传递参数如click(),change()等具体实现_jquery
-
JSP跨iframe如何传递参数实现代码_javascript技巧
-
JSP跨iframe如何传递参数实现代码_javascript技巧