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

时间:2013-05-29 13:48:20

标签: 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,...){
    ...
    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 。有什么不对或什么是正确的方法呢?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

但是当您将X结构复制到设备时,您复制了x以及包含主机指针的collapsed x = X->x[0]; ^ this is dereferencing the x pointer 。当您取消引用该指针时:

{{1}}

设备代码会抛出错误。

更多详细信息here以及如何修复它的说明。