有条件的Fortran循环的优化

时间:2018-09-19 11:02:24

标签: optimization fortran lapack blas

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

w/string

非常重要的是,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,而INTEGERBC

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

2 个答案:

答案 0 :(得分:3)

我用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

答案 1 :(得分:2)

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