80

私は最近、科学計算を多用する大量の FORTRAN コードを保守するようになりました。Google と 2 つの入門レベルの本があるにもかかわらず、たとえば 40 年前の言語のすべてのニュアンスを理解するのに苦労しています。コードには「パフォーマンス向上の改善」が盛り込まれています。FORTRAN を CS 101 レベルに最適化解除するためのガイドや実用的なアドバイスはありますか? FORTRAN コードの最適化がどのように行われたかを知っている人はいますか? FORTRAN 77/90 コードベースを引き継いで Java/C++/.NET で育った開発者には起こらない、典型的な FORTRAN の「落とし穴」はありますか?

4

10 に答える 10

89

プログラマーがその日に何をしなければならなかったかについて、あなたは一種の「感覚」を得る必要があります。私が使用しているコードの大部分は私よりも古く、両親が高校生のときに「新しい」マシンで実行されていました。

私が扱っている一般的なFORTRAN-ismは、読みやすさを損なうものです。

  • 共通ブロック
  • 暗黙の変数
  • 共有CONTINUEステートメントを使用した2つまたは3つのDOループ
  • DOループの代わりにGOTO
  • 算術IFステートメント
  • 計算されたGOTO
  • いくつかの一般的なブロックでの同等性REAL/INTEGER / other

これらを解決するための戦略には、次のものが含まれます。

  1. Spag / plusFORTを入手してください、お金の価値があります、それはそれらの多くを自動的に解決し、Bug Free(tm)
  2. 可能であればFortran90に移行し、そうでない場合は自由形式のFortran77に移行します。
  3. 各サブルーチンにIMPLICITNONEを追加してから、すべてのコンパイルエラーを修正します。時間はかかりますが、最終的には必要です。一部のプログラムでは、これを自動的に実行できます(またはスクリプト化できます)。
  4. すべてのCOMMONブロックをMODULEに移動します。
  5. 算術IFステートメントをIF..ELSEIF..ELSEブロックに変換します
  6. 計算されたGOTOをSELECTCASEブロックに変換します
  7. すべてのDOループを新しいF90構文に変換します

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. 同等の共通ブロックメンバーを、モジュールに割り当てられたALLOCATABLEメモリに変換するか、ホレリスがREALに格納されている場合はそれらの真の文字ルーチンに変換します。

読みやすさのタスクを実行する方法についてより具体的な質問がある場合は、アドバイスを提供できます。私は40年の間に書かれた数十万行のFortranのコードベースを持っており、何らかの形で責任を負っています。そのため、おそらくあなたが見つけた「問題」に遭遇したことがあります。

于 2008-09-15T22:29:44.433 に答える
32

レガシー Fortran ソープボックス

私はかなり長い間、レガシー Fortran コード ベースの維持/改善を支援してきまし。ただし、そのアドバイスは技術的な傾向があります。くわえるのがより難しいのは、「優れた慣行」を実装することです。

  • 必要なコーディング スタイルとコーディング ガイドラインを確立します。
  • コードベースに提出されたものすべてについて、コードレビュー (コーダーだけでなく!) を要求します。(バージョン管理はこのプロセスに関連付ける必要があります。)
  • 単体テストの構築と実行を開始します。同上ベンチマークまたは回帰テスト。

これらは最近では当たり前のことのように聞こえるかもしれませんが、過度に一般化する危険を冒して、ほとんどの Fortran コード ショップには定着した文化があり、「ソフトウェア エンジニアリング」という用語が存在する前に始まったものもあります。 「今すぐやりなさい」です。(これは決して Fortran ショップに固有のものではありません。)

落とし穴を受け入れる

しかし、既存の汚れた古いレガシー コード ベースをどうするのでしょうか? 書き直しについて Joel Spolsky に同意します。ただし、私の意見では、sixlettervariablesは許容される例外を示しています。ソフトウェア ツールを使用して、より優れた Fortran 構造に移行します。コード アナライザー ( FORCHECK ) とコードリライター ( plusFORT )によって多くのことがキャッチ/修正されます。手作業で行わなければならない場合は、差し迫った理由があることを確認してください。(ソフトウェアのバグを修正することで発生したソフトウェアのバグの数についての参照が手元にあればいいのにと思います。それは恐縮です。そのような統計の一部はExpert C Programmingにあると思います。)

おそらく、Fortran の落とし穴のゲームに勝つための最大の攻撃は、最良の防御を持つことです。それは、言語をかなりよく知っていることです。その目的をさらに進めるために、私は...本をお勧めします!

Fortran デッド ツリー ライブラリ

