我有两个结构
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 。有什么不对或什么是正确的方法呢?有什么想法吗?
答案 0 :(得分:2)
您正在取消引用设备上的主机指针。
X
是有效的设备指针。
但是当您将X
结构复制到设备时,您复制了x
以及包含主机指针的collapsed x = X->x[0];
^ this is dereferencing the x pointer
。当您取消引用该指针时:
{{1}}
设备代码会抛出错误。
更多详细信息here以及如何修复它的说明。