vector用于cuda核函数中


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

Author: Moule Lin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Moule Lin !
  TOC