我想优化以下代码块的速度:
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
,而INTEGER
和B
是C
!
有两个问题: 1)如何用BLAS / LAPACK呼叫代替它?问题是条件。 2)exp的计算很慢。如何加快速度?
答案 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功能在这里都无济于事。矩阵元素的求逆不是线性代数问题中遇到的运算。