Передача структуры, включающей указатель на другую структуру, в ядро в 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: незаконный адрес переулка в коде ядра. Что не так или как правильно это сделать? Любая идея?

Ответы на вопрос(1)

Решение Вопроса

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

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

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

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

Более подробно даноВот а также инструкции о том, как это исправить.

Ваш ответ на вопрос