問題タブ [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.
cuda - PGI アクセラレータ Fortran コードのエラー
これは私のコードです
並列化に PGI アクセラレータ ディレクティブを使用していますが、表示されています
「コンパイラはアクセラレータ領域の変換に失敗しました (-Minfo メッセージを参照): ステップ値がゼロのインダクション変数」
cuda - Visual C++ での OpenACC
コードを OpenACC ディレクティブで並列化したい。クロスプラットフォーム API だそうです。開発会社は、VisualStudio の OpenACC に関する情報を提供していません。それを行う方法はありますか?
cuda - OpenACC を使用して行列の乗算を最適化する方法は?
私は OpenACC (PGI のコンパイラを使用) を学習しており、行列乗算の例を最適化しようとしています。これまでに思いついた最速の実装は次のとおりです。
これにより、サイズ 32x32 スレッドのスレッド ブロックが生成され、これまでのところ最高のパフォーマンスが得られます。ベンチマークは次のとおりです。
残念ながら、生成された CUDA コードは非常に原始的 (共有メモリを使用していないなど) であるため、手動で最適化された CUDA プログラムと競合できないことに気付きました。リファレンス実装として、Arrayfire lib を使用して次の結果を得ました。
OpenACC からより良いパフォーマンスを得る方法について何か提案があるのだろうか? おそらく、ディレクティブの選択が正しくないのでしょうか?
cuda - 多次元配列のコピー OpenACC
GPU にコピーしようとしている 2D マトリックス SIZE x SIZE があります。
この方法で行列を割り当てます。
そして、私はACC地域にこれを持っています:
-Minfo=acc を使用して PGI コンパイラでコンパイルすると、コンパイラは次のように通知します。
[0:1024][0:] とはどういう意味ですか? なぜ[0:1024][0:1024]ではないのですか???
行列を宣言する代わりに、サイズ SIZE*SIZE の配列を宣言すると、
次のコンパイラ メッセージを生成します。
コードは実際には同じように機能し、同じパフォーマンス、同じ結果になります。
どうやらどちらの方法でも、コンパイラは同じコードを生成するはずですが、メッセージは簡単ではありません。
Linux64 マシンで PGI アクセラレータ 12.8 を使用しています。-Minfo=acc でコンパイルしています
注: この質問は編集されており、今ではあまり意味がありませんが、より多くの人にとって役立つ可能性があります。
cuda - OpenACC: '*(*(b))' の複雑なループ実行依存により、並列化が妨げられます
動的配列割り当てで OpenACC を使用しています。これが私が割り当てる方法です:
そして、これが行列の追加をどのように並列化するかです:
このコードをコンパイルすると、ループの繰り返しでポインターpgcc
への依存関係が検出float**
され、すべてのスカラー カーネル (ブロックごとに 1 ブロック 1 スレッド) が生成されますが、期待どおりのパフォーマンスは得られません。
ループは明らかに並列であり、これはコンパイラーでも検出できると思います。私はそれを説明する方法に興味がありますpgcc
か?
前もって感謝します。
cuda - OpenACCでの共有メモリの使用
共有メモリを使用してOpenACCでキャッシュしようとしています。
基本的に私が取り組んでいるのは行列の乗算であり、私が持っているのはこれです:
私がやりたいのは、CUDA mmulアルゴリズムと同様の方法で、共有メモリを使用して行列「a」と「b」のタイルをキャッシュし、「c」の計算に使用することです。
基本的にCUDAでは、ブロックの正確なサイズがわかり、次のことができるようになります。
- ブロックのサイズで共有メモリを宣言する
- データの「関連する」部分をブロックにコピーします
- このデータを使用する
私は使用できることを理解しています
ディレクティブであり、vectorおよびgangオプションを使用してブロックサイズを指定できますが、それがCUDAアーキテクチャにどのようにマッピングされるかを理解するのに問題があります。
OpenACCで同様のことを達成する方法はありますか?キャッシュされたディレクティブの使用や、共有メモリの能力の一部をCUDAからOpenACCにマッピングする方法に関する優れたチュートリアル/リソースはありますか?
gpu - OpenACC red-black Gauss-Seidel は CPU より遅い
ラプラス方程式 (単純な熱板問題) の赤黒ガウス ザイデル ソルバーに OpenACC ディレクティブを追加しましたが、GPU で高速化されたコードは、大規模な問題であっても CPU よりも高速ではありません。
私は CUDA バージョンも作成しましたが、これは両方よりもはるかに高速です (512x512 の場合、CPU と OpenACC の 25 秒と比較して 2 秒程度)。
この不一致の理由を考えられる人はいますか? CUDA が最も潜在的な速度を提供することを認識していますが、OpenACC は、より大きな問題に対して CPU よりも優れたものを提供する必要があります (ここで示されているのと同じ種類の問題に対するヤコビ ソルバーのように)。
関連するコードは次のとおりです (完全な作業ソースはこちらです)。
c++ - C/C++ および GNU/PGI: `__pgio_ini' への未定義の参照
PGI Compiler バイナリを既存の GNU バイナリにリンクする方法はありますか? リンクしようとすると、次のエラーが表示されます。
詳細:
gcc と g++ でいくつかのファイルをコンパイルしました。Cmain
関数はこれらのファイルに含まれています。ここで、OpenACC 関数をプロジェクトに追加する必要があります。これは、PGI C コンパイラ ( pgcc
) によってコンパイルする必要があります。コンパイル後、上記のリンク エラーが発生します (エラーは両方pgCC
またはg++
リンカーと同じです)。
おそらく、OpenACC 関数をダミー ライブラリに統合し、それをプロジェクトにインクルード/リンクする必要があります。しかし、私はそれを行う方法がわかりません。
残念ながら、一部の関数は GNU Compiler に依存しているため、プロジェクト全体を PGI Compiler でコンパイルすることはできません。
前もって感謝します。
cuda - NVCC5.0およびOpenACC
NVIDIAのウェブサイトによると:
「CUDAツールキットは、OpenACCディレクティブを使用したプログラミングを補完し、完全にサポートします。」
OpenACCプログラム(pargmaとAPI)をnvcc
コンパイラーでコンパイルできるということですか?または、ランタイムルーチン呼び出しのみがサポートされていることを意味しますか?
残念ながら、最近はCUDAToolkit5.0をインストールして答えを得ることができません。ありがとう!
cuda - カーネル構造と並列構造の違い
私は多くの記事と OpenACC のマニュアルを調べていますが、これら 2 つの構造の主な違いはまだわかりません。