web-dev-qa-db-ja.com

堅牢で「最新の」Fortranコードの作成

一部の科学的環境では、ほとんどの開発者がそのイディオムしか知らないため、多くのレガシーコードと関連する経験があるため、FORTRANなしではうまくいかないことがよくあります。そして率直に言って、high performanceプログラミングには他の多くのクロスプラットフォームオプションはありません(C++がタスクを実行しますが、構文、ゼロから始まる配列、およびポインターは一部の人々と互換性がありません)。

では、新しいプロジェクトを想定してみましょうmust Fortran 90を使用しますが、最新のコンパイラ(Intel ifortと互換性がありますが、Sun/HP/IBMコンパイラ)

だから私は常識として広く知られているものを課すことを考えていますが、私の環境ではまだ標準ではありません:

  • 禁止されたグローバル変数、ゴトスなし、ジャンプラベルなし、implicit noneなど.
  • 「オブジェクト指向プログラミング」(データ型と関連するサブルーチンを持つモジュール)
  • モジュラー/再利用可能な関数、十分に文書化された再利用可能なライブラリ
  • アサーション/前提条件/不変式(プリプロセッサステートメントを使用して実装)
  • すべての(ほとんどの)サブルーチンと「オブジェクト」の単体テスト
  • 激しい「デバッグモード」(#ifdef DEBUG)より多くのチェックと可能なすべてのインテルコンパイラチェック(配列の境界、サブルーチンインターフェイスなど)を使用
  • コード処理ツールヘルパーを使用した、統一された、読みやすいコーディングスタイル。

これらすべての目標は、信頼できる、保守可能なモジュール式のコードを作成することです。一方、多くのレガシーコードでは、再利用性は重要な目標ではありませんでした。

オブジェクト指向のFortran、契約によるプログラミング(アサーション/前提条件など)に関するリファレンスを探したところ、大規模なプロジェクトに関わっていない人が行った醜く古くなったドキュメント、構文、および論文、そして死んだプロジェクトしか見つかりませんでした。

このテーマに関する適切なURL、アドバイス、参考資料/本など

64
Blklight

私の5セント。

Fortran Wiki は良い出発点です。最新のFortranを使用したプログラミングのさまざまな側面に関する記事があります。ユニットテスト、デバッグ、汎用プログラミングなど。Fortran2003標準のコンパイラサポートについても非常に興味深い table が利用可能です。 (Blklightがすでに言及したように、2003の機能の一部はコンパイラーでは使用できません。異なるコンパイラーを比較するのに適した場所です。)

私はC++の人ですが、いくつかのF90プロジェクトで立ち往生しています。

このコースを読むことをお勧めします: Introduction to Modern Fortran 。 M. S. B.は有名な "Fortran 95/2003 Explained"に言及しましたが、この本は十分に大きく、詳細に満ちています。逆に、上記のコースは開始するのに適しています。また、リバプール大学の インタラクティブなFortran 90プログラミングコース もご覧ください。

あなたを驚かせるかもしれないFortran 90プログラムの誤り 。このページのタイトルはそれ自体が物語っています。 =)

うーん...ブックマークにも PSTI RESEARCH LECTURE SERIES "SCIENTIFIC COMPUTING WITH FORTRAN 95" へのリンクがあります。試してみる。

J.F.セバスチャンはF2Pyに言及し、Pythonを教えるためのアドバイスを与えました。私は彼の意見に同意します。 Pythonは私の好きな言語ではありません。しかし、それを教えるには十分に便利です。すでに述べたプリプロセッサ(その多くはPythonで書かれています)とF2Pyは合格しません SCons -最新のソフトウェア構築ツール。

追伸先週、lulu.comで電子書籍を購入しました。 Fortranでの科学的ソフトウェア開発 Drew McCormack著。良い読書になるといいのですが、突然時間がありません。著者はForpedo(Fortran Wikiで言及されているFortran固有のプリプロセッサーの1つ)の開発者であり、Objective-CおよびPythonプログラミング)に関する多くの本やチュートリアルの著者です。

39
Wildcat

OPは、Fortranは高性能の科学計算に耐えるには厄介なものであるという態度を落とし、熱狂的にそれに没頭することをお勧めします。 OPがそのかなり否定的な考え方を保持している場合、彼/彼女のFortranコーディングキャリア全体が苦労することになります。そして、実際には、FortranでC++ではできないことは何もできないので、本当にやりたくない場合は、なぜ迷惑をかけるのでしょうか。

OPの箇条書きのリストには、過去30年間Fortranで作業してきた多くの人が行っていないことが何もありません(Fortran 90コンパイラーが広く利用可能になったためですが、それ以前にもいくつかあります)。はい、計算科学者がいます。ポインタを理解する科学ソフトウェアエンジニアは、多くの(見当違いの)人が0からカウントを開始し、グローバル変数は悪いことであることを知っています。

