2013-05-29 132 views
0

内核我有两个结构为传递一个结构包括一个指向另一个结构,在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:巷非法地址在内核代码。什么是错误的或什么是正确的做法?任何想法?

回答

2

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

但是,当你复制X结构的设备,复制与它一起x,其中包含了主机的指针。当您取消引用该指针时:

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

设备代码会引发错误。

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

相关问题