1

Fortran と C でプログラミングを行っていますが、C プリプロセッサは、前処理定数を使用してコードを追加または非表示にする柔軟性が非常に優れていると思います。Fortran でこれを行う方法はわかりませんが、興味があります: Fortran コンパイラは、コンパイル時に削除できるコードを検出しますか?

これを例にとります:

program test_branch
    implicit none        

    logical, parameter :: echo = .false.
    integer :: n, sum

    sum = 0

    do n=1,100

        sum = sum + n**2

        if (echo) then
            print *, "Sum:", sum
        end if

    end do

end program test_branch

echo の値が変わることはありませんが、コンパイラがこれを認識しない場合でも、実行可能ファイルにデッドで到達不能なコードを含めるだけでなく、毎回分岐をチェックします。明らかに、これは特に分岐予測ではそれほど大きな違いではありませんが、そのような式を追加して、文字通り何も費用がかからないかどうか疑問に思っています。これを行う最適化設定はありますか、それともデフォルトで行われる可能性がありますか?

4

1 に答える 1

3

Fortran コンパイラと C コンパイラの両方が、デッド コードを削除して最適化する場合があります (ただし、そうする必要はありません)。

最適化はコンパイラの問題であることに注意してください。言語仕様は、最適化でできることとできないことだけを示しています。

GCCを使用する場合(つまりgfortran、Fortran コードとgccC コードの場合)、両方のコンパイラのフロントエンドは異なりますが、共通のミドルエンドと共通のバックエンドがあるため、最適化は多くの場合同じです。Fortran と C で同じアルゴリズムをコーディングすると、それらの最適化は非常に類似した内部表現で機能します。

また、要求されない限り、GCC は最適化を行いません。-Wall -O2asgccまたはgfortranコンパイラ オプションのようなものを渡したいとします。

于 2014-07-26T02:19:34.480 に答える