为什么以稍微不同的方式实现此fortran循环会更有效率?

时间:2019-04-02 17:19:46

标签: performance fortran hpc

我正在使用用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告诉我们避免取幂,并尽可能地分解代码,这是有道理的。但是为什么这样工作呢?另外,如果您知道其他提高循环效率的方法,那就太好了。

谢谢!

0 个答案:

没有答案