問題タブ [openacc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - PGCC でコンパイルされた OpenACC で高速化された共有ライブラリからルーチンを呼び出すと、MEX で未定義のシンボル エラーが発生する
libraberto.so
でコンパイルされた共有ライブラリがありPGCC
ます。これには OpenACC プラグマ ディレクティブが含まれており、-acc
これらのディレクティブが有効になるようにフラグを指定してコンパイルされます。対応するメイクファイルの規則は次のとおりです。
file1.c
、などは、ライブラリfile2.c
を構成するソース ファイルです。
次に、mex_gateway.c
単純に MATLAB から共有ライブラリ内のルーチンを呼び出し、変数 (配列とスカラー) を渡し、出力配列を受け取るファイルがあります。次のようにコンパイルされます。
コンパイルは正常に機能しますが、MATLAB でゲートウェイを実行しようとすると、次のエラーが発生します。
Google でこの特定のエラー (シンボル) に関する情報を見つけることができず、コードのどこを見ればよいかわかりません。プログラムは、OpenACC ディレクティブなしで (つまり、なしで-acc
) 共有ライブラリをコンパイルすると正常に動作します。このエラーは、MEX ( ) で使用される配列の特定の性質が原因である可能性があると考えましたmxArray
。これは、データをアクセラレータに転送するときに OpenACC で適切に動作しない可能性がありますがmemcpy
、入力を真malloc
の C 配列に渡してから、共有ライブラリ ルーチンに違いはありません。
c++ - デバイスメモリ内の変数は外部関数でどのように使用されますか?
このコードでは:
のデバイスメモリ上にあるとどのようにint value
認識されintfun
ますか? present(variable[:1])
プラグマでbypresent(variable[:1],value)
に置き換えるintfun
と、次のランタイム エラーが発生します。
value
それを指定するとpresent
上記の失敗につながる理由がわかりません。value
ディレクティブで一度だけコピーされたNVVP で確認しました。つまり、ディレクティブでenter data
再度コピーされていません。OpenACC はどのようにその魔法を働かせるのですか?parallel
intfun
c++ - ホストとデバイス間のデータ転送を推進しますか?
説明できない動作を再現するコードは次のとおりです。
main.cpp
findme.cu
1 バイトのデバイスからホストへの転送が 1 つあります (8 バイトのデバイスからホストへの転送はposition
int
.
...そして 1 つのホストからデバイスへの 4 バイトの転送...
...説明できません。のコピーARRAY
はスクリーンショットには表示されませんが、ホストからデバイスへの転送 (40 バイト) の [詳細] タブに含まれていることに注意してください。どのデータが正確に転送されているかについての手がかりはありますか? それらはスラスト アルゴリズムに固有のものであり、したがって避けられないものですか?
openacc - OpenACC 境界の問題
OpenACC で非常に単純なベクトル加算カーネルを実行しています。そして、これが私が使用しているコンパイラ(OpenCLを使用したaccULL)の問題であるかどうか疑問に思っています。デバイスからホストにデータをコピーして戻すように見える問題があるためです。すべての結果は正しいですが、結果[0]です。たとえば、次のコード:
以下を返します。
つまり、インデックス 0 以外のすべての結果が正しいことを意味します。インデックス 0 の結果はデバイスからコピーされていないようです。
これはコンパイラ/ランタイムのバグですか、それとも私のコーディングに関して何かミスがありましたか?
cuda - GPU での強力なスケーリング
並列 GPU コード (OpenACC で記述) の強力なスケーリングを調査したいと思います。GPU によるストロング スケーリングの概念は、少なくとも私の知る限りでは、CPU よりも曖昧です。GPU での強力なスケーリングに関して私が見つけた唯一のリソースは、問題のサイズを修正し、GPU の数を増やすことを提案しています。ただし、ストリーミング マルチプロセッサ (Nvidia Kepler アーキテクチャ) のスケーリングなど、GPU内にはある程度の強力なスケーリングがあると思います。
OpenACC と CUDA の目的は、ハードウェアを並列プログラマーに明示的に抽象化し、並列プログラマーをギャング (スレッド ブロック)、ワーカー (ワープ)、ベクトル (スレッドの SIMT グループ) による 3 レベルのプログラミング モデルに制約することです。CUDA モデルは、独立しており、SMX にマップされているスレッド ブロックに関してスケーラビリティを提供することを目的としていると理解しています。したがって、GPU を使用したストロング スケーリングを調査するには、次の 2 つの方法があります。
- 問題のサイズを修正し、スレッド ブロック サイズとブロックあたりのスレッド数を任意の定数に設定します。スレッド ブロックの数 (グリッド サイズ) をスケーリングします。
- 基礎となるハードウェアに関する追加の知識 (例: CUDA 計算機能、最大ワープ/マルチプロセッサ、最大スレッド ブロック/マルチプロセッサなど) を考慮して、ブロックが全体および単一の SMX を占有するように、スレッド ブロック サイズとブロックあたりのスレッド数を設定します。したがって、スレッド ブロックのスケーリングは、SMX のスケーリングと同じです。
私の質問は次のとおりです: GPU での強力なスケーリングに関する私の一連の考えは正しいですか? もしそうなら、OpenACC 内で上記の #2 を行う方法はありますか?
gpgpu - OpenACC 2.0 ルーチン: データの局所性
routine
次のコードは、OpenACC 2.0 のディレクティブを使用してデバイスでコンパイルされた、アクセラレータでの単純なルーチンの呼び出しを示しています。
function
のデバイス コピーを使用する方法ARRAY[0:10]
とmultiplier
、並列領域内から呼び出されるタイミングを知るにはどうすればよいでしょうか? デバイス コピーの使用を強制するにはどうすればよいですか?
cuda - キャッシュ ディレクティブが存在する場合に NVIDIA __shared__ メモリが使用されていることを確認する
PGI 14.10 を使用して OpenACC のキャッシュ句を試しています。[1] のスライドに基づいた単純なループがあります。
--metrics shared_load_transactions,shared_store_transactions を指定して nvprof でこれを実行すると、ロードもストアも報告されません。それで、キャッシュディレクティブは私が望む効果を持っていませんか(もしそうなら、なぜそれが機能しないのですか)? それとも、nvprof を使用して共有トランザクションを測定するのは間違っていますか?
Minfo の出力は以下のとおりです。
multithreading - OpenMP は GPU に使用できますか?
私はウェブを検索してきましたが、このトピックについてまだ非常に混乱しています。誰かがこれをもっと明確に説明できますか? 私は航空宇宙工学のバックグラウンドを持っています (コンピューター サイエンスのバックグラウンドではありません)。とマルチスレッド 言われていることの多くを私は本当に理解していません。
私は現在、FORTRAN で書かれた社内の CFD ソフトウェアを並列化しようとしています。これらは私の疑問です:
OpenMP は、CPU から複数のスレッドを使用してワークロードを共有します。GPU が作業の一部を取得できるようにするために使用できますか?
OpenACCについて読みました。OpenMPに似ている(使いやすい)?
CUDA とカーネルについても読んだことがありますが、並列プログラミングの経験があまりなく、カーネルが何であるかについてのかすかな考えもありません。
- FORTRAN の場合、ワークロードを GPU と共有する簡単で移植可能な方法はありますか (OpenMP がそれを行わず、OpenACC が移植可能でない場合)?
「ダミー用」のタイプの答えを教えてもらえますか?