web-dev-qa-db-ja.com

Fortran対C ++、Fortranは今でも数値解析で利点を保持していますか?

C++コンパイラ、特にIntelコンパイラの急速な開発、およびC/C++コードにSIMD関数を直接適用する機能により、Fortranは数値計算の世界で実際の利点を保持していますか?

私は応用数学のバックグラウンドから来ており、私の仕事は厳密に定義されたパフォーマンス要件を伴う、多くの数値解析、計算、最適化などを伴います。

私はFortranについてほとんど何も知りません、C/CUDA/matlabで経験があります(後者を最初からコンピュータ言語とみなす場合)、そして私の毎日の仕事は非常に大きなデータ(例えば10GBの大きな行列)の分析を伴います、そして、プログラムは少なくともその2/3の時間をメモリアクセスに費やしているようです(そのため、GPUに仕事の一部を送ります)、少なくとも、Fortranルーチンを試してみるのは効果があると思いますかプログラムのパフォーマンスを改善するためにコードのパフォーマンスに重要な部分がありますか?

複雑さや物事をそこに関与させる必要があるので、私はそこに大きなパフォーマンス上の利点がある場合にのみ、そのルーチンを実行します、事前に感謝します。

46
user0002128

Fortranには、C++と比較して厳密なエイリアスセマンティクスがあり、数十年にわたって数値パフォーマンスが積極的に調整されてきました。 CPUを使用してデータの配列を処理するアルゴリズムは、多くの場合、Fortran実装の恩恵を受ける可能性があります。

プログラミング言語の銃撃戦はあまり真剣に受け止められるべきではありませんが、15のベンチマークのうち、Fortranはそれらのスピードfourで1位にランクされています(Intel Q6600の場合コア)、他のどの単一言語よりも。 Fortranが輝くベンチマークは、非常に数値的なものであることがわかります。

反例:

  • k-ヌクレオチド 500%低速(このベンチマークは、Fortranの強さではない、より洗練されたデータ構造と文字列処理に重点を置いています)

すべての実装のうち、Fortranコードが平均して各ベンチマークの最速の実装に最も近いことを示す概要ページ「 how times timeser 」も表示できます。 C++よりも大きく、FortranはC++が得意とする一部のタスクに適していないことを示しますが、すでに知っている必要があります。

自問する必要がある質問は次のとおりです。

  1. この関数の速度は非常に重要なため、Fortranで再実装する価値がありますか?

  2. Fortranの学習への投資が成果を上げるほど、パフォーマンスは重要ですか?

  3. 自分でコードを書く代わりに、ATLASのようなライブラリを使用することは可能ですか?

これらの質問に答えるには、コードベースとビジネスモデルの詳細な知識が必要になるため、それらに答えることはできません。しかし、はい、Fortran実装は多くの場合C++実装よりも高速です。

決定のもう1つの要因は、サンプルコードの量と利用可能なリファレンス実装の量です。 Fortranの強力な歴史は、ダウンロードしたり、ライブラリにアクセスしたりしても、豊富な数値コードが利用できることを意味します。いつものように、良いものを見つけるためにふるいにかける必要があります。

57
Dietrich Epp

あなたの質問に対する完全で正しい答えは、「はい、Fortranにはいくつかの利点があります」です。

C++には、いくつかの異なる利点もあります。 PythonやRなども同様です。それらは異なる言語です。ある言語でいくつかのことを行うことと、他の言語でいくつかのことを行うことは簡単で迅速です。すべてがコミュニティで広く使用されており、非常に正当な理由があります。

より具体的な質問がない限り、それ以外のものはただの騒ぎと言語戦争の餌であり、それが私が質問を閉じて他の人にも期待する理由です。

16
Jonathan Dursi

また、言及する価値があるのは、FortranがC++よりもマスターするのがはるかに簡単であることです。実際、Fortranの言語仕様はプレーンCよりも短く、構文は間違いなく単純です。すぐに手に入れることができます。

つまり、C++またはFortranの学習だけで特定の問題を解決したい場合(たとえば、プロトタイプ言語で書いたもののボトルネックをスピードアップするため)、Fortranを使用すると投資収益率が向上する可能性があります。

8
saolof

Fortranは自然に数値プログラミングに適しています。このようなプログラムでは、通常は配列が配列された大量の数字を使用する傾向があります。配列はFortranの第一級市民であり、多くの場合、数値カーネルをMatlabからFortranに変換することは非常に簡単です。潜在的なパフォーマンスの利点については、これを非常にうまくカバーする他の回答を参照してください。現在のほとんどのコンパイル済み言語で非常に効率的な数値アプリケーションを作成できるのはおそらくベースラインですが、そこに到達するためにいくつかのループをジャンプするかもしれません。 Fortranは、言語機能により、コンパイラーが最適化のほとんどのスポットを認識できるように慎重に設計されました。もちろん、Fortranを含むコンパイルされた言語で任意の遅いコードを書くこともできます。いずれにしても、適切なツールを選択する必要があります。 Fortranは数値アプリケーションに適しており、Cはシステム関連の開発に適しています。最後に、Fortranの基本を学ぶことは難しくなく、他の言語を調べることは常に価値があります。これにより、解決したい問題に関する別のビューが開きます。

8
haraldkl

Fortranコードは、一般に行列およびベクトル型の操作に適しています。ただし、ヒント/提案をコンパイラに渡して同様の品質のベクトル命令を生成することにより、c/c ++コードでも同様のパフォーマンスを実現できます。良いブーストを与えたオプションの1つは、配列オブジェクトである入力変数間のメモリエイリアシングを想定しないことでした。このように、コンパイラーは、ILPの内部ループのアンロールとパイプライン化を積極的に実行し、適切なプリフェッチでループの反復全体でロードとストアの操作をオーバーラップできます。

0
Pari Rajaram