問題タブ [openacc]
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 - OpenACC ループでは、各スレッドはスカラーのプライベート コピーを取得しますか?
私は非常に単純なコードフラグメントを持っています:
もちろん、x
簡単に省くことができますが、これは一例でありx
、私の質問のポイントです。ここにあるすべてのスレッドは、自動的に独自のコピーを取得しますか?x
それとも、さまざまなスレッドが破壊されないようにするために、それをプライベートに宣言する必要がありますか?それ?
openacc - CUDA コードを含まない NVPROF を実行するには?
アップグレードする前に、cuda コードを含まない標準の Fortran コードをベースライン化したい。私はそれを行うことができますか?
pragma - OpenACC データ移動
私は OpenACC を初めて使用し、データの移動と「#pragma acc data」句についてよく理解していません。
C で書かれたプログラムがあります。コードからの抜粋は次のようになります。
IntersectionsCount の値は 210395 です。上記のコードをコンパイルして実行した後、次のようにします。
私はこの出力を持っています:
出力を読んだ後、いくつか質問があります。
- 行 31 には acc プラグマがないため、なぜ行 31 と言ったのかわかりません。追跡できないということですか?
- 「31: kernel launched 210395 times」という行に、カーネルを 210395 回起動したと書かれています。この部分は 5,451,647(us) かかり、少し長いと思うので、カーネルを何度も起動する必要があるのが正常かどうかはわかりません。for ループは単純で、それほど時間はかからないと思います。プラグマの使い方が間違っていませんか?
更新 プログラム
用のヘッダー ファイルがいくつかあります。しかし、これらのファイルには「acc data」または「acc kernels」プラグマがありません。
「-Minfo=all」でコードをコンパイルすると、結果は次のようになります。
この方法でintersectionSetを作成します:
cuda - nvprof がデータを返さない原因は何ですか?
OpenACC を備えた Fortran MPI コードがあります。ビッグコードです。ここで意味のあるスニペットを提供することはできません。Cray aprun で問題なく動作します:
nvprof でプロファイリングしたい。私は試します:
コードは再び正常に実行されますが、すべてが完了したら、プロファイリング データは取得されず、メッセージのみが表示されます。
他にエラー メッセージは表示されません。何がこの動作を引き起こすのか誰にも分かりますか? Cray MPI Fortran コンパイラでコンパイルしています。私のコンパイルフラグは
cudatoolkit
モジュールがロードされます。
gcc - GCC には pgcc の -Minfo=accel と同様のパラメーターがありますか?
OpenACC を使用して NVIDIA GPU にオフロードするコードを GCC でコンパイルしようとしていますが、上記のものと同様のコンパイラ オプションを見つけることができませんでした。オフロードに関連するすべての操作をより詳細にするように GCC に指示する方法はありますか?
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
私は何か間違ったことをしていますか?上記の手順は正しいですか?
gcc - OpenACC/OpenMP4.0 の nvidia/mic へのオフロードを GCC で機能させるには何が必要ですか?
OpenACC を使用して計算を GCC 5.3 上の nvidia GPU にオフロードする方法を正確に理解しようとしています。物事をグーグルで検索すればするほど、私は混乱します。私が見つけたすべてのガイドは、 gcc 全体とnvptx-tools
とnvptx-newlib
. 他の情報源によると、OpenACC は GOMP ライブラリの一部です。他のソースによると、OpenACC サポートの開発は GCC 6.x でのみ継続されます。また、OpenACC のサポートが GCC のメイン ブランチにあることも読みました。-fopenacc
ただし、 andを使用してプログラムをコンパイルすると、動作しません-foffload=nvptx-non
。gcc 5.3+でOpenACCコードをコンパイラして実行するのに何が必要かを誰かが説明してくれますか?
- 一部のインターネット ソースが言うように、OpenACC サポートが GCC のメイン ブランチの一部である場合、一部のガイドで
nvptx-tools
、 、および GCCの (再) コンパイルが必要なように見えるのはなぜですか?nvptx-newlib
- この中で GOMP ライブラリの役割は何ですか?
- OpenACC サポートの開発は、今後 GCC 6+ に対してのみ行われるというのは本当ですか?
- OpenACC のサポートが成熟したら、OpenMP を有効にするのと同様の方法 (つまり、コンパイラ フラグをいくつか追加するだけ) で有効にすることが目標ですか?
- 「OpenACC」を「OpenMP 4.0 GPU / MICオフロード機能」に置き換えた後、誰かが上記のすべてに対する回答を提供できますか?
前もって感謝します