2016-11-29 2 views
1

ホスト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) 
} 

答えて

2

配列を線形化する必要はありません。複数の括弧を使用するだけです。

#pragma acc data copyin(W[0:n_hidden][0:N]) 

他にも多数の問題があります。

dataディレクティブには "region"句がありません。 OpenACCの基礎となった「データ入力」句やPGIアクセラレータモデルと混同しているかもしれません。

"b"を計算領域で実際に使用していないため、データ節に "b"を入れる必要はありません。また、それをデータ句に入れることで、 "b"をデバイス上のグローバル参照にします。読み込み専用のスカラをデータ句から除外して、値をグローバルメモリから取得する必要がなく、引数として渡すようにする方がよいでしょう。

また、データ節にスカラー変数 "pre_sigmoid_activation"を入れることによって、グローバル変数が作成されます。ここで、削減の結果はこのデバイス変数に格納され、ホスト上で自動的には更新されません。そのためには、 "update"ディレクティブを追加する必要があります。データ節から削除するだけで、結果がホスト変数に更新されます。

"exit data"ディレクティブが一致しています(対応する "enter data"ディレクティブが必要です)。また、ディレクティブはreturn文の後に置かれるため、決して実行されず、データをデバイスに残します。

最後に、C++では大文字と小文字が区別されるため、OpenACCディレクティブの変数名が実際の変数名と一致するようにしてください。すなわち「w」ではなく「W」である。

ループを書く方法は次のとおりです。 「W」の2番目の次元のサイズは分かりませんので、単に「N」を使用します。それに応じて更新してください。並列ループの削減ACC の#pragma(+:pre_sigmoid_activation) バックコンパイラのフィードがある: 「 コール

#pragma acc data copyin(W[0:n_hidden][0:N],h[0:n_hidden]) 
{ 
    #pragma acc parallel loop reduction(+:pre_sigmoid_activation) 
    for(int j=0; j<n_hidden; j++) { 
    pre_sigmoid_activation += W[j][i] * h[j]; 
    } 
} 
+0

は、私はその理由を知らないが、私のように平行に置くとき、あなたにたくさん をありがとう〜cuMemcpyDtoHAsyncに返されたエラー700:カーネル実行中の不正なアドレス cuMemFreeHostの呼び出しでエラー700が返されました:カーネルの実行中に不正なアドレス " –

+0

これは、範囲外の配列にアクセスしているか、 "W"はクラスデータメンバですか?もしそうなら、 "this"ポインタへの隠れた参照があるので、 "W [j] [I]"にアクセスすることは本当に "this-> W [j] [I]"です。修正するには、 "copyin"句に "this"を追加してください。例えば、 "copyin(this、W [..."問題がなければ、再現例を投稿できますか?] –

+0

OpenACCの使用に関するいくつかの例が必要な場合C++クラスと多次元配列を使用する場合は、github https://github.com/rmfarber/ParallelProgrammingWithOpenACC/ –

関連する問題