ホストCPUとGPUの間で2次元要素を交換するにはどうすればよいですか? 私は[0:-1(* I n_hidden)]をWとして、この2D要素を使用しようとしました。これは、RBMアルゴリズム機能であるいくつかのことが間違っOpenACC 2Dデータの移動を管理する
があるが、コンパイラのフィードバックが私に語った:
double RBM::propdown(int *h, int i, double b) {
#pragma acc data region \
copyin(w[0:(n_hidden*i)-1],h[0:n_hidden],b) create(pre_sigmoid_activation)
double pre_sigmoid_activation = 0.0;
#pragma acc parallel loop reduction(+:pre_sigmoid_activation)
for(int j=0; j<n_hidden; j++) {
pre_sigmoid_activation += W[j][i] * h[j];
}
pre_sigmoid_activation += b;
return sigmoid(pre_sigmoid_activation);
#pragma acc exit data \
delete (pre_sigmoid_activation)
}
は、私はその理由を知らないが、私のように平行に置くとき、あなたにたくさん をありがとう〜cuMemcpyDtoHAsyncに返されたエラー700:カーネル実行中の不正なアドレス cuMemFreeHostの呼び出しでエラー700が返されました:カーネルの実行中に不正なアドレス " –
これは、範囲外の配列にアクセスしているか、 "W"はクラスデータメンバですか?もしそうなら、 "this"ポインタへの隠れた参照があるので、 "W [j] [I]"にアクセスすることは本当に "this-> W [j] [I]"です。修正するには、 "copyin"句に "this"を追加してください。例えば、 "copyin(this、W [..."問題がなければ、再現例を投稿できますか?] –
OpenACCの使用に関するいくつかの例が必要な場合C++クラスと多次元配列を使用する場合は、github https://github.com/rmfarber/ParallelProgrammingWithOpenACC/ –