欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

与存储分配的时候类似,取数据的时候也要将二维数据中的一维指针取出来,并一个一个的取一维数据到数组中。

相关标签: 并行计算 cuda