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
设备代码抛出一个错误
更多的细节以及如何修复它的说明