Fortranを高速化するものは何ですか?


41

Fortranは数値プログラミングにおいて特別な場所です。確かに他の言語で優れた高速のソフトウェアを作成できますが、Fortranはその時代にもかかわらず非常に優れたパフォーマンスを維持します。さらに、Fortranで高速プログラムを作成するのが簡単です。私はC ++で高速プログラムを作成しましたが、ポインターエイリアシングのようなことに注意する必要があります。したがって、これには理由があり、非常に技術的な理由が必要です。コンパイラがさらに最適化できるからでしょうか?技術的な詳細を知りたいので、別の言語を使用する場合はこれらのことを考慮に入れることができます。

たとえば、私は知っている-またはそのように考えている-1つのことは、標準ではポインターが常にメモリ内で連続していることを指定しているため、メモリアクセスが高速になることを意味します。コンパイラにフラグを付けることで、C ++でこれを行うことができると思います。このように、Fortranが優れていることを知るのに役立ちます。したがって、別の言語を使用している場合、これを模倣できます。


7
私はそれが良い質問だとはいえ、これはstackoverflowにとってより良い質問かもしれないと言うでしょう。クイック検索(stackoverflow.com/search?q=fortran+fast)を行うと、この質問に役立つことがあります。stackoverflow.com
fortran

3
使用しているFortranのタイプを指定する必要があります。77と90+にはかなりの違いがあります。私たちは、ポインタの話をしている場合、私は...少なくとも90を仮定している
qubyte

FortranはCよりも高速であるといつも読んでいます。たぶん、2%のように高速ですか、それとも50%のように高速ですか。
shuhalo

4
それは都市の神話です。コンパイラーが特別な命令を使用できない限り、コンパイラーに関係なく、ほぼすべてのプログラムを手動で最適化して、ほぼ同じ機械語を生成できます。
マイクダンラベイ

回答:


50

言語デザイナーは多くの選択肢に直面しています。 Ken Kennedyは次の2つを強調しました。(1)より優れた抽象化と(2)高レベルまたは低レベル(より少ないまたはよりマシンに近い)コード。HaskellやSchemeなどの関数型言語は前者に焦点を当てていますが、FortranやC / C ++などの従来の科学計算言語は後者に焦点を当てています。ある言語が他の言語よりも速いと言うのは、通常、誤解を招く可能性があります。各言語には、優れている問題領域があります。Fortranは、配列モデルと明示性という2つの基本的な理由により、配列ベースの数値コードの領域で他の言語よりも優れています。

配列モデル

Fortranプログラマーは主に配列操作を行います。そのため、Fortranは他の言語では利用できないいくつかのコンパイラー最適化を促進します。最良の例はベクトル化です。データレイアウトを知っていると、コンパイラは配列に対してアセンブリレベルの組み込み関数を呼び出すことができます。

言語の明示性

単純な言語は、より複雑な言語よりも「優れた」コンパイルを行うように思われますが、実際にはそうではありません。アセンブリ言語で記述した場合、コンパイラーができることはあまりありません。見ることができるのは、非常にきめ細かい命令だけです。Fortranは、配列ベースのコンピューティングに本当の報酬をもたらす場合にのみ、明示性(したがって、プログラマによるより多くの作業)を必要とします。Fortranは、単純なデータ型、基本的な制御フロー、および制限された名前空間を使用します。対照的に、レジスターをロードする方法をコンピューターに伝えませリアルタイムに必要な場合があります)。Fortran 明示的である場合、完全な型推論などが可能になり、初心者が始めるのに役立ちます。また、しばしばCを遅くする1つのことを回避します。不透明なポインター

Fortranは遅くなる可能性があります

Fortranはすべてのタスクに対して高速というわけではありません。そのため、GUIの構築や高度に構造化されていない科学計算にもFortranを使用する人は多くありません。グラフ、デシジョンツリー、およびその他の領域の配列の世界を離れると、この速度の利点はすぐになくなります。いくつかの例と数値については、コンピューター言語のベンチマークを参照してください。


7
GUI / IOの問題は、Fortranクランチを「より汎用的な」言語でラップすることで簡単に解決できます。この目的でRを頻繁に使用します。
MBQ

