Fortranベースの大きな数値演算コードベースをどのように近代化できますか?


21

学界の友人からアドバイスを求められました(私はC#ビジネスアプリケーション開発者です)。

彼は、Fortranで医療画像分野で書いたレガシーコードベースを持っています。ベクトルを使用して膨大な数の計算を行います。彼はクラスター(30のコア)を使用し、現在は500のGPUを持つ単一のワークステーションに向かっています。

ただし、次にコードベースを使用する場合:

  • 他の人々は次の10年サイクルにわたってそれを維持することができます
  • ソフトウェアの調整を高速化
  • 再コンパイルせずに異なるインフラストラクチャで実行できます

私からのいくつかの研究の後(これは非常に興味深い分野です)、いくつかのオプションがあります:

  • Nvidiaの PythonとCUDAを使用します
  • 関数型言語で書き直してください。たとえば、F#またはHaskell
  • クラウドベースに移行しHadoopやJava などを使用する
  • Cを学ぶ

これについてどのような経験をしましたか?私の友人は彼のコードベースを近代化するために何を見るべきですか?

更新:@Markと回答してくれたすべての人に感謝します。私の友人がこの質問をしているのは、レビューを行うのがプロジェクトのライフサイクルの中で最適な時期だからです。Fortranでリサーチアシスタントを高速化するには時間がかかります(私はC#、特にツールが好きで、古い言語に戻ることは想像できません!!)

Fortranで純粋な数値を処理し続けることをお勧めしますが、それを新しいものでラップすることをお勧めします。おそらくPythonは、かなり簡単に習得できる汎用プログラミング言語として学界の拠点になっているようです。

Medical ImagingとCUDAのFortranラッパーを書いた人を参照してください。Fortran90ラッパーをNvidiasのCUFFTライブラリ(CUDA SDKから)に合法的に公開できますか?


リストにOpenCLを追加します。
ジェリーコフィン

3
こんにちは、デイブ、ある種の「次に学習する言語は?」ここでは許可されていないという質問があるため、この質問を間違えないようにマイナーな修正を加えました。しかし、質問を拡大して、これまでに発見した選択肢がなぜ適合しないのかを説明して、より良い適合を提供するための答えを導くことができますか?

「再コンパイルせずに異なるインフラストラクチャで実行できる」の下で具体的にどういう意味ですか?
ルーク

こんにちは@Idigas-詳細についてはあまりよくわかりません。しかし、本質的には、コードベースを他のクラスター/マシンに持ち込むときに、すべての正しいバージョンのライブラリーを一緒にコンパイルするのは悪夢になりました。コードベースはF77からF90のいずれか、またはいずれかに変更されたと考えています。私は:-)私が助けに何かできるように、私は理想的に最速最良のコードを記述している、顧客は余分なコーディング時間の日好きではないバックグラウンドから来
デイブMateer

@DaveMateer-私の答えをご覧ください(このボックスに収まりませんでした)。将来の応答が少し遅い:)かもしれので、私は、今、スリープ状態に行くよ
ルーク

回答:


24

次のような問題については、実際にFortranをリストの最上位に置くという要求があります。

a)数値
計算b)並列化可能
c)csの研究の外で(プロのプログラマーではないエンジニアに)教えられた事実上の言語です。
d)業界グレードのコンパイラの数で信じられないほどの(!)業界支援があり、ベンダーのいずれもそのブランチを放棄する兆候をほとんど示していません。インテルの代表者の1人は、Fortran製品の売り上げが開発ツールで他のどの製品よりも高いことを明らかにしました。

また、信じられないほど簡単に習得できる言語でもあります。研究助手をスピードアップするのに時間がかかることには同意しません。私の最初の教科書には、30ページ(?)のまばらな印刷テキストしかありませんでした。これは、10個のキーワードを学習した後、中規模のプログラムを作成できる言語です。デフォルトのWordテキストで書かれた30ページは、ほとんどのユーザーにとってより包括的な「Fortranマニュアル」になると思います。

CUDAに興味がある場合はそれをサポートするPortland Groupのコンパイラを確認することをお勧めします。私は細かい詳細に精通していませんが、人々は一般的に賞賛とそれについて話します。

