2017-03-02 5 views
0

、一つは我々がprivate句、ないshared句を持ってOpenACCで共有変数やOpenMPのでOpenACC

#pragma omp parallel for shared(foo) private(bar) 

によりループで共有変数を使用することができます。一方、copy,copyin,copyoutなどのデータ句があります。

時には、独自のプライベートメモリを持ちますが、共通メモリにアクセスできるアクセラレータを使用することもあります。

このような場合、アクセラレータがデータを自分のプライベートメモリにコピーして共有メモリのインスタンスで操作することを避けたい場合があります。

OpenACCにデータをコピーしないように指示するにはどうすればよいですか?

答えて

1

アレイはデフォルトで共有されます。

"create"データ句はデバイス上にデータを作成しますが、コピーは実行しません。

cudaMallocまたはacc_mallocの呼び出しなど、デバイスですでに作成されたデータを使用する場合は、 "deviceptr"データ句を使用して、ポインターのアドレスをルックではなくデバイスコードで使用するようコンパイラーに指示できますホストアドレスを使用して、現在のテーブル内のデバイスポインタをアップする。

デバイス変数をホスト変数に関連付ける場合は、API呼び出し「acc_map_data」を使用できます。

あなたは、再利用したい大きなメモリプールを持っているようです。この場合、OpenACCデータ句、cudaMalloc、またはacc_mallocを使用してメモリプールを作成できます。データ句を使用する場合は、 "acc_deviceptr"を呼び出してデバイスポインタのアドレスを取得します。次に、 "acc_map_data"を使用して、ホストポインタをデバイスポインタに関連付けることができます。マッピングされたデータは、より大きなデバイスプールのサブセットにすることができ、オフセット(つまり、「devptr + offset」)にマッピングすることができます。

「acc_map_data」の使用例については、https://github.com/rmfarber/ParallelProgrammingWithOpenACC/blob/master/Chapter05/acc_map.c

を参照してください。
関連する問題