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

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

但是当您将X结构体复制到设备时,您将x连同它一起复制,其中包含一个主机指针。当你对指针解引用时:

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

设备代码抛出错误。

这里给出了更多的细节以及如何修复它的说明。

相关内容

最新更新