それとは別に、プログラムを並列化するために、OpenMP、MPI、そして今度は(そして待望の)インテル®コンパイラーが最近実装したコアレイを利用できます。言葉を無駄にしないために、Fortranにはプログラムを並列化するための非常に優れた「ライブラリ」のガンマがあります。

業界標準の数値ライブラリー何よりも開発されており、関数/ルーチンポートフォリオで多かれ少なかれ他の言語が使用されています。

とはいえ、私は(最初に書かれた時期に応じて)F77コードまたはそれより古いものをお勧めします。時間を経て部分的に新しい方言に書き直します-可能な場合は、F2003機能で少なくともF90。そのトピックに関する論文/論文は、最近発表された(先に中型PDFファイル)。適切に実行すれば、複数のプラットフォーム間での移植性を確保できるだけでなく、将来のメンテナンスも容易になります。

ps「将来のメンテナンス」に関する限り、私が時々言及したいだけの逸話。私の論文を書いている間、私は私の執筆者からのコードを再利用しました。エラーは1つだけでコンパイルされました。コピーペーストの間違いにより、最後にステートメントがありません:)


@DaveMateer(コメントへの返信) -少し失礼かもしれないコメントを次のように作成しますが、間違ったやり方をしないでください。

あなたはこの「問題」に間違った方法で取り組んでいるように思えます。いくつかの短い点で私が意味すること(ここでは非常に遅いので、読みやすい(わかりやすいだけでなく)文を作成できるので、午後10時以降になります。)

a)余分なコーディング時間を最小限にしようとしていると言いましたが、数値表現に特化した言語からカラフルな言語の選択肢への書き換えを検討しています。私の表現をご容赦ください。

  • そのうちのいくつかは、特に多次元配列をサポートしていません
  • それらのほとんどは、重い数値処理には適していません(HaskellとHadoopの並列処理機能については、私は何も知りませんが...それらのサークルで言及されたことさえ聞いたことがない)
  • 試みられた可能性がありますが、離散問題の言語であるFortranから関数型言語への書き直しを聞いたことはありません
  • 最近、comp.lang.fortran(Googleグループで検索してみてください)で、「クラウド内」の科学コンピューティングの側面について議論がありました(
    やる気をそがれたくはありませんが、公平に言えば、誰も本当にほとんどの人は可能性が存在することに同意しましたが、今のところ物事がうまくいく方法に満足しています。)多くの問題は、そのような並列化にも適していません。

b)そのような書き換えのコストはいくらですか?人/時間。

c) -コンパイルするライブラリの正しいバージョン...-はどの言語でも問題であり、回避することはできませんが、それを見てください。

d) Python(本当に素晴らしい言語)がいくつかの場所で並列アプリケーションで使用されていると聞いたことがありますが、その市場への浸透はまだ増加していないようで、その性質が絶えず変化しているため、長期プロジェクト(後方互換性を考えてください)。一部の人々は、これを「接着」言語として非常に気に入っています。

うーん、もし私が他に何かを考えるなら、明日それを追加します。おやすみなさい...


@Idigas ..再び感謝します。何かが機能していれば、それは大きな意味があるということに完全に同意します。私たちの業界は、完全な書き換えがひどく間違っている(Netscape!)に満ちています。
デイブメイター

1
Idigasはここで正しい考えを持っています。何年も機能しているコードベースがあり、それを書き写すとバグが発生します。さらに、Fortranは簡単に使える言語です。見苦しいかもしれませんが、明確な概念から作られています。他のコードとの依存関係をチェックし、Fortranへの素敵なCスタイルのインターフェースを書くと、コードが非常に将来性があることがわかります(他のほとんどの言語には呼び出しメカニズムがあるため、CスタイルCスタイルのインターフェースを備えたコード)。
アノン

2
同意する必要があります。あなたがしていることの背後にある数学を理解している(そしてほとんどのエンジニアがしている)場合、FORTRANでそれを実装することはそれほど急な学習曲線ではありません。一度構築すれば、ビジネスアプリやソーシャルアプリのように要件が変わることはほとんどありません。
-JeffO

わあ、FORTRANが大好きだとは知らなかった。私はF77で5年間開発しなければならなかったので、我慢できません。
-dodgy_coder

2
@dodgy_coder。90年代にFortran + .NETで開発を行ったのは嬉しいことです。.NET の最初のベータ版は2000年に登場しました