@MSBと同様に、現代のFortranの機能と特徴に関する情報源として、Metcalfet alの本をお勧めします。そして、@ MSBのように、CまたはC++を使用して、Fortranの同等物またはより優れたアプローチがあるライブラリーを完全にラップするという考えに眉をひそめます。 2003標準とC機能との相互運用性は、インテルFortranに実装されているため、Cライブラリを直接呼び出すことがこれまでになく簡単になっています。

私はOPに関して、モジュラーコードを持つこと自体が目標であることを指摘します。目標は、正しい、検証可能で検証可能な、堅牢で信頼性の高いコードです。モジュール性はこれらの目標の達成をサポートする1​​つの方法ですが、それは戦術であり、エンドポイントではありません。モジュール化せずに10 ^ 6行のコードで構成される(前述の意味で)優れたプログラムを記述できると思っていれば、モジュール化を気にする必要はありません。

さて、OPがすでにやろうとしていることや言われたことを追加するためのいくつかの具体的なヒント:

  • 変数宣言でKINDを使用して、必要な精度を適用します。これをコンパイラオプションに任せたり、このコンパイラがそのプロセッサで何をするかについて推測したりしないでください。
  • 明示的なループではなく、可能な限り配列演算を使用してください。これはコードをより安全にするのに役立ちます-時にはパフォーマンスを犠牲にしますが、ケースバイケースでこれをチェックする必要があります。
  • pURE関数を記述します。
  • コードの正確さ(など)をプリプロセッサやその他のFortran以外のアプローチに依存せず、Fortranでアサーションと前提条件(など)を記述します。プリプロセッサ(など)は、適切に作成されたFortranプログラムである限り存続せず、現在および将来の移植性に対する主要な障害となります。
  • インテルFortranにアクセスできる場合は、独自のコードを作成するのではなく、インテルMKL(およびIPP)にアクセスしてそれらのライブラリーを使用してください。
  • openMPに取り組む計画とMPI並列化の場合、どちらもFortranに非常によく適合します。おお、できるだけ早く並列化することを計画してください。シリアルプログラミングよりもはるかに楽しいです。
  • この Fortran Coding Standards のセットは良い出発点ですが、おそらくそれ以上ではありません。 Code Completeの第1版は、現在の版よりもFortran(77)プログラミングについて多くの情報がありましたが、そのアドバイスのほとんどは、どの言語にも適用できますで書きます。

そして最後に、最近では、Fortranプログラムとプログラマーは、オブジェクト指向プログラミングからのアイデアよりも、関数型プログラミングからのアイデアに、よりよく情報を得ていると思います。

45

Fortran 90/95/2003は、モジュール、プライベート/パブリック、ユーザー定義型などを追加して、必要に応じてモジュール式コードを記述できるように設計されています。Fortran2003では、オブジェクト指向の機能がさらに導入されています。 Fortran 90が安全に直接Fortran配列を動的に割り当てる「割り当て」を行っている場合、Cに接続してmallocを追加しても意味がありません。プロシージャ(関数とサブルーチン)をモジュールに配置し、モジュールを「使用」すると、インターフェイスがチェックされます。添え字境界検査など、コンパイラーの多くのデバッグ/検査オプションを使用できます。

これらおよびその他の機能について学ぶための優れた本:Metcalf、Reid、Cohenによる「Fortran 95/2003 Explained」。 FORTRAN 77を書き続けるのではなく、最新のFortranの最良の機能を学ぶことは間違いなく良い考えです-必要であれば、コーディング標準/ガイドを書いてください。

13
M. S. B.

ここ数年で、同僚と私は、オブジェクト指向、モジュラー/再利用可能、一貫したコードスタイルなど、言及した多くの機能を備えた、現代のFortranでゼロからかなり大きな計算ライブラリを開発しました(私たちは素晴らしいことをしていません)ただし、単体テストでの作業-それを実行する必要があります)、そしてそれらすべてをラップして、C++、Pythonなどのインターフェースを提供します。ここにある他の人たちは、私が推薦するすべての本とリンク(およびそれ以上)を指摘しているので、それらを繰り返すことはしません。私が投稿する理由は、これらのことをFortranで実行して素晴らしいものを作成することは本当に可能であるということです。

また、Fortran 2003標準の多くがすべての主要なコンパイラに実装された後、あなたがどれだけ幸運に始められるかについても指摘します。これらの機能の多く(たとえば、手順ポインタ)が非常に役立ちます。

6
Barron

