3

次のような Fortran コードがあります。

file1.f90

program myprog
 use func1mod
    do i=1,N
       call subroutine1
    enddo
    subroutine subroutine1
         integer*8::var1,var2,var3,...
         do j=1,N
            x=func1(var1,var2,var3,..)
            computations based on x
         enddo
    return
    end
end 

file2.f90

 module func1mod
 contains
     func1(var1,var2,var3,....)
         func1=some computations based on var1, var2, var3, ...
      return
     end function func1
 end module func1mod

関数 func1 は、その引数を変更しません。引数に基づいて値を計算し、値を返します。引数の数は多いが、関数のコードは 30 行未満です。関数呼び出しのオーバーヘッドを削減する最善の方法は何ですか。1 つのアプローチは、関数をインライン化することです。他の方法はありますか?

4

2 に答える 2

6

できる最善のことは、関数のセマンティクスについて可能な限り明示し、最適化を可能な限り高くし、呼び出しを実装するための最善の方法についてコンパイラーに可能な限り最善の決定をさせることです。ダミー変数がマークされていることを確認しintent(in)、関数をpure-としてマークします。ただし、30行しかない場合、コンパイラは高度な最適化でこれらのことに気付くでしょう-コンパイラオプションをチェックして、推奨できることがあるかどうかを確認します(インスタンス)インライン化。

于 2012-08-23T01:31:34.087 に答える
3

一般に、プロシージャ呼び出しのオーバーヘッドは低くなります。関数に30行のコードがある場合、実際の関数が関数呼び出しよりも支配的であるため、おそらくほとんど得られません。確認したい場合は、現在の実装の実行時間を測定してから、コードをインライン化してその実行時間を測定します。

于 2012-08-23T01:21:18.520 に答える