2
shootout.alioth.debian.orgは利用できなくなりました!そして、新しいバージョンははるかに少ない情報を持っています:(
astrojuanlu

23

Fortranの設計により、コンパイラは、場合によってはより強力な最適化を実行できます。最適化は、Cでは一般に利用できません。

1つの有名な例は、エイリアシングの処理です。Fortranでは、特定のメモリ領域に関連付けられた特定のシンボルを介してのみ、特定のメモリ領域にアクセスできます。この知識により、コンパイラはキャッシュするときにスマートトリックを使用できます。つまり、値が変更される可能性があるかどうかがわかります。F90まで、これは簡単に検証されました。Fortran 90が導入されたときpointers、前提はもはや真実ではありませんでした。2つ(またはそれ以上)のシンボルを介して同じメモリ領域にアクセスできました。これが、targetポインターを介してアドレス指定する配列に指定する必要がある理由です。

もう1つの興味深い事実は、多くの構造により、コンパイラーがユーザーの介入なしに並列化を実行できることです。このような贅沢は、言語としてのFortranの相対的な「プラットフォームに依存しない」ために可能です。

このような他の多くの微妙なトリックがあります。また、数値計算を除き、Fortranを使用している人はいないことを忘れないでください。つまり、Fortranコンパイラのコア機能とセールスポイントは、結果として得られるコード速度です。その結果、ベンダーはこれに焦点を合わせました。

それでも、他の言語でもパフォーマンスコードを生成できます。ただし、特別な注意または人間の介入が必要になる場合があります。ただし、一般的なポイントは、問題が発生するまでパフォーマンスは問題ではないということです。また、人の時間はコンピューターの時間よりもはるかに高価です。したがって、コーディングの実践では、コンピューターの時間ではなく、人間の時間を節約することに重点を置く必要があります。


2
コンピュータが1億ドルを超える範囲に入ると、人々の時間(大学院生)は比較して非常に高価に見えなくなります。
フィルミラー

6
@Novelocrat:上で実行されるコードの量$:億コンピュータをはるかに超えた無数の工数によって書かれている$でも大学院生の価格で100万台。人の費用は収入の2倍であることに注意してください。残りは税金と相関関係になります。また、コンピューターが焼損することはありません。人はそうし、仕事を変えます。
ステファノボリーニ

1
@StefanoBorini私は...焼却経験したPCの長い歴史を持っている
N74

1
「さらに、数値計算を除き、Fortranを今日使用している人はいないことを忘れないでください」Fortran = "FORmula TRANslation"。Fortranは常に数値計算のために主に使用および設計されていました。Fortranは、高性能コンピューターの時間の大部分を占めています。
user21387

今日、いつものように、Fortranはすべて同じ目的で使用されています-数値計算。
シーケンス

12

Fortranは金属​​に近いとは思いませんが(他の答えを参照)、非常に簡単に最適化する傾向があります。ループは単純であり、言語はベクトル化拡張機能を容易にサポートします(最初の仕事で使用したときに、幅広いベクトルビッグアイロンを対象としていました)。

大きな慣性係数もあります。Fortranには多くの数値コードが含まれているため、ハイエンドサーバーとスーパーコンピューターのビルダーは、最適化されたFortranコンパイラーを確実に作成します。コンパイラーは優れており(高品質のコンパイラーが比較的不足しているマシンでも)、ユーザーはFortranを使い続け、新しいコードを作成することさえできます。そのため、ビルダーは、次世代に優れたコンパイラーなどを確実に提供します


8

ここで都市の神話に注意してください。2つのコンパイラが同じアセンブリコードを生成する場合、結果のプログラムは同じパフォーマンスになります。

ロジックのどの部分にも、実行時間を最小限に抑えるアセンブリ言語のプログラムがあります。そのプログラムは、どのコンパイラがそれを生成したかを気にしません。

ただし、プログラマーの作業を楽にするために、コンパイルされた言語が存在します。このコストの一部は、最小の実行時間にならない機能を使用するようにユーザーを誘惑する可能性があることです。これの代表的な例はnewC ++です。(どのくらい遅くなる可能性があります-それは3文字だけですか?)実際には、動的にメモリを割り当てて、ランタイムコストに注意を払わないように頼みます。それがあなたがやりたいことなら、それは素晴らしいことですが、Fortranはそれをやる気にならなかったという理由だけでより速くなる可能性があります。

しかし、それをはるかに超えて、最初に書かれたように、コンパイラーが決してクリーンアップできないようなパフォーマンス改善の大きな余地のないプログラムを見たことはありません。一例として、同じ引数で呼び出しexplog繰り返しをかなりの時間を費やしています。別の例として、DGEMMを呼び出して行列を乗算し、入力文字の引数を解読するためだけにLSAMEの呼び出しにかなりの時間がかかることがわかります。

これは同時に、ポインターのエイリアシングまたはループの展開のためにFortranが高速であると人々が言っ​​ているのと同じです。これは、ポルシェ製のバスがシボレー製のバスよりも確実に高速になると言うようなものです。少し常識が必要です。


4
私はそれがちょうど都市の神話だとは思わない。Fortranは配列全体の操作、PURE / ELEMENTAL関数などをサポートしているため、コンパイラーは簡単に最適化/ベクトル化、さらには並列化を行うことができます。たとえば、thinkingparallel.com / 2007/08/14 / …を参照してください。コンパイラが実際に行うことは別の話です(ベンダーによって異なります)。
stali

@stali:それはベンダー以上に依存しています。コンパイルされるプログラムに依存します。「Fortranが高速で実行できるプログラムが存在する」から「Fortranはどのプログラムでも高速である」に一般化するのを見てきました。これを指摘すれば、人々は髪の毛を裾に広げ、毛を裂き始めることができます、そして実際にそれが最終的に何に帰着するかは、基本的には人々が考えたいこと以上のものではありません。
マイクダンラベイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.