【发布时间】:2019-03-13 07:54:06
【问题描述】:
下面这个函数在我的程序中用得最多。
CONTAINS
SUBROUTINE Delta4(R,Del)
REAL(DP), DIMENSION(:), INTENT(IN) :: R
REAL(DP), DIMENSION(:), INTENT(OUT) :: Del
INTEGER(I4B) :: i, j, r_n, c_n
REAL(DP) :: ar
!r_n=size(R,1);
Del=0.0_dp
do i=1,4; ar=ABS(R(i))
if (ar <= 1.0_dp) then
Del(i)=(3.0_dp-2.0_dp*ar+ &
sqrt(1.0_dp+4.0_dp*ar-4.0_dp*ar*ar))*0.125_dp
else !! if (1.0_dp < ar .and. ar <= 2.0_dp) then
Del(i)=(5.0_dp-2.0_dp*ar- &
sqrt(-7.0_dp+12.0_dp*ar-4.0_dp*ar*ar))*0.125_dp
end if
end do
R, Del:长度为4的向量
所以我想提高这个功能的速度。
据我所知,if-else 分支很慢。此外,它处于do循环中。
如何优化它?
【问题讨论】:
-
我添加了一个有趣的改进。
-
你说 if-else 分支很慢:你做了什么测量?不衡量就优化是没有意义的!
-
对不起弗朗索瓦,你是对的。我认为 if-else 很慢,因为它是条件语句。
标签: performance if-statement optimization fortran do-loops