私は何年にもわたって「QAナグ」としてささやかな成功を収めてきましたが、教育は時には不注意にも機能し、最も影響力のあるものの1つは誰かが手元に持っている参考書であることを発見しました. 私は大好きで、強くお勧めします

科学者と技術者のための Fortran 90/95、 Stephen J. Chapman 著

この本は、使用すべきではない構造を具体的に識別し、より良い代替手段を提供するという点で、Fortran 77 との相性も良いです。ただし、これは実際には教科書であり、Fortran 95 の詳細を知りたい場合は力尽きてしまう可能性があるため、お勧めします。

Fortran 90/95 の説明、Michael Metcalf & John K. Reid 著

Fortran 95 の頼りになるリファレンス (原文ママ) として。これは最も明快な記述ではないことに注意してください。ただし、新しい Fortran 95 機能を最大限に活用したい場合はベールがはがれます。

Fortran 77 から Fortran 90 への移行の問題に焦点を当てたので、

Fortran 90 への移行、ジム・ケリガン著

しかし、その本は現在絶版です。(O'Reilly のSafariの使用方法がわかりません。絶版になった書籍がすべて入手できないのはなぜですか?)

最後に、素晴らしい、素晴らしいクラシックの後継者であるSoftware Toolsについて、私は次のように述べています。

クラシック FORTRAN、 Michael Kupferschmid 著

この本は、Fortran 77 だけで何ができるかを示すだけでなく、発生するより微妙な問題 (たとえば、EXTERNAL 宣言を使用する必要があるかどうかなど) についても説明します。この本は、「ソフトウェア ツール」とまったく同じ領域をカバーしているわけではありませんが、私が「楽しい」とタグ付けした 3 つの Fortran プログラミングの本のうちの 2 つです.... (ここでは 3 番目です)。

ほとんどすべての Fortran コンパイラに適用されるその他のアドバイス

  • IMPLICIT NONE の動作を強制するコンパイラ オプションがあります。これを使用すると、最初に IMPLICIT NONE 宣言を使用してルーチンを変更することなく、問題のルーチンを特定できます。このアドバイスは、従来のルーチンに挿入された IMPLICIT NONE コマンドが原因でビルドが最初に失敗するまで意味がないように思われます。(なに? あなたのコードレビューはこれをキャッチできませんでした? ;-)
  • Fortran 77 コードをデバッグするときに役立つ、配列境界チェック用のコンパイラ オプションがあります。
  • Fortran 90 コンパイラは、ほとんどすべての Fortran 77 コードと、さらに古い Fortran コードをコンパイルできるはずです。Fortran 90 コンパイラのレポート オプションをオンにして、レガシー コードを実行すると、構文チェックが適切に開始されます。一部の商用 Fortran 77 コンパイラは、実際には Fortran 77 モードで実行される Fortran 90 コンパイラであるため、ビルド スクリプトが何であれ、これは比較的簡単なオプション調整である可能性があります。
于 2008-10-03T19:43:15.973 に答える
24

There's something in the original question that I would caution about. You say the code is rife with "performance enhancing improvements". Since Fortran problems are generally of a scientific and mathematical nature, do not assume these performance tricks are there to improve the compilation. It's probably not about the language. In Fortran, the solution is seldom about efficiency of the code itself but of the underlying mathematics to solve the end problem. The tricks may make the compilation slower, may even make the logic appear messy, but the intent is to make the solution faster. Unless you know exactly what it is doing and why, leave it alone.

Even simple refactoring, like changing dumb looking variable names can be a big pitfall. Historically standard mathematical equations in a given field of science will have used a particular shorthand since the days of Maxwell. So to see an array named B(:) in electromagnetics tells all Emag engineers exactly what is being solved for. Change that at your peril. Moral, get to know the standard nomenclature of the science before renaming too.

于 2008-09-22T18:46:37.350 に答える
7

FORTRAN (本格的に使ってからしばらく経ちましたが 77 フレーバー) と C/C++ の両方の経験がある人として、すぐに気をつけなければならないのは配列です。FORTRAN 配列は、C/C++/Java のように 0 ではなく 1 のインデックスで始まります。また、メモリ配置が逆になります。したがって、最初のインデックスをインクリメントすると、連続したメモリ位置が得られます。

私の妻は今でも定期的に FORTRAN を使用しており、私が彼女の手伝いを始めようとしている今、作業が必要ないくつかの C++ コードを持っています。彼女の改宗中に問題が発生したので、私はそれらを指摘しようとします. 多分彼らは助けるでしょう。

于 2008-08-28T13:14:58.193 に答える
6

私は 1967 年以来、'66 バージョンから Fortran を使用してきました (32k ワードのメモリを持つ IBM 7090 上で)。それからしばらくの間 PL/1 を使用しましたが、後で Fortran 95 に戻りました。これは、私たちが抱えている行列/複素数の問題に理想的に適しているからです。古いコードの複雑な構造の多くは、単に利用可能なメモリ量が少ないためであり、計算されたまたは割り当てられた s を介して数行のコードを再利用するなどのことを余儀なくされているという考慮事項に追加したいと思いますGOTO。もう 1 つの問題は、繰り返される部分式ごとに補助変数を定義することによる最適化です。コンパイラは、単純にそれを最適化しませんでした。さらに、書き込みは許可されていませんでしたDO i=1,n+1。あなたは書かなければなりませんでしたn1=n+1DO i=1,n1. その結果、古いコードは余分な変数に圧倒されます。Fortran 95 でコードを書き直したとき、生き残った変数は 10% だけでした。コードを読みやすくしたい場合は、簡単に削除できる変数を探すことを強くお勧めします。

私が言及するかもしれないもう 1 つのことは、長年にわたり、複雑な算術および多次元配列は非常に非効率的であったということです。そのため、実変数のみを使用して複雑な計算を行うようにコードが書き直され、単一の線形インデックスでアドレス指定された行列がよく見られます。

于 2012-01-11T11:16:06.723 に答える
5

コードを維持するために何をしなければならないか説明していただけますか?本当にコードを変更する必要がありますか?コード自体ではなく、そのコードへのインターフェースだけを変更することで逃げることができれば、それが最善でしょう。

(FORTRANだけでなく)大規模な科学コードを扱う場合の固有の問題は、基礎となる数学と実装の両方が複雑であるということです。ほとんどデフォルトでは、妥当な時間枠内で実行するために、実装にはコードの最適化を含める必要があります。これは、この分野の多くのコードが、その分野の専門家であるがソフトウェア開発の専門家ではない科学者/エンジニアによって作成されているという事実によってさらに複雑になっています。「理解しやすい」が彼らの最優先事項ではないとだけ言っておきましょう(私は彼らの1人でしたが、それでもより優れたソフトウェア開発者になることを学んでいます)。

問題の性質上、一般的な質問と回答だけでは十分ではないと思います。コードスニペットを添付して、一連の具体的な質問を投稿することをお勧めします。おそらくあなたに最も頭痛を与えるものから始めますか?

于 2008-09-17T07:58:00.177 に答える
5

Fortran には、微妙なフロー制御構造や継承などの方法があまりないからです。他方では、算術的に計算されたブランチから数値ラベルへの変換、宣言を必要としない暗黙的に型指定された変数、真のキーワードの欠如など、本当に驚くべき落とし穴があります。

「パフォーマンス向上の改善」についてはわかりません。数十年にわたるコンパイラ技術により、ほとんどのヒントが不要になったため、それらのほとんどはおそらく効果がないと思います。残念ながら、大規模な書き直しを計画していない限り、おそらく現状のままにしておく必要があります。

いずれにせよ、コアの科学計算コードはかなり読みやすいはずです。中置算術を使用するプログラミング言語は、Fortran の算術および代入コードを読むための適切な準備になります。

于 2008-08-28T05:01:25.947 に答える
4

私は FORTRAN が大好きで、以前は FORTRAN で教えたりコーディングしたりしていました。それを入れたかっただけです。何年も触れていません。
私は COBOL から始めましたが、FORTRAN に移行したとき、解放されたと感じました。すべては相対的ですよね?私は上で述べたことを二番目に考えます - これは手続き型言語であることを認識してください - 細​​かい部分はありません - ですから、あなたがそれを見るように受け取ってください.
おそらく最初はイライラするでしょう。

于 2008-11-21T15:01:06.913 に答える
1

これは時々私を噛んだ別のものです。FORTRANコードで作業しているときは、最初の6列すべてをスキップしてください。時々、コードが5スペースだけインデントされ、何も機能しません。一見、すべてが問題ないように見えますが、最終的に、すべての行が7列ではなく6列から始まっていることに気付きます。

FORTRANに精通していない人のために、最初の5列は行番号(=ラベル)用であり、6番目の列は80文字より長い行がある場合の継続文字用です(ここに何かを入力すると、コンパイラーはこの行を認識します実際にはその前の一部です)、コードは常に列7から始まります。

于 2008-09-10T14:12:57.370 に答える