当函数参数是一个变量时,如何提高Fortran内部函数调用的性能

时间:2012-07-05 23:01:39

标签: performance variables arguments fortran

我正在编写一个涉及大量指数函数调用的Fortran程序。我发现当exp()函数的参数是变量时,计算速度比使用常量值作为函数参数慢20多倍。例如,在以下两个示例程序中,程序A比程序B慢得多。

program A
real a,b
integer i

a=1.234
do i=1,100000000
  b=exp(a)
end do
stop
end program A

=====================

program B
integer i
real b

do i=1,100000000
  b=exp(1.234)
end do
stop
end program B

当使用变量作为exp()函数参数是不可避免的时候,如何提高进行exp()计算的效率?

2 个答案:

答案 0 :(得分:8)

有些编译器可以在编译时评估应用于常量的内部函数。因此,在这种情况下评估内在函数没有运行时间成本。显然,这不能用于真正的变量,因为直到运行时才会知道这些值。

答案 1 :(得分:-1)

看看你是否可以从编译器中获得一些优化报告......

英特尔的例子:

program A
real a,b
integer i

a=1.234
!DIR$ SIMD
do i=1,100000000
  b=exp(a)
end do

stop
end program A

使用OpenMP的示例:

program A2
USE OMP_LIB
real a,b
integer i

a=1.234
!DIR$ SIMD
do i=1,100000000
  b=exp(a)
end do

stop
end program A2

当然在这个微不足道的案例中......

program B2
real a,c
real, DIMENSION(100000000) ::b

a=1.234
c=exp(a)
b=c
!  which is mathematically the same as
!b(1:100000000) = c
!  or
!b(:) = c

stop
end program B2

我通常将这些类型的函数放入库中,然后使用!DIR @或!$ OMP进行编译,并将其调整,与主程序的优化级别无关。

MODULE MyFuncs
PRIVATE
PUBLIC, B2

CONTAINS
PURE SUBROUTINE B2(a,n,b)
IMPLICIT NONE
real              , INTENT(IN   ) :: a
INTEGER           , INTENT(IN   ) :: n
real, DIMENSION(n), INTENT(  OUT) :: b

c=exp(a)
!DIR$ SIMD
b=c

RETURN
END SUBROUTINE myB2

END MODULE MyFuncs

program A
IMPLICIT NONE
USE myFuncs
INTEGER            :: n=100000000
real               :: a
real, DIMENSION(n) :: b

a=1.234
CALL MyB2(a, n, b)

end program A