条件 Fortran 循环的优化

Optimization of conditional Fortran loop

我想优化以下代码块的速度:

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

非常重要的是,AINTEGERBCCOMPLEX!

有两个问题: 1) 如何用 BLAS/LAPACK 调用替换它?问题是条件。 2) exp 的计算很慢。如何加快速度?

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 功能在这里都无济于事。矩阵元素求逆不是线性代数问题中遇到的运算。

我 运行 进行了一些测试 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