私の博士号の一環として。研究では、大気と海洋循環の数値モデルの開発に取り組んでいます。これらには、約 10^4 時間ステップにわたって、約 10^6 格子点の PDE のシステムを数値的に解くことが含まれます。したがって、典型的なモデル シミュレーションは、数十の CPU で MPI を実行すると、完了するまでに数時間から数日かかります。当然のことながら、結果がバイトごとに同一であることを確認しながら、可能な限りモデルの効率を改善することが重要です。
私は自分の Fortran プログラミングに非常に満足しており、コードをより効率的にするためのいくつかのトリックを認識していますが、まだ改善の余地があり、気付いていないトリックがあると感じています。
現在、使用する除算をできるだけ少なくし、リテラル定数を使用しないようにしています (非常に早い段階からこれを行うように教えられました。たとえば、実際の計算では 0.5 の代わりに half=0.5 を使用します)。超越関数はできるだけ使用しません。などなど。
他にどのようなパフォーマンスに敏感な要素がありますか? 現時点では、私はいくつかについて疑問に思っています:
1) 数学演算の順序は重要ですか? たとえば、私が持っている場合:
a=1E-7 ; b=2E4 ; c=3E13
d=a*b*c
乗算の順序に基づいて異なる効率で評価しますか? 現在、これはコンパイラ固有のものでなければなりませんが、明確な答えはありますか? d が次数 (精度限界) に基づいて (わずかに) 異なる値を取得していることに気付きましたが、これは効率に影響しますか?
2) サブルーチン内のモジュールからこれらの配列にアクセスするのと比較して、サブルーチンへの引数として多数 (たとえば、数十個) の配列を渡しますか?
3) Fortran 95 構造 (FORALL および WHERE) と DO および IF との違いは? コードのベクトル化が大きな問題だった 90 年代にこれらが重要だったことは知っていますが、明示的な DO ループをベクトル化できる最新のコンパイラーとの違いはありますか? (私は仕事で PGI、Intel、および IBM コンパイラーを使用しています)
4) 数値を整数乗するか、掛け算するか? 例えば:
b=a**4
また
b=a*a*a*a
私は、可能な場合は常に後者を使用するように教えられてきました。これは効率や精度に影響しますか? (おそらくコンパイラにも依存します)
Fortran コードの効率を改善するために知っているトリックやヒントがあれば、議論したり追加したりしてください。他に何がありますか?上記の各コンパイラがこの質問に関連して何をするかについて何か知っている場合は、それも含めてください。
追加: ボトルネックやパフォーマンスの問題自体はありません。操作の意味でコードを最適化するための一般的なルールがあるかどうかを尋ねています。
ありがとう!