私が知っている幅広い質問ですが:
Fortran プログラムの実行速度を上げるための一般的なヒントはありますか?
大まかな質問に対する大まかな答え:
while (the speed is not satisfied)
Use a profile to find the bottle neck
optimize that part of code.
他の人が提案しているように、コードを変更する前にプロファイルを作成してください。
しかし、あなたができる唯一の最善のことは、コンパイラのマニュアルを行ごと、単語ごとに注意深く読み、それが提供するすべてのオプションに注意を払うことです。私の経験では (計算電磁気学の HPC で多くの経験がありますが、ここで読んだことを信じる必要はありません!) コンパイラをインテリジェントに使用することにより、パフォーマンスの最適化において、費用対効果が最も高くなります。
コンパイラの可能性を使い果たしたら (そして、他の回答者の 1 人が提案したように、良いコンパイラがあることを確認してください。それらは高価ではなく、g95 から有料コンパイラ) の場合は、次のようなことを開始しないでください。
-- ループ展開;
-- 命令の並べ替え。
-- 関数のインライン展開。
-- 私たちがずっと昔にやっていた他のこと。
このコードの調整作業のほとんどは、優れた最適化コンパイラによって、炭素ベースの生命体ができるよりもうまく行われています。
いじる必要がある場合は、メモリ アクセスをいじります。たとえば、配列へのアクセスをタイル化して、キャッシュを利用します。これを行う場合は、タイル サイズ (など) をパラメーター化して、来年または翌年に別のアーキテクチャに移動するときに、コードを再度変更するのではなく、いくつかのパラメーターを微調整するだけで済むようにします。
最後に、楽しみましょう。Fortran プログラムのパフォーマンスを最適化することは、1 日を過ごすのに最適な方法です。
これは非常に広い分野ですが...
行列演算を行っている場合は、既製のライブラリを調べることを検討してください。それらはおそらくより高速で、一部はマルチスレッドをサポートしているため、マルチプロセッサ マシンでのパフォーマンスが向上します。
pierrが示唆するように、プロファイリング。これにより、プログラムが実際に時間を費やしている場所がわかります。これを知っていれば、実際に調整が必要な部分に注意を向けることができます。
キャッシュ ラインとワードのアライメントに加えて、チャンクを最適化してプロセッサ キャッシュに適合させます。これらは、C でこの種のことを制御する方が簡単であるため、C プログラミングに密接に関連していると見なされます。ただし、同じ問題が、ほぼ同じ理由で FORTRAN プログラムでも問題を引き起こす可能性があります。
最新の CPU でのキャッシュ ミス ペナルティは非常に大きく、キャッシュの使用を最適化すると、場合によっては桁違いの違いが生じる可能性があります。これを問題として認識した場合は、コア計算を C で書き直して、データ構造をよりきめ細かく制御できるようにすることをお勧めします。
あなたが本当にCPUに縛られているなら、GPUプログラミングのような技術からいくらかのマイレージを得るかもしれません.
誰もそれについて言及しなかったからです:
(どうか、私を殴らないでください:-) ...)
以下以外の Fortran 固有のものはありません。
利用可能ないくつかの資料もあります。たとえば、fortran 最適化をグーグルで検索すると、 this (PDF)およびthisが表示されます。ただし、古い文献とその仮定には注意してください。少し前まで、多くのプラットフォームの最適化ガイドは (当然のことながら) メモリが不足しており、メモリ アクセスは安価で、命令は高価であると想定していました。もうそうではありません。
私がよく知っている Fortran コードは、他の言語のコードとは大きく異なります。他の言語では、データ構造がはるかに支配的であり、抽象化のレイヤー、深い呼び出しスタック、過剰な呼び出しによる速度低下が伴います。
一方、Fortran は、大規模な配列を使用し、呼び出しの深さがあまりない、数学を多用するアルゴリズムに使用される傾向があります。これらでは、キャッシュの局所性の問題がはるかに大きくなり、アルゴリズムの問題も発生します。たとえば、私は非線形の混合効果モデリングに多く取り組んでいますが、許容誤差、前方または中心差分勾配、分析勾配などの問題は非常に重要です。ルンゲクッタ法、陰解法、行列指数、閉形式などの ODE 解法は、大きな違いを生みます。
また、(サンプリングによって) 真のホットスポット (つまり、PC がサブルーチンを呼び出さずに多くの時間を費やしている場所) であり、実際にコンパイルするコード (サードパーティのライブラリではなく) にあるコードのセクションを特定できる場合) 次に、コンパイラの最適化を上げると、違いが生じます。
個人的には、Fortran コンパイラが通常行う最適化の種類は気にしません。コードをスクランブルして、使用時間の割合が 1% 未満のコードのサイクルを削減し、デバッグを非常に困難にします。