2013-05-29 129 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以及如何修復它的說明。

相關問題