我正在编写一个涉及大量指数函数调用的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()
计算的效率?
答案 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