cuda中,是不支持在核函数中直接使用vector的。所以通常情况下是要使用动态数组将vector的数据提取,然后进行计算。
这里我们来介绍下如何将vector的数据转换为动态数组,并传入到核函数进行计算的。
- 一维
vector<int> b;
int* a;
cudaMalloc((void**)& a, sizeof(int) * b.size());
cudaMemcpy(a, &b[0],sizeof(int) * b.size(), cudaMemcpyHostToDevice);
- 二维比较麻烦,因为要循环处理vector中的每一个vector(每一行),这里用一个中间的二维数组作为承接
vector<vector<int>> d;
int ** a_2d = new int* [d.size()];
int * a_2d_cu;
for (int i = 0; i < d.size(); i++){
int* devPtr;
int length = d[i].size();
cudaMalloc((void**)& devPtr, sizeof(int)*length);
cudaMemcpy(devPtr, &d[i], sizeof(int)*length, cudaMemcpyHostToDevice);
a_2d[i] = devPtr; //先把指向cuda内存的指针存在host内存的数组中
}
cudaMalloc((void**)& a_2d_cu, sizeof(int*)*d.size());
cudaMemcpy(a_2d_cu, a_2d, sizeof(int*)*d.size(), cudaMemcpyHostToDevice);
这里的cudaMalloc可以进一步使用cudaMallocPitch和cudaMemcpy2D
//这是为了对齐内存,如果数据不是32的整数倍的话,二维数组用这个会比较好
size_t pitch;
cudaMallocPitch(& a_2d_cu, &pitch, d[0].size()*sizeof(int), d.size()));
cudaMemcpy2D(a_2d_cu, pitch, a_2d, d[0].size()*sizeof(int), d[0].size()*sizeof(int), d.size(), cudaMemcpyHostToDevice);