CUDA如何利用vector实现参数传递

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

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

Guess you like

Origin blog.csdn.net/aliexken/article/details/105666148