問題タブ [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.
c++ - OpenACC 並列カーネルが生成されない
コードをグラフィカルに高速化するために、PGC++ でコードを開発しています。
- Eigen に依存する OpenBabel を使用しています。
- #pragma acc kernel を使ってみた
- #pragma acc ルーチンを使用してみました
- 私のコンパイル コマンドは次のとおりです。 pranav/new_installed/lib/openbabel/main.cpp/home/pranav/new_installed/lib/libopenbabel.so"
次のエラーが表示されます
注: 66 行目は「mol.SetTorsion(a[0],a[1],a[2],a[3],i*(3.14159265358979323846/180));」です。以下の貼り付けられたボードで。
このエラーを表示している私のコードは次のとおりです。
Googleでの一次検索から、これはmol(OBMolオブジェクト)の「後方依存」のために発生しているエラーであることがわかりました。誰かがそれに対する解決策を知っているなら、私を助けてください。
fortran - Intelコンパイラでの「use ifcore」に相当するPGI
私は現在、もともと Intel コンパイラ用に設計された PGI を使用したモデルのコンパイルに取り組んでいます。スクリプトの 1 つは、use ifcore
その他のランタイム ライブラリにリンクする Intel 固有のコマンドです。PGI に相当するもの (Linux マシン用) を見つけるのに苦労しています...何かアイデアはありますか?
私は見ていましdflib
たが、それはWindows固有のようです。現在、mpif90 を使用してモデルをコンパイルしています。
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.c
pgacclnk
nvlink
私の質問:
- 私は間違った道を進んでいますか?GCC から PGI コンパイル ライブラリの関数を呼び出し、それらの関数内で OpenACC を使用できますか?
- 上記の回答が肯定的である場合、PGI が行う手順 (呼び出し
pgacclnk
と) なしで、まだリンクを使用できますか?nvlink
- 上記の回答も肯定的である場合、どうすればよいですか?
gcc - c - PGI OpenACC 対応ライブラリを gcc に動的にリンクする
以前、PGI で静的ライブラリを作成し、それを gcc でビルドされたプログラムにリンクする方法について質問しました: c - PGI OpenACC 対応ライブラリを gcc でリンクする
今、同じ質問がありますが、動的です。ライブラリがPGIで動的にビルドされているときに、gcc でプログラムをビルドするにはどうすればよいですか?
また、次の事実を考慮します。
両方が同じ OpenMP プラグマとルーチンも認識できるようにします。たとえば、ライブラリで OpenMP クリティカル領域を使用する場合、プログラム全体をそのセクションでシリアル化する必要があります。
OpenACC プラグマは、PGI でビルドされたライブラリで使用されます。
アプリケーションでライブラリを完全に動的にロードします。
dlopen
libを開いdlsym
て関数を見つけるために使用することを意味します。また、スレッドがデータ転送や計算のために GPU に同時にアクセスできるようにしたいと考えています。詳細については、次のコード スニペットを参照してください。
たとえば、次のライブラリとメイン コードをビルドすると、次のエラーが発生します。call to cuMemcpyHtoDAsync returned error 1: Invalid value
注:次のコードをビルドするとき、lib と main の両方のケースで、-lgomp
PGI の 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
私は何か間違ったことをしていますか?上記の手順は正しいですか?
arrays - サブルーチンに渡された配列を割り当てる PGI FORTRAN90 (seg fault)
これは、PGI fortran コンパイラを使用してコンパイルしている fortran90 コードです。セグフォルトなしでは、サブルーチン内で配列を割り当てることができないようですarraySub()
。配列が次のように割り当てられているかどうかを確認しても、エラーが発生しますallocated(theArray)
。次のようにコマンドラインでコードをコンパイルしています。pgf90 -o test.exe test.f90
and で初期化しているため、サブルーチンtheArray
内で割り当てられない理由について混乱しています。特に奇妙なのは、セグ フォールトもあるということです。誰かが私を正しい方向に向けて解決できるかどうか疑問に思っていました。前もって感謝します!arraySub
intent(inout)
allocatable
allocated(theArray)
編集:重複した質問には実際のサンプルコードがないため、モジュールを使用してソリューションを投稿します:
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 ビット バージョンを使用しています。
有効な配列を使用しているので、エイリアシングは問題になりませんよね? これはバグですか?