Memory management 将包含指向另一个结构的指针的结构传递给CUDA中的内核

Memory management 将包含指向另一个结构的指针的结构传递给CUDA中的内核,memory-management,cuda,runtime-error,Memory Management,Cuda,Runtime Error,我有两个结构 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,...){ ...

我有两个结构

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,...);
\uuuuu全局\uuuuuu无效内核(数据*X,…){
...
折叠的x=x->x[0];//给出CUDA_期望值_1:Lane非法地址
}
数据X;
//初始X
数据*X_-dev;
Cudamaloc((数据**)和X_dev,sizeof(数据));
cudaMemcpy(X_dev,&X,sizeof(data),cudamemcpyhostodevice);
内核(X_dev,…);

此代码在内核代码中给出了CUDA\u EXPECTION\u 1:Lane非法地址。什么是错误的,什么是正确的方法?知道吗?

您正在解除对设备上主机指针的引用。
X
是有效的设备指针

但是,当您将
X
结构复制到设备时,您将
X
与它一起复制,其中包含一个主机指针。取消引用该指针时:

collapsed x = X->x[0];
                 ^ this is dereferencing the x pointer
设备代码抛出一个错误

更多的细节以及如何修复它的说明