1

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

4

2 回答 2

9

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

于 2012-07-05T23:06:54.077 回答
-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
于 2017-07-02T03:28:57.973 回答