Чтобы быть более ясным, я хочу передать указатели и все данные, которые они указали на устройство. Для того, чтобы проверить, как я могу достичь этой цели, я написал простой класс:Как передать класс C++ с массивом указателей на CUDA?
class vecarray{
public:
int * vecptr[N]; //array of pointers pointing to array
int dim[N]; //store length of each array pointed to
__device__ __host__ vecarray(); //constructor
__device__ __host__ int sum(); //sum up all the elements in the array being
//pointed to
}
vecarray::vecarray(){
for(int i = 0; i<N; i++)
{
vecptr[i] = NULL;
dim[i] = 0;
}
}
int vecarray::sum(){
int i=0, j=0, s=0;
for (i=0; i<N; i++)
for(j=0; j < dim[i]; j++)
s += vecptr[i][j];
return s;
}
Затем я использую этот класс в следующем коде:
#define N 2
__global__ void addvecarray(vecarray * v, int *s){
*s = v->sum();
}
int main(){ //copy *V to device, do sum() and pass back
vecarray *v, *dev_v; //the result by dev_v
v = new vecarray;
dev_v = new vecarray;
int a[3] = {1,2,3}; //initialize v manually
int b[4] = {4,5,6,7};
int result = 0;
int * dev_result;
v->vecptr[0] = a;
v->vecptr[1] = b;
v->dim[0] = 3; v->dim[1] = 4;
cudaMalloc((void**)&dev_v, sizeof(vecarray));
cudaMemcpy(dev_v, v, sizeof(vecarray),cudaMemcpyHostToDevice); //copy class object
for(int i = 0; i < N; i++){
cudaMalloc((void**)&(dev_v->vecptr[i]), v->dim[i]*sizeof(int));
}
for(int i = 0; i<N; i++){ //copy arrays
cudaMemcpy(dev_v->vecptr[i], v->vecptr[i], v->dim[i]*sizeof(int), cudaMemcpyHostToDevice));
}
addvecarray<<<1,1>>>(dev_v, dev_result);
cudaMemcpy(&result, dev_result, sizeof(int), cudaMemcpyDeviceToHost);
printf("the result is %d\n", result);
}
коде, переданном NVCC компилятором, но потерпел неудачу с ошибкой сегментации при запуске. Я проверил проблему в двух операциях cudaMalloc и cudaMemcpy в for-loop. Итак, мой вопрос: как передать этот объект в CUDA? Заранее спасибо.
Я считаю, что этот вопрос является дубликатом [этот] (http://stackoverflow.com/ вопросы/14284964/CUDA-хау к ассигновать-память-для-данных члена-оф-а-класс/14286341 # 14286341). В строке кода, где у вас есть цикл for, выполняющий операцию cudaMalloc, вы передаете в качестве указателя на cudaMalloc указатель, который * уже живет в памяти устройства *. Вместо этого вам нужно создать отдельный набор указателей int на хосте, cudaMalloc, затем cudaMemcpy их на устройство в соответствующих местах вашего объекта vecarray, созданного на 'dev_v'. –