次のように私は、構造体があるとします。今コピー配列
typedef struct values{
int one, int two, int three
} values;
、私はホスト上の値の配列を作成し、ランダムなデータ
values vals*;
__device__ values* d_vals;
int main(){
vals = (values*)malloc(sizeof(values) * A_LARGE_NUMBER);
PopulateWithDate(); //populates vals with random data
}
を取り込むと仮定
__global__ void myKernel(){
printf("%d", d_vals[0].one);//I don't really want to print, but whenever I try to access I get an error
}
Whate:
は今、私はそうのように私のカーネルでそれらにアクセスできるように、デバイスに値をコピーすることができるようにしたいですver私は不正なメモリアクセスを取得しようとするとエラーが発生しました。あなたは__device__
ポインタ変数を使用して、これまでに示されているものについては
int main(){
vals = (values*)malloc(sizeof(values) * A_LARGE_NUMBER);
PopulateWithDate(); //populates vals with random data
values* d_ptr;
cudaGetSymbolAddress((void**)&d_ptr, d_vals);
cudaMalloc((void**)&d_ptr, A_LARGE_NUMBER * sizeof(values));
cudaMemcpyToSymbol(d_ptr, &vals, sizeof(values) * A_LARGE_NUMBER);
cudaDeviceSynchronize();
dim3 blocksPerGrid(2, 2);
dim3 threadsPerBlock(16, 16);
myKernel<< <blocksPerGrid, threadsPerBlock >> >();
}
こんにちは:
はその一例に続き、ここではそれが
__device__
ポインタ変数の代わりに、カーネルパラメータとして渡されたポインタを動作させるために上記のコードへの変更のセットです。役に立った返信ありがとう。私は私の質問であまりにも明確ではなかった、申し訳ありません。これは、myKernelがmainから呼び出されないため、デバイスポインタを使用する必要があることです。代わりに、私はいくつかの外部コードからランダムなイベントを受け取った後に呼び出されます。言い換えれば、私はd_ptrをカーネルのパラメータとして渡すことができません。どこかへの参照を保つ必要があります。 – William変更は比較的軽微ですので、変更を示す例を追加しました。 –