2013-05-29 4 views
0

У меня есть два, какпропускание-структуры, включая указатель на другую структуру, ядро ​​в CUDA

структур
struct collapsed { 
    char **seq; 
    int num; 
}; 


struct data { 
    collapsed *x; 
    int num; 
    int numblocks; 
    int *blocksizes; 
    float *regmult; 
    float *learnmult; 
}; 

Я передаю его в мое ядро ​​как;

__global__ void KERNEL(data* X,...){ 
    ... 
    collapsed x = X->x[0]; // GIVES CUDA_EXPECTION_1:Lane Illegal Address 
} 

data X; 
//init X 
data *X_dev; 
cudaMalloc((data **) & X_dev, sizeof(data)); 
cudaMemcpy(X_dev, &X, sizeof(data), cudaMemcpyHostToDevice); 
KERNEL<<<...>>>(X_dev,...); 

Этот код дает CUDA_EXPECTION_1: Lane Illegal Адрес в коде ядра. Что не так или как правильно это сделать? Есть идеи?

ответ

2

Вы разыскиваете указатель узла на устройстве. X является допустимым указателем устройства.

Но когда вы скопировали структуру X на устройство, вы скопировали x вместе с ним, который содержит указатель на хост. Когда вы разыскиваете этот указатель:

collapsed x = X->x[0]; 
       ^this is dereferencing the x pointer 

Код устройства выдает сообщение об ошибке.

Подробнее дано here, а также инструкции по его устранению.

Смежные вопросы