10

Fortranが死ぬことはないだろう-それにはソフトウェアとライブラリの非常に大きな遺産が書かれているので、人々はまだそれに取り組んでおり、この状況を安定させるだけだ。さらに、数値演算以外の処理を行いたくない場合は、依然として非常に優れた言語です。構文は非常にエレガントで論理的であり、コンパイラーは何が起こっているか簡単に推測できます。したがって、新しいハードウェアアクセラレータテクノロジは、C、Fortran、および何らかのOpenCLをサポートすることが保証されます(最終的には、何らかの強固なものに収束するとき)。

したがって、数値部分を明確に分離し、Fortranに残し、明確な結合を行い、残りを必要に応じて記述する必要があります。


Fortranでの新しいプロジェクトも最近開始されたことは言うまでもありません。
ルーク

はい、FortranにはCOBOLはありません。30年前に人々が学んだことだけがサポートされているだけではありません(IMOはその一部です)。数値計算は私の得意ではありませんが、より良いものがある場合、私は確かにそれを知りません。
ベンブロッカ

1
Fortran言語は、数値演算と関連する最適化で10年のリードを維持しています。すぐに死ぬことはありません。
マーティンヨーク

1
Fortranに関する最新の「Communications of the ACM」に記事が掲載され、Fortranがどのように継続的なモダナイゼーションを続けているかについて説明しました。Fortranでコードを(少なくともその一部を処理する)維持することは、おそらく良い動きでしょう。また、Netscape Syndromeの回避にも役立ちます(書き換え=新しいバグ=膨大なサイクルタイム=関係者全員を怒らせます)。
すぐに

1
Fortranにまったく興味のない人があなたの数値演算コードに触れたいですか?大きな問題は、書き換え後に結果が正確であることを確認することです。
ピータースミス

4

実際、Pythonは科学コンピューティングコミュニティで大きな注目を集めています(多少時代遅れの見解については、CiSEのボリューム9ナンバー3を参照してください)。Python / Fortranハイブリッドが最適な方法だと思います。これらすべてのGPUを活用するには、PyCUDAまたはPyOpenCLを使用できます。

私は偏微分方程式の数値ソルバーを分​​析して書く数学者です。私は最近あなたの友人と同じような状況にありました。問題のFortran 77コードは、よく知られているClawpackソフトウェアです。Pythonでトップレベルのコード(高速である必要のないすべての部分)を書き直し、f2pyを使用して低レベルの部分を自動的にラップしました。

これの本当に強力な結果は、ハイブリッドPython / Fortranコード(PyClawと呼ばれる)をパラレルライブラリPETSc にほとんど簡単に接続でき、65Kコアで良好に動作するスケーラブルなパラレルバージョンのClawpackを初めて作成したことです。記述しなければならなかったすべての並列コードは、300行未満のPythonに含まれています。現在、従来のコードだけでは対処できなかった問題を解決しています。同様に重要なこととして、Pythonは非常に使いやすい言語であり、ほとんどすべてをコンパイル時ではなく実行時に変更できるため、新しいユーザーがコードを簡単に取得できるようになりました。

当社のアプローチと結果の詳細をご覧になりたい場合は、arXivに関する論文をご覧ください。

自己宣伝をおologiesび申し上げますが、私の個人的な経験がここに関連しているように思えました。さらに多くのアイデアを聞きたい場合は、これを新しいhttp://scicomp.stackexchange.comに投稿することもできます。


1

私は現在、あなたの友人と非常によく似た状況にいます。また、40個のKLOC Fortran-77レガシーコードを「近代化」することも必死です。また、Fortranはいまだに数値演算アプリケーションの王者と見なされていますが、すべてが失われているわけではないと言いたいと思います。(以下は暴言ですのでご容赦ください)。

Fortranが数値コードに最適な言語だからといって、この巨大で手間のかかる複雑なコードを常に持ち歩く必要があるわけではありません(はい、Fortranコードは、特にFortran-77特定のKLOCを超える場合、文字通りソフトウェアエンジニアリングを考慮しない言語)。数値演算のためにFortranを提唱する人は、そのようなコードのパフォーマンス分析を行うとき、パフォーマンスが集中するのはコードの5%または10%だけであり、残りの90%+ Fortranは無駄なオーバーヘッドであるという一般的な観察を忘れています「ソフトウェアエンジニア」としてのあなたの人生を生き地獄にするためにそこにいます。

