我正在使用用fortran编写的数值模型,并且循环中存在瓶颈。瓶颈的一部分与求幂运算符(**)有关,下面将对此进行介绍。我以略有不同的方式编写了幂运算,它影响了性能。指数指定为:
sds_power = 2.4
这是原始循环,在我的具体情况下,大约需要5秒才能完成。
DO i=istart,iend
DO p=1,pm
DO o=1,om
! these are real variables
sds(o,p,i) = twopisds_fac*f(o)&
*dummy(o,p,i)*(e(o,p,i)*k4(o,i))**sds_power
ENDDO
ENDDO
ENDDO
如果我对sds_power进行硬编码并将循环更改为以下内容,则该循环通常将花费不到1.2秒的时间:
DO i=istart,iend
DO p=1,pm
DO o=1,om
! these are real variables
sds(o,p,i) = twopisds_fac*f(o)&
*dummy(o,p,i)*(e(o,p,i)*k4(o,i))*&
*(e(o,p,i)*k4(o,i))*&
*(e(o,p,i)*k4(o,i))**0.4&
ENDDO
ENDDO
ENDDO
此Good Programming Guide告诉我们避免取幂,并尽可能地分解代码,这是有道理的。但是为什么这样工作呢?另外,如果您知道其他提高循环效率的方法,那就太好了。
谢谢!