問題タブ [pgi]
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.
if-statement - ifステートメントはOpenACCにとって悪いですか?
OpenACC は if ステートメントを効率的に処理しないため、使用を避けるようにする必要があると聞きました。
たとえば、デバイス/OpenACC で次のようなことを行う (いくつかの if ステートメントでループする) のは良くありません。
それは本当ですか?もしそうなら、OpenACC で if ステートメントを処理するにはどうすればよいですか?
loops - ループおよび if ステートメント内の openacc 構造体
次のコードがあります。
「polygon1」と「polygon2」は構造体です。
「listOfPolygons1」と「listOfPolygons2」は、対応する「polygon1」と「polygon2」のリストを持つ構造体配列です。
「listOfBoolean」は int の配列です
「listOfPolygons1」と「listOfPolygon2」の両方がアクセラレータにディープ コピーされ、前のループで正常に使用されます (コードはここには示されていません)。
コードはコンパイルできますが、実行すると次のエラー メッセージが表示されます。
私の観察
問題は 139 行目にあるようです。「k<polygon2.num_vertices」を使用すると、前述のエラーが発生しました。
しかし、行を次のように変更すると:
(更新 1) またはこれ:
プログラムは正常にコンパイルおよび実行できます
それはなぜですか?ここで構造体「polygon2」を使用するにはどうすればよいですか?
arrays - 配列を結合して OpenACC にする
配列に依存する OpenACC コードを書いています。内部ループの各反復は、配列の同じ位置を更新できます。ここにいくつかのコードがあります:
OpenMP版は以下のように書いていました。
OpenACC では、キーワード private は配列で機能しますが、プライベート配列をグローバル配列と結合する方法がわかりません。
ありがとう。
header - PGI コンパイラ エラー「インクルード ファイル bits/c++config.h が見つかりません」
私は C で書いており、Ubuntu OS で pgi コンパイラを使用しています。作成した関数を含むヘッダー ファイルをインクルードしたいと考えています。私のコードでは
ただし、コンパイルするとエラーが発生します
かっこ内のディレクトリは、ワークステーションで bits/c++config.h ファイルが配置されている正確な場所です。また、コードで「#include」ステートメントを削除すると、すべて正常に動作します。さらに、パスに「/opt/pgi/linux86-64/16.7/include」を追加しても、まだエラーが発生します私は何を間違っていますか?
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 が有効なルーチンをサポートしていますか?
もしそうなら、私は何を間違っていますか?
cmake - cmake 混合言語プロジェクトで FORTRAN リンカーを使用する
混合言語プロジェクト (C/C++ および FORTRAN) に CMake を使用すると、実行可能ファイルをリンクするために C++ コンパイラが呼び出されます。リンク手順で FORTRAN コンパイラを呼び出す簡単な方法はありますか。
これは FORTRAN コンパイラで正しくコンパイルされますが、リンク ステップで C++ コンパイラが呼び出され、たとえば PGI などの一部のコンパイラ スイートで問題が発生します。
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 ビット コンパイラを使用しています。