3

我有一个这样的fortran代码:

文件1.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 

文件2.f90

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

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

4

2 回答 2

6

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

于 2012-08-23T01:31:34.087 回答
3

通常,过程调用的开销很低。如果函数有 30 行代码,您可能会获得很少的收益,因为实际函数将支配函数调用。如果您想确定,请测量当前实现的运行时间,然后内联代码并测量该运行时间。

于 2012-08-23T01:21:18.520 回答