Оптимизация условного цикла Фортрана - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы оптимизировать для скорости следующий блок кода:

DO i=1, dim1
  DO j=1, dim2
    DO k=1, dim3
      IF (A(k,j,i)>0) &
        B(k,j,i) = exp(C(k))/A(k,j,i)
    ENDDO
  ENDDO
ENDDO

Очень важно, A - это INTEGER, а B и C - COMPLEX!

Есть две проблемы: 1) Как заменить это вызовом BLAS / LAPACK?Проблема заключается в условии.2) Расчет опыта идет медленно.Как ускорить это?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я выполнил пару тестов с idim[1-3], представляющими собой различные перестановки [40,40,1000], и обнаружил, что использование временного массива для экспоненты и поддержание порядка в исходном цикле будет самым быстрым с коэффициентом 2 или более по сравнению с другим ответомв комплект поставки.Вы можете варьировать в зависимости от компилятора и т. Д.

d=exp(c)
DO i=1, dim1
  DO j=1, dim2
    DO k=1, dim3
      IF (A(k,j,i)>0) &
        B(k,j,i) = d(k)/A(k,j,i)
    ENDDO
  ENDDO
ENDDO
0 голосов
/ 19 сентября 2018
DO k=1, dim3
  expCk= exp(C(k))
  DO i=1, dim1
    DO j=1, dim2
      IF (A(k,j,i)>0) &
        B(k,j,i) = expCk/A(k,j,i)
    ENDDO
  ENDDO
ENDDO

Я не думаю, что любая функция BLAS / LAPACK может быть здесь полезной.Обращение матричных элементов не является операцией, встречающейся в задачах линейной алгебры.

...