重い計算では、FortranはCよりも最適化が簡単ですか?

キンマー

時々、FortranはCよりも高速であるか、高速である可能性があることを読みました。それは本当に本当ですか?私はFortranをほとんど知らないことを認めなければなりませんが、これまでに見たFortranコードは、言語にCにはない機能があることを示していませんでした。

それが本当なら、その理由を教えてください。どの言語やライブラリが数の計算に適しているか教えてはいけません。そのためのアプリやライブラリを作成するつもりはありません。興味があります。

ニルス・ピペンブリンク

言語には同様の機能セットがあります。パフォーマンスの違いは、EQUIVALENCEステートメントが使用されない限り、Fortranがエイリアシングは許可されないと言っているという事実に起因します。エイリアシングのあるコードは有効なFortranではありませんが、これらのエラーを検出するのはプログラマーであり、コンパイラーではありません。したがって、Fortranコンパイラーは、メモリーポインターのエイリアシングの可能性を無視し、より効率的なコードを生成できるようにします。Cのこの小さな例を見てください:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

この関数は、最適化後、Fortranの対応する関数よりも実行が遅くなります。なぜそうなのか?出力配列に値を書き込む場合、行列の値を変更できます。結局のところ、ポインタはオーバーラップして同じメモリチャンク(intポインタを含む!)を指す可能性があります。Cコンパイラは、すべての計算で4つの行列値をメモリから再ロードするように強制されます。

Fortranでは、コンパイラーはマトリックス値を1回ロードして、それらをレジスターに保管できます。これが可能なのは、Fortranコンパイラーがポインター/配列がメモリー内でオーバーラップしないことを前提としているためです。

幸い、restrictこの問題に対処するために、キーワードと厳密なエイリアスがC99標準に導入されました。最近のほとんどのC ++コンパイラでも十分にサポートされています。このキーワードを使用すると、ポインターが他のポインターとエイリアスしないことをプログラマーが約束するというヒントをコンパイラーに与えることができます。厳密なエイリアスとは、プログラマーが異なるタイプのポインターが重複しないことを約束することを意味します。たとえば、adouble*はと重複しませんint*(特定の例外を除いてchar*void*何とでも重複する可能性があります)。

それらを使用すると、CとFortranから同じ速度が得られます。ただし、restrictパフォーマンスが重要な関数でのみキーワードを使用できるということは、C(およびC ++)プログラムがはるかに安全で簡単に作成できることを意味します。たとえば、無効なFortranコードを考えてみCALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)ましょう。ほとんどのFortranコンパイラは警告なしに問題なくコンパイルできますが、一部のコンパイラ、一部のハードウェア、および一部の最適化オプションでのみ発生するバグが発生します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

C#での計算がPythonよりもはるかに高速なのはなぜですか

階乗計算がJavaよりもHaskellではるかに速いのはなぜですか

単純なabs実装がC ++でうまく最適化できないのはなぜですか?

Javaで金種を計算するためのより簡単で簡単な方法はありますか?

Bashでは、単一の角括弧[]よりも二重の角括弧[[]]の方が適していますか?

Javaコンパイラが簡単なメソッドを最適化しないのはなぜですか?

特定の場所でインデックスを見つけるための最も簡単で計算効率の高い方法は何ですか?

numpyでこの関数の計算を最適化するにはどうすればよいですか?

Kotlinで移動平均を計算するための最速/最も簡単な方法は何ですか?

ASTまたはバイトコード。どちらが最適化するのが簡単ですか?

Rust regex replace_allはPHPregex preg_replace_callbackよりも遅いですが、最適化する方法は?

衝突時のボールの位置を計算する最も簡単な方法は何ですか?

衝突時のボールの位置を計算する最も簡単な方法は何ですか?

配列をCの数値で最適化し、より高速に乗算することは可能ですか?

FFTWの倍精度よりも単精度の計算が遅いですか?

javascript変数が数値でゼロより大きいかどうかを確認する最も簡単な方法は何ですか?

暗号化の目的でCで疑似乱数を生成する最も簡単な方法は何ですか?

gcc最適化が最も効果的なのはいつですか?

タイプトークン比率を計算する最も簡単な方法は何ですか?

コマンドラインで計算する最も簡単な方法は何ですか?

Ubuntu UIはLubuntuよりも優れている/簡単ですか?

Android:計算量が増えると、整数計算がフロート計算よりもはるかに遅いのはなぜですか?

Haskellで簡単な計算機を作成するにはどうすればよいですか?

固定形式のソースのFortranは、コンパイラーが最適化するのが簡単ですか?

素数の合計の計算において、NodeJSがRustよりも速いのはなぜですか?

Clangの最適化により、明示的な型キャストを追加した場合でも、Cでの計算結果が変更されます

この場合、reduceがrecurよりもはるかに最適ではないのはなぜですか?

Kotlinでコードを最適化する簡単な方法はありますか?

FortranでのCUDA行列乗算はCよりも遅い

TOP 一覧

  1. 1

    Oracle11gクライアントを使用したOracle19Cサーバーへの接続

  2. 2

    Ansibleで複数行のシェルスクリプトを実行する方法

  3. 3

    Reactでclsxを使用する方法

  4. 4

    Python / SciPyのピーク検出アルゴリズム

  5. 5

    小さいデータセットサイズと大きいデータセットサイズを使用するMPI_Gatherを使用したMPI_Barrier?

  6. 6

    フィルタスライダーで複数の範囲を選択します-Tableau

  7. 7

    MariaDBによるデータベースの破損:テーブルがエンジンに存在しません

  8. 8

    複数の条件でループを構築する

  9. 9

    Google Cloud Storage から単一ページの React アプリを提供する

  10. 10

    Hide textOutput() when un-click row of a DT::datatable in shiny app

  11. 11

    JavaのREST APIの認証、JWTとベストプラクティス

  12. 12

    Angular 9 TypeError:未定義のプロパティ「subscribe」を読み取れません

  13. 13

    JavaからのMATLAB関数によりランタイムエラーが発生する(EXCEPTION_ACCESS_VIOLATION)

  14. 14

    Eclipseに既存のJavaプロジェクトをインポートしますが、JFrameのデザインビューが存在しませんか?

  15. 15

    Openlayers 3 : Interaction DragBox が機能しない

  16. 16

    print( "\ 0007")がビープ音を鳴らさないのはなぜですか?

  17. 17

    なぜArrays.copyOfは2倍高速System.arraycopyのより小さなアレイ用のでしょうか?

  18. 18

    App Engineクイックスタートから「helloworld.go」をアンデプロイし、代わりにバケット内のhtmlをポイントするにはどうすればよいですか?

  19. 19

    LaravelはDB接続を自動的に閉じますか?

  20. 20

    グラフ(.PNG)ファイルをエクスポートするZabbix

  21. 21

    Eclipseエラー:ビルドパスが不完全であると表示されます

ホットタグ

アーカイブ