代码之家  ›  专栏  ›  技术社区  ›  sponce

条件Fortran循环的优化

  •  0
  • sponce  · 技术社区  · 6 年前

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

    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) exp的计算很慢。如何加快速度?

    2 回复  |  直到 6 年前
        1
  •  3
  •   RussF    6 年前

    我做了几个测试 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
    
        2
  •  2
  •   Yves Daoust    6 年前
    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