FORTRAN - 减少函数调用开销

aru*_*zhi 2 optimization performance fortran function fortran90

我有这样的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 
Run Code Online (Sandbox Code Playgroud)

file2.f90

 module func1mod
 contains
     func1(var1,var2,var3,....)
         func1=some computations based on var1, var2, var3, ...
      return
     end function func1
 end module func1mod
Run Code Online (Sandbox Code Playgroud)

function func1不会修改它的任何参数.它根据参数计算值并返回一个值.参数数量很大,但函数少于30行代码.减少函数调用开销的最佳方法是什么?一种方法是内联函数.还有其他出路吗?

Jon*_*rsi 5

您可以做的最好的事情是尽可能明确地关于函数的语义,尽可能高的优化,并让编译器做出关于如何最好地实现调用的最佳决策.确保虚拟变量被标记intent(in),并将函数标记为pure- 尽管如果它只有30行,编译器无疑会在高优化时注意这些事情 - 并检查编译器选项以查看是否有任何可以做的事情来鼓励(对于实例)内联.

  • @arunmoezhi - 函数的"无副作用"意味着函数不会通过其结果对程序状态进行任何更改 - 它不会修改其参数,它不会执行IO,也不会更改模块变量或变量的共同点.PURE程序对它们有许多特定的限制(所有这些都是**约束**),它们一起意味着它们不会产生副作用.但请注意,对于程序而言,"实际上"没有任何副作用以使其被提名为纯粹是不够的 - 它必须*满足所有特定限制. (4认同)
  • pure 告诉编译器该函数没有副作用,是的,标记所有参数 intent(in) 表示在函数期间没有任何变化。并注意 -O3 不会开启 *all* 优化;检查您的编译器手册页,看看是否有任何额外的优化标志可能与这种情况相关。 (2认同)