0

私は2つの構造体を持っています

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を提供します。何が間違っているのか、それを行う正しい方法は何ですか? 何か案が?

4

1 に答える 1

2

デバイス上のホスト ポインターを逆参照しています。 X有効なデバイス ポインタです。

ただし、X構造体をデバイスにコピーしたときxに、ホスト ポインターを含む構造体も一緒にコピーしました。そのポインターを逆参照すると、次のようになります。

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

デバイス コードがエラーをスローします。

詳細と修正方法については、こちらを参照してください。

于 2013-05-29T14:00:42.787 に答える