問題タブ [pgi-accelerator]
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.
fortran - Fortran-OpenACC ルーチンはどのようにして別の Fortran-OpenACC ルーチンを呼び出すことができますか?
私は現在、ほとんどのルーチンを PGI (15.10) コンパイラで OpenACC を使用して GPGPU に移植することにより、スペクトル要素流体ソルバーを高速化しようとしています。ソースコードは OO-Fortran で書かれています。このソフトウェアには、他の関数やサブルーチンを呼び出すサブルーチンの「層」があります。openacc を使用してコードを GPU に移行するために、移植が必要な各ルーチンに「$acc ルーチン」ディレクティブを配置することを最初に試みました。コンパイル中に「pgf90 -acc -Minfo=accel」を使用すると、次のエラーが表示されます。
nvvmCompileProgram エラー: 9.
エラー: /tmp/pgacc2lMnIf9lMqx8.gpu (146, 24): 関数 'innerroutine_' への無効な前方参照を間違った型で解析します!
PGF90-S-0155 - コンパイラがアクセラレータ領域の変換に失敗しました (-Minfo メッセージを参照): デバイス コンパイラがエラー ステータス コードで終了しました (Test.f90: 1)
これと同じ問題は、次の単純な fortran プログラムで再現できます。
繰り返しますが、上記のプログラムを「pgf90 -acc -Minfo=accel」でコンパイルすると、問題が発生します。
openacc は、他の acc が有効なルーチンを呼び出す acc が有効なルーチンをサポートしていますか?
もしそうなら、私は何を間違っていますか?
openacc - PGI 16.9 で行が長すぎます。の解き方?
問題を再現するには、次のダミー コードを使用します。
PGF90-S-0285-ソース行が長すぎます (pp.f90: 6) PGF90-S-0023-構文エラー - 括弧のバランスが取れていません (pp.f90: 6) 0 通知、0 警告、2 重大、0 pp の致命的
nvcc - openacc - ta=multicore と ta=nvidia のコンパイルの不一致
私はもともと OpenMP で書かれたコードを持っています。今、それを OpenACC に移行したいと考えています。以下を検討してください。
1- まず、OpenMP の出力結果は最終結果と見なされ、OpenACC の出力はそれに続く必要があります。
2- 次に、端末のプログラムへの入力によって有効になるコードに 2 つの機能があります。したがって、入力フラグに基づいてF1
orが実行されます。F2
そのため、前述のように、コードを OpenACC に転送しました。これで、OpenACC コードを両方-ta=multicore
で-ta=nvidia
コンパイルし、さまざまなアーキテクチャ用に OpenACC リージョンをコンパイルできます。
の場合F1
、両方のアーキテクチャの出力は OpenMP と同じです。したがって、 と を使用してプログラムをコンパイルする-ta=multicore
と、が選択されている-ta=nvidia
場合に OpenMP と同様の正しい出力結果が得られることを意味します。F1
についてF2
は、少し異なります。でコンパイルすると-ta=multicore
、OpenMP として正しい出力が得られますが、nvidia アーキテクチャでは同じことが起こりません。コードをコンパイルすると-ta=nvidia
、結果が間違っています。
何が間違っているのF2
か、さらには何か考えはありますbuild process
か?
注:私は PGI コンパイラ 16 を使用しており、NVIDIA GPU の CC は 5.2 です。
cuda - OpenACC の固定メモリ (PGI コンパイラを使用)
OpenACC に変換した単純な CUDA コードがあります。すべてのカーネルは期待どおりに並列化され、CUDA カーネルと同様のパフォーマンスを発揮します。ただし、デバイスからホストへのメモリ転送によりパフォーマンスが低下します。私の CUDA コードでは固定メモリを使用しており、パフォーマンスが大幅に向上しています。残念ながら、OpenACC では固定メモリを利用する方法がわかりません。ドキュメントには何も見つかりませんでした。固定メモリを利用する簡単な OpenACC の例を教えてもらえますか?
PS: PGI 16.10-0 64 ビット コンパイラを使用しています。
c - PGI コンパイラを使用して C/OpenACC でグローバル動的配列を宣言する方法
A
動的に割り当てられた配列が extern として定義され、OpenACC を使用して GPU にアップロードされる簡単なテスト ケースを実行しようとしています。すべて PGI コンパイラを使用します。
私の header.h
ファイル:
次に、私のheader.c
実装:
それから、main.c
私は持っています
次のコマンドでコードをコンパイルします。
私のPGI
コンパイラのバージョンは次のとおりです。
コードを実行するには:
問題は、PGI コンパイラが を送信variable=A bytes=8
しているため、私の送信要求を無視していることだと思いますA[0:N]
。
では、PGI コンパイラを使用して C/OpenACC でグローバル動的配列を宣言するにはどうすればよいでしょうか?