我有以下Fortran代码
DO ir = 1, N
cfac = exp( ci*B ) / dble( degen(ir) )
C(:,:) = C(:,:) + cfac*D(:,:, ir )
ENDDO
此循环使用gcc -02需要14.00s。
我想优化它。我试过BLAS 执行矩阵向量乘法的例程:
DO ir = 1, N
cfac(ir) = exp( ci*B ) / dble( degen(ir) )
ENDDO
DO j = 1, M
CALL zgemv ('n', M, N, cone, D(j,:,:), M,cfac(:),1,czero, C(j,:), 1 )
ENDDO
事实证明,我得到了相同的结果,但是...... 17.67s。
为什么它变慢,如何改进代码(不改变编译器选项)?
谢谢,
塞缪尔
答案 0 :(得分:1)
改进它的方法如下
DO ir = 1, N
cfac = exp( ci*B ) / dble( degen(ir) )
CALL zaxpy(M**2,cfac, D(1,1, ir ),1, C (1,1),1)
ENDDO
有了这个,我大致从15s到13s。