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

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

if-statement - ifステートメントはOpenACCにとって悪いですか?

OpenACC は if ステートメントを効率的に処理しないため、使用を避けるようにする必要があると聞きました。

たとえば、デバイス/OpenACC で次のようなことを行う (いくつかの if ステートメントでループする) のは良くありません。

それは本当ですか?もしそうなら、OpenACC で if ステートメントを処理するにはどうすればよいですか?

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

loops - ループおよび if ステートメント内の openacc 構造体

次のコードがあります。

「polygon1」と「polygon2」は構造体です。
「listOfPolygons1」と「listOfPolygons2」は、対応する「polygon1」と「polygon2」のリストを持つ構造体配列です。
「listOfBoolean」は int の配列です
「listOfPolygons1」と「listOfPolygon2」の両方がアクセラレータにディープ コピーされ、前のループで正常に使用されます (コードはここには示されていません)。

コードはコンパイルできますが、実行すると次のエラー メッセージが表示されます。

私の観察
問題は 139 行目にあるようです。「k<polygon2.num_vertices」を使用すると、前述のエラーが発生しました。
しかし、行を次のように変更すると:

(更新 1) またはこれ:

プログラムは正常にコンパイルおよび実行できます

それはなぜですか?ここで構造体「polygon2」を使用するにはどうすればよいですか?

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

arrays - 配列を結合して OpenACC にする

配列に依存する OpenACC コードを書いています。内部ループの各反復は、配列の同じ位置を更新できます。ここにいくつかのコードがあります:

OpenMP版は以下のように書いていました。

OpenACC では、キーワード private は配列で機能しますが、プライベート配列をグローバル配列と結合する方法がわかりません。

ありがとう。

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

header - PGI コンパイラ エラー「インクルード ファイル bits/c++config.h が見つかりません」

私は C で書いており、Ubuntu OS で pgi コンパイラを使用しています。作成した関数を含むヘッダー ファイルをインクルードしたいと考えています。私のコードでは

ただし、コンパイルするとエラーが発生します

かっこ内のディレクトリは、ワークステーションで bits/c++config.h ファイルが配置されている正確な場所です。また、コードで「#include」ステートメントを削除すると、すべて正常に動作します。さらに、パスに「/opt/pgi/linux86-64/16.7/include」を追加しても、まだエラーが発生します私は何を間違っていますか?

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

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 が有効なルーチンをサポートしていますか?

もしそうなら、私は何を間違っていますか?

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

cmake - cmake 混合言語プロジェクトで FORTRAN リンカーを使用する

混合言語プロジェクト (C/C++ および FORTRAN) に CMake を使用すると、実行可能ファイルをリンクするために C++ コンパイラが呼び出されます。リンク手順で FORTRAN コンパイラを呼び出す簡単な方法はありますか。

これは FORTRAN コンパイラで正しくコンパイルされますが、リンク ステップで C++ コンパイラが呼び出され、たとえば PGI などの一部のコンパイラ スイートで問題が発生します。

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

nvcc - openacc - ta=multicore と ta=nvidia のコンパイルの不一致

私はもともと OpenMP で書かれたコードを持っています。今、それを OpenACC に移行したいと考えています。以下を検討してください。

1- まず、OpenMP の出力結果は最終結果と見なされ、OpenACC の出力はそれに続く必要があります。

2- 次に、端末のプログラムへの入力によって有効になるコードに 2 つの機能があります。したがって、入力フラグに基づいてF1orが実行されます。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 です。

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

cuda - OpenACC の固定メモリ (PGI コンパイラを使用)

OpenACC に変換した単純な CUDA コードがあります。すべてのカーネルは期待どおりに並列化され、CUDA カーネルと同様のパフォーマンスを発揮します。ただし、デバイスからホストへのメモリ転送によりパフォーマンスが低下します。私の CUDA コードでは固定メモリを使用しており、パフォーマンスが大幅に向上しています。残念ながら、OpenACC では固定メモリを利用する方法がわかりません。ドキュメントには何も見つかりませんでした。固定メモリを利用する簡単な OpenACC の例を教えてもらえますか?

PS: PGI 16.10-0 64 ビット コンパイラを使用しています。