-2

私はもともと 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 です。

4

1 に答える 1

0

2 つのアーキテクチャ間にいくつかの不一致があった理由は、ホストとデバイス間のデータ転送が正しくないためです。ある時点で、ホストはデータを再分散するためにいくつかの配列を必要としました。

Mat Colgrove からのコメントのおかげで、犯人の配列を見つけ、それを正しく転送することで問題を解決しました。

最初に、ユニファイド メモリ ( -ta=nvidia:managed) を有効にして、アルゴリズムにエラーがないことを確認しました。これは私を大いに助けました。managedそのため、コードを調査して問題の原因となっている配列を見つけるために削除しました。

次に、マットのコメントに基づいて次の手順に従いました(非常に役立ちます):

これは、ホスト データまたはデバイス データが更新されないという同期の問題があることを意味します。非構造化データ領域または複数の計算領域にまたがる構造領域を使用していると想定しています。この場合、ホストとデバイスのコピーを同期する各コンピューティング領域の前後に「update」ディレクティブを配置します。次に、各変数を体系的に削除します。失敗した場合は、アップデートに保管してください。最後に、問題の原因となっている変数がわかったら、それらの使用状況を追跡し、update ディレクティブを使用するか、計算領域を追加します。

于 2017-01-05T21:07:44.623 に答える