Почему этот цикл Фортрана более эффективен, если реализован немного по-другому? - PullRequest
3 голосов
/ 02 апреля 2019

Я работаю с числовой моделью, написанной на фортране, и в цикле есть узкое место.Часть узкого места связана с оператором возведения в степень (**), который описан ниже.Я написал операцию возведения в степень немного по-другому, и это влияет на производительность.Экспонента указывается следующим образом:

    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

Цикл обычно занимает менее 1,2секунд, если я жестко закодирую sds_power и изменим цикл на:

    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

Хорошее руководство по программированию говорит нам избегать возведения в степень и максимально разлагать код, что делаетсмысл.Но почему это работает так?Кроме того, если вы знаете другие способы повышения эффективности цикла, это было бы здорово.

Спасибо!

...