問題タブ [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.

0 投票する
0 に答える
202 参照

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 配列に渡してから、共有ライブラリ ルーチンに違いはありません。

0 投票する
1 に答える
477 参照

c++ - デバイスメモリ内の変数は外部関数でどのように使用されますか?

このコードでは:

のデバイスメモリ上にあるとどのようにint value認識されintfunますか? present(variable[:1])プラグマでbypresent(variable[:1],value)に置き換えるintfunと、次のランタイム エラーが発生します。

valueそれを指定するとpresent上記の失敗につながる理由がわかりません。valueディレクティブで一度だけコピーされたNVVP で確認しました。つまり、ディレクティブでenter data再度コピーされていません。OpenACC はどのようにその魔法を働かせるのですか?parallelintfun

0 投票する
0 に答える
319 参照

c++ - ホストとデバイス間のデータ転送を推進しますか?

説明できない動作を再現するコードは次のとおりです。

main.cpp

findme.cu

1 バイトのデバイスからホストへの転送が 1 つあります (8 バイトのデバイスからホストへの転送はposition int.

ここに画像の説明を入力

...そして 1 つのホストからデバイスへの 4 バイトの転送...

ここに画像の説明を入力

...説明できません。のコピーARRAYはスクリーンショットには表示されませんが、ホストからデバイスへの転送 (40 バイト) の [詳細] タブに含まれていることに注意してください。どのデータが正確に転送されているかについての手がかりはありますか? それらはスラスト アルゴリズムに固有のものであり、したがって避けられないものですか?

0 投票する
1 に答える
68 参照

openacc - OpenACC 境界の問題

OpenACC で非常に単純なベクトル加算カーネルを実行しています。そして、これが私が使用しているコンパイラ(OpenCLを使用したaccULL)の問題であるかどうか疑問に思っています。デバイスからホストにデータをコピーして戻すように見える問題があるためです。すべての結果は正しいですが、結果[0]です。たとえば、次のコード:

以下を返します。

つまり、インデックス 0 以外のすべての結果が正しいことを意味します。インデックス 0 の結果はデバイスからコピーされていないようです。

これはコンパイラ/ランタイムのバグですか、それとも私のコーディングに関して何かミスがありましたか?

0 投票する
2 に答える
891 参照

cuda - GPU での強力なスケーリング

並列 GPU コード (OpenACC で記述) の強力なスケーリングを調査したいと思います。GPU によるストロング スケーリングの概念は、少なくとも私の知る限りでは、CPU よりも曖昧です。GPU での強力なスケーリングに関して私が見つけた唯一のリソースは、問題のサイズを修正し、GPU の数を増やすことを提案しています。ただし、ストリーミング マルチプロセッサ (Nvidia Kepler アーキテクチャ) のスケーリングなど、GPUにはある程度の強力なスケーリングがあると思います。

OpenACC と CUDA の目的は、ハードウェアを並列プログラマーに明示的に抽象化し、並列プログラマーをギャング (スレッド ブロック)、ワーカー (ワープ)、ベクトル (スレッドの SIMT グループ) による 3 レベルのプログラミング モデルに制約することです。CUDA モデルは、独立しており、SMX にマップされているスレッド ブロックに関してスケーラビリティを提供することを目的としていると理解しています。したがって、GPU を使用したスト​​ロング スケーリングを調査するには、次の 2 つの方法があります。

  1. 問題のサイズを修正し、スレッド ブロック サイズとブロックあたりのスレッド数を任意の定数に設定します。スレッド ブロックの数 (グリッド サイズ) をスケーリングします。
  2. 基礎となるハードウェアに関する追加の知識 (例: CUDA 計算機能、最大ワープ/マルチプロセッサ、最大スレッド ブロック/マルチプロセッサなど) を考慮して、ブロックが全体および単一の SMX を占有するように、スレッド ブロック サイズとブロックあたりのスレッド数を設定します。したがって、スレッド ブロックのスケーリングは、SMX のスケーリングと同じです。

私の質問は次のとおりです: GPU での強力なスケーリングに関する私の一連の考えは正しいですか? もしそうなら、OpenACC 内で上記の #2 を行う方法はありますか?

0 投票する
3 に答える
261 参照

gpgpu - OpenACC 2.0 ルーチン: データの局所性

routine次のコードは、OpenACC 2.0 のディレクティブを使用してデバイスでコンパイルされた、アクセラレータでの単純なルーチンの呼び出しを示しています。

functionのデバイス コピーを使用する方法ARRAY[0:10]multiplier、並列領域内から呼び出されるタイミングを知るにはどうすればよいでしょうか? デバイス コピーの使用を強制するにはどうすればよいですか?

0 投票する
1 に答える
149 参照

cuda - キャッシュ ディレクティブが存在する場合に NVIDIA __shared__ メモリが使用されていることを確認する

PGI 14.10 を使用して OpenACC のキャッシュ句を試しています。[1] のスライドに基づいた単純なループがあります。

--metrics shared_load_transactions,shared_store_transactions を指定して nvprof でこれを実行すると、ロードもストアも報告されません。それで、キャッシュディレクティブは私が望む効果を持っていませんか(もしそうなら、なぜそれが機能しないのですか)? それとも、nvprof を使用して共有トランザクションを測定するのは間違っていますか?

Minfo の出力は以下のとおりです。

[1] http://www.pgroup.com/lit/presentations/cea-3.pdf

0 投票する
4 に答える
19918 参照

multithreading - OpenMP は GPU に使用できますか?

私はウェブを検索してきましたが、このトピックについてまだ非常に混乱しています。誰かがこれをもっと明確に説明できますか? 私は航空宇宙工学のバックグラウンドを持っています (コンピューター サイエンスのバックグラウンドではありません)。とマルチスレッド 言われていることの多くを私は本当に理解していません。

私は現在、FORTRAN で書かれた社内の CFD ソフトウェアを並列化しようとしています。これらは私の疑問です:

  1. OpenMP は、CPU から複数のスレッドを使用してワークロードを共有します。GPU が作業の一部を取得できるようにするために使用できますか?

  2. OpenACCについて読みました。OpenMPに似ている(使いやすい)?

CUDA とカーネルについても読んだことがありますが、並列プログラミングの経験があまりなく、カーネルが何であるかについてのかすかな考えもありません。

  1. FORTRAN の場合、ワークロードを GPU と共有する簡単で移植可能な方法はありますか (OpenMP がそれを行わず、OpenACC が移植可能でない場合)?

「ダミー用」のタイプの答えを教えてもらえますか?