Fortran-77からFortran-90に移行する場合、基本的にパフォーマンスと言語機能をある程度トレードオフできます。Fortranは、Fortran-77が主な理由で強力な数値計算機です。Fortran-90は同じくらい速いと言うかもしれませんが、Fortran-90 / 2003の機能を追加し、Fortran-77のパフォーマンスを維持しながら、コンパイラライターが対処しなければならなかった最適化の問題は、Cコンパイラライターが対処しなければならなかった問題と大差ありませんwith(その結果、Cも高速であると見なされます。もちろん、Cはインラインアセンブリも許可します)。それでは、Fortran-77コードに(Fortran-90の代わりに)Cコードを少しずつ追加し始めてください。私のコードにはすでにCの一部とFortran-77の一部があり、文字列の受け渡し、ゼロインデックス付け/ワンインデックス付けなどのいくつかの問題の対象となりますが、Cから得られる利点は、

さらに一歩進めます。C(および間違いなくFortran-90 / 95/2003)でさえ、数値計算コードへの「人道的」なインターフェースが必要な場合、低レベルです。Python-Fortran-77またはPython-Cハイブリッドに移行することを考えています。コードの90%がPython(Numpy、Scipy、プロット可能性、およびそのすべての甘さを含む)であり、パフォーマンスが集中する5%-10%だけがFortran-77またはCコードのままであるコード。


1
「Fortranコードは面倒です」いいえ。乱雑なコーダーは、どの言語でも乱雑なコードを記述しますが、その逆も同様です。KernighanとPlaugerは、何年も前にきれいなFortranを書く方法を示しました。

0

私は現在、古いFORTRAN95コードベースを更新して、最新の業界環境で使用されるようにしています。以前のバージョンは、遅くともWindows2000マシンでのみ動作するからです。FORTRANコードベース自体が、灌漑シミュレーションに関連する大量の数値計算を実行します。

だから私がやっていることは、より現代的な言語でFORTRANを書き直す代わりに、Silverfrost FTN95と呼ばれる市販のコンパイラを使用してFORTRANコードベースをWPFアプリケーションのバックエンドとして使用している.Net 4.0ライブラリにコンパイルするだけです。このようにして、既知のバグをシミュレーションコードに持ち込むリスクを負わず、コードベースを.Net 4.0フレームワークに移動して近代化することで、より最新の環境で実行できるようにします。

しかし、シミュレーションの大きさに応じて、単にC#などのより新しい言語で全体を書き直したい場合があります。出力を比較するシミュレーションの実行バージョンができたら、私はこれを行う予定です。

アレックス、ありがとうございます。


0

2001年から2003年にかけて、100KLOC WindowsアプリケーションをFORTRANからC#に移植したプロジェクトの開発主任でした。これは、Win32ライブラリへの独自のカスタムGUIバインディングを備えた大量の処理アプリケーションでした。C#とWinFormsへの移植により、コードの管理がはるかに簡単になり、Visual Studioでの開発環境がより豊かになりました。初期にはかなりの抵抗がありましたが(特に形式の記述に関して)、最終的には間違いなく価値がありました。

私の意見では、弾丸を噛んで、可能な最大量のFORTRANコードを取り除くのが理にかなっています。FORTRANと比較してC#でコードを実行する初期テストでは、C#がマネージコードを実行していても、パフォーマンスの違いは無視できるほど小さいことがわかりました。ただし、ベクターに対するニーズは少し異なる場合があり、少数のFORTRANコードが残っていることも許容されます。

それを行うもう1つの理由は、もちろん、C#開発者と比較してコードを維持できるFORTRANの経験を持つ人々の長期的な可用性です。また、サポートされた最新の言語でチームの士気を高めることができます。


0

多くの状況で、MATLABは科学計算アプリケーションのFORTRANを置き換えていると言われています。モダンで高レベルであるだけでなく、その動作も非常に高速です。医療画像ソフトウェアに取り組んでいる多くの開発者は既にMATLABを使用しているため、医療画像専用のライブラリがいくつかあります。つまり、MATLABを使用すると、ツールとドメインエキスパートの両方のサポートが見つかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.