Я работаю с числовой моделью, написанной на фортране, и в цикле есть узкое место.Часть узкого места связана с оператором возведения в степень (**), который описан ниже.Я написал операцию возведения в степень немного по-другому, и это влияет на производительность.Экспонента указывается следующим образом:
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
Хорошее руководство по программированию говорит нам избегать возведения в степень и максимально разлагать код, что делаетсмысл.Но почему это работает так?Кроме того, если вы знаете другие способы повышения эффективности цикла, это было бы здорово.
Спасибо!