私は急いでいるので、合理的な文章ではなくチェックポイントの形でこの回答をする場合は許してください。

  • 標準(Fortranは標準化された言語であり、標準言語の機能に準拠し、ベンダー固有の拡張機能を使用しないことで、プラットフォームプログラム間で、コンパイラーが問題を起こさないことを確認できます)。どこにコピーをダウンロードしたかはわかりませんが、最新のドラフトをダウンロードできると確信しています(注意:fortran 2008または2003の多くの機能は、現在のコンパイラーにはまだ実装されていませんが、多くはほぼそこにあります今日... Crayは1) J3のページ から
  • 上記に関するすべての質問について、comp.lang.fortranusenetグループを強くお勧めします-非常に知識のある人がいるだけではありません(たとえば、 Mr.リチャードメイン...おそらく、標準的なコンプライアンスに関する質問にきちんと答えてくれるでしょう。きちんと質問されれば、同じことが言えます...他の多くの人にも同じことが言えます)が、大規模な問題に取り組んだ人もいますそして、あなたの件名について忠実に知っていて、喜んでアドバイスをします
  • 書籍-すでに述べたすべてに加えて(メトカーフ、リード、コーエンの本にも私の推薦があります。メインなどの "Fortran 2003ハンドブック"も...)、自分でStephen J. Chapmanのコピーを見つけてみてください 「科学者とエンジニアのためのFortran 95/2003」 ...いくつかのトピックについては少し自信が持てますが、それでも全体としては非常に良い本であり、多くの「優れたプログラミング手法」が言及されています)
  • また、これに遭遇したかどうかはわかりません "Fortran 90/95によるオブジェクト指向プログラミング"

あなたのテキストに関するいくつかのコメント:

(これはすべて「明白な」現代のプログラミングの仮定に思えるかもしれませんが、レガシーFortranの世界では、これらのほとんどは典型的なプログラマーのワークフローにおける大きな変更です)

現代のFortranの世界でさえ、これらの仮定のいくつかは疑わしい...覚えておいてください、Fortranプログラマーはプログラマーではありません(私はこれを凝縮された形で繰り返しています。私はこれをこのフォーラムで何度も書いています)が、エンジニア、科学者等々。彼らにとって(私たちの?)コードは目標ではなく、単なるツールです...プロのプログラマーにとってのコードはすべてです。彼らは「それを超える」ものは何もありません...したがって、彼らはそれをとても大切にしています。私たちのエンジニアにとって、それは私たちが望む結果を得るための単なる手段です...それを念頭に置いて、優れたプログラミング実践は後で支払うものの、明白な必要がないところに彼らを主張する必要はありません。

すべての目標は、信頼できる、保守可能なモジュール式のコードを作成することです。一方、典型的なFortranでは、モジュール性は主な目的ではないことが多く、元の開発者が非常に賢く、それ以来コードが変更されていない場合にのみ、コードは信頼できます。 (私はここで少し冗談を言っていますが、それほどではありません)

誰かがかつて言った、そしてあなたはそれがどれほど真実であるか信じられないでしょう:
「一時的な修正以外に永続的なものはありません」。

この件に関する適切なURL、アドバイス、参考資料/本はありますか?

上記のいくつかを考えます。

また、この回答を書いているときに、高いパフォーマンスがわかります。マークは非常にいい答えを投稿しましたが、私はそれにほぼ同意します...標準の接着についてもう少し詳しく説明します。

また、私の推奨事項は、この質問をcomp.lang.fortranにも確実に投稿することです。私はここではるかに質の高い回答を得ることができるので、ここで(20以上のFortranプログラマはいないと思います) stackoverflow全体)。

一部の欧州連合委員会が自由に発行した一連のコード作成ガイドラインがありました。これらはこの回答の一部として非常に役立ちますが、残念ながら、Googleのクイック検索でそれらを見つけることができず、十分に調べる時間もありません。トピックで検索してみてください...多分あなたはより幸運になるでしょう。

4
Rook

F2003でのオブジェクト指向プログラミングに関するこの2部構成のシリーズを見つけました。ここにたくさんの素晴らしいものがあります:

パート1: http://www.pgroup.com/lit/articles/insider/v3n1a3.htm

パート2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm

すばらしい例があり、すべてを非常に明確に説明しています。

3
Brenton Huggins

大規模なFortranプログラムをOOで参照したい場合は、www.mohid.comにアクセスしてください。これはGPLです。最新のFortranを作成することに同意しますOOもはや十分ではありません。関数型プログラミングの概念を組み込むことは必須です。私はこれについていくつかの調査を行っており、欠けている主な機能はラムダ(匿名)関数だと思います。反対側では、並列化を行う方が良いと思いますOpenMPではなくMPIルート。

1
Ricardo Miranda