0

我有两个结构

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 Address。什么是错误的或正确的方法是什么?任何想法?

4

1 回答 1

2

您正在取消引用设备上的主机指针。 X是一个有效的设备指针。

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

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

设备代码引发错误。

此处提供了更多详细信息以及有关如何修复它的说明。

于 2013-05-29T14:00:42.787 回答