条件 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
非常重要的是,A
是 INTEGER
而 B
和 C
是 COMPLEX
!
有两个问题:
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
我想优化以下代码块的速度:
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 的计算很慢。如何加快速度?
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