0

cuda fortran を使用してコードを高速化しようとしています。このコードは、cuda を使用したデバイス コードでは無効な変数の定義で common ステートメントを使用しています。

私がしたことは、共通ステートメントを使用する代わりにモジュールで変数を定義することですが、これは間違った答えになります。一般的なステートメントの代替を見つけるために、これらすべてを通常のコードで実行しています。

コード(共通)

コード(共通なし)

これらの変数はこれらの関数でのみ使用されるため、このように機能するはずですが、そうではありません。何故ですか?そして、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

ファイルを調べたところ、OpenACC for Fortran を使用していることがわかりました。これは、私が CUDA Fortran と呼ぶものではありません。それがあなたの意図であり、実際に CUDA fortran を使用するつもりはなく、代わりに OpenACC コードを正しく動作させようとしていると仮定します。

2つの提案があります。

  1. 具体的に。どの変数、どの関数が正しく機能していないか、どのような結果が得られ、どのような結果が期待されるか? 最良のシナリオは、コードのファイル全体を質問に投げ込むのではなく、短く完全でコンパイル可能な例を提供することです。機能していない特定の例に問題を絞り込みます。
  2. !acc kernels繰り返しますが、あなたの意図が OpenACC fortran を使用することであると仮定すると、ディレクティブの使用方法について少なくともある程度のアイデアがあることをすでに示しています。私はあなたのコードをざっと見てみましたが、あなたが囲んでいたループはそれほど複雑に見えませんでした. 私の提案は、これらのループに必要な (入力) データと、これらのループから生成 (出力) されるすべてのデータを特定し、追加!acc dataのディレクティブを含めて、これらcopyinを入力データおよびcopyout出力データとして指定することです。具体的な例/チュートリアルがここに示されています。そうは言っても、コンパイラがデータを使用しようとしているときにデータがスコープ内にある限り、!acc kernels地域、間違った結果を得るべきではないと思います。しかし、これをさらに追求するには、具体的な例が適切だと思います。一般に、!acc dataディレクティブを使用すると、必要なデータに注意を向けることができ、デバイスとの間でデータを転送する方法とタイミングをコンパイラが理解できるようになります。

既に述べたように、リンクを含めるのではなく、他の人に見てもらいたいコード例を実際の質問に貼り付けてください。

于 2013-07-24T04:36:23.990 に答える