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

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

cuda - PGI アクセラレータ Fortran コードのエラー

これは私のコードです

並列化に PGI アクセラレータ ディレクティブを使用していますが、表示されています

「コンパイラはアクセラレータ領域の変換に失敗しました (-Minfo メッセージを参照): ステップ値がゼロのインダクション変数」

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

cuda - OpenACC: '*(*(b))' の複雑なループ実行依存により、並列化が妨げられます

動的配列割り当てで OpenACC を使用しています。これが私が割り当てる方法です:

そして、これが行列の追加をどのように並列化するかです:

このコードをコンパイルすると、ループの繰り返しでポインターpgccへの依存関係が検出float**され、すべてのスカラー カーネル (ブロックごとに 1 ブロック 1 スレッド) が生成されますが、期待どおりのパフォーマンスは得られません。

ループは明らかに並列であり、これはコンパイラーでも検出できると思います。私はそれを説明する方法に興味がありますpgccか?

前もって感謝します。

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

fortran - より大きな規模のプログラムを実行している場合の OpenACC エラー

次のコードを使用すると、正しいですか? 私は 2GB の Geforce 750M を持っていて、PGI Fortran コンパイラを使用しています。プログラムは4000x4000配列に対して正常に動作しますが、それ以上のものは問題ありませんが、9000x9000配列が割り当てられていることがわかりますが、4000 を超える値を使用すると、エラーが発生し、ランタイム エラーがスローされます。

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

gcc - c - PGI OpenACC 対応ライブラリと gcc のリンク

簡単に言えば、私の質問は、ソースファイルでOpenACCコンストラクトを利用しながら、2つの異なるコンパイラを使用してファイルをコンパイル/ビルド(ライブラリを使用)することに依存しています。

OpenACC コンストラクトを持つ C ソース ファイルがあります。配列の総和を計算する単純な関数しかありません。

次の行を使用して簡単にコンパイルできます。

pgcc -acc -ta=nvidia -c libmyacc.c

次に、次の行で静的ライブラリを作成します。

ar -cvq libmyacc.a libmyacc.o

ライブラリを使用するために、次のようなコードを書きました。

これで、この静的ライブラリを PGI コンパイラ自体で使用して、上記のソースをコンパイルできます ( f1.c):

pgcc -acc -ta=nvidia f1.c libmyacc.a

そして、それは完璧に実行されます。ただし、gcc の場合は異なります。私の質問はここにあります。どうすればgccで正しくビルドできますか?

この質問に対する Jeff のコメント: linking pgicompiled library with gcc linkerのおかげで 、エラーなしでソース ファイル ( f1.c) をビルドできるようになりましたが、実行可能ファイルはいくつかの致命的なエラーを発します。

これは、ソース ファイルを gcc ( f1.c)でコンパイルするために使用するものです。

gcc f1.c -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lpgmp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc

これはエラーです:


PGI コンパイラで-vコンパイルするときのオプションのおかげで、コンパイラが PGI と NVidia から非常に多くの他のツール (や など) を呼び出すことがわかります。f1.cpgacclnknvlink


私の質問:

  1. 私は間違った道を進んでいますか?GCC から PGI コンパイル ライブラリの関数を呼び出し、それらの関数内で OpenACC を使用できますか?
  2. 上記の回答が肯定的である場合、PGI が行う手順 (呼び出しpgacclnkと) なしで、まだリンクを使用できますか?nvlink
  3. 上記の回答も肯定的である場合、どうすればよいですか?
0 投票する
1 に答える
436 参照

gcc - c - PGI OpenACC 対応ライブラリを gcc に動的にリンクする

以前、PGI で静的ライブラリを作成し、それを gcc でビルドされたプログラムにリンクする方法について質問しました: c - PGI OpenACC 対応ライブラリを gcc でリンクする

今、同じ質問がありますが、動的です。ライブラリがPGIで動的にビルドされているときに、gcc でプログラムをビルドするにはどうすればよいですか?

また、次の事実を考慮します。

  • 両方が同じ OpenMP プラグマとルーチンも認識できるようにします。たとえば、ライブラリで OpenMP クリティカル領域を使用する場合、プログラム全体をそのセクションでシリアル化する必要があります。

  • OpenACC プラグマは、PGI でビルドされたライブラリで使用されます。

  • アプリケーションでライブラリを完全に動的にロードします。dlopenlibを開いdlsymて関数を見つけるために使用することを意味します。

  • また、スレッドがデータ転送や計算のために GPU に同時にアクセスできるようにしたいと考えています。詳細については、次のコード スニペットを参照してください。

たとえば、次のライブラリとメイン コードをビルドすると、次のエラーが発生します。call to cuMemcpyHtoDAsync returned error 1: Invalid value


注:次のコードをビルドするとき、lib と main の両方のケースで、-lgompPGI の OpenMP ライブラリ ( ) の代わりに LibGOMP ( )を意図的に使用しました。-lpgmp


ライブラリコード:

次のコマンドでビルドされたライブラリ:

pgcc -acc -ta=nvidia:nordc -fPIC -c libmyacc.c

pgcc -shared -Wl,-soname,libctest.so.1 -o libmyacc.so -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lgomp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc libmyacc.o


メインコード:

そして、前の質問で Mat が説明したように、gcc を使用して次のコマンドでメイン コードをビルドしました。

gcc f1.c -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lgomp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc


私は何か間違ったことをしていますか?上記の手順は正しいですか?

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

alias - openacc - 配列のエイリアスにより、「配列の境界を判別できません」というエラーが発生する

ホストにサイズ N の配列があります。それを自分のデバイスに転送してから、エイリアスを割り当てて使用しようとします。しかし、「配列の境界を判別できません」というコンパイル エラーが発生します。

例:

上記のコードでは、次のエラーが発生します。

PGC-S-0155-Cannot determine bounds for array br (array.c: 15)

もっと具体的にこれを試してみてもdouble *br = &ar[0];、同じことが起こります。

cc20 デバイスで CUDA 7.5 で PGI 16.5 64 ビット バージョンを使用しています。

有効な配列を使用しているので、エイリアシングは問題になりませんよね? これはバグですか?

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

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

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

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

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

ありがとう。