In the school's cluster, I find using a lapack subroutine zgemm can get different results from direct computation when performing matrix multiplication. Here is a sample code:
program main
implicit none
integer, parameter :: Dcut=64
complex(8), dimension(Dcut,Dcut) :: Lmat
complex(8), dimension(Dcut,Dcut**2) :: Tmat, outmat1, outmat2
integer :: a,b,c
real(8) :: Lr(Dcut,Dcut), Li(Dcut,Dcut), Tr(Dcut,Dcut**2), Ti(Dcut,Dcut**2)
! create Lmat and Tmat
call random_number( Lr )
call random_number( Li )
call random_number( Tr )
call random_number( Ti )
Lmat = cmplx( Lr, Li, kind=8 )
Tmat = cmplx( Tr, Ti, kind=8 )
! use zgemm to compute Lmat.Tmat
call zgemm( 'N','N',Dcut,Dcut**2,Dcut,(1.0D0,0.0D0),Lmat,Dcut,Tmat,Dcut,(0.0D0,0.0D0),&
outmat1,Dcut )
! direct computation of Lmat.Tmat
outmat2 = ( 0.0D0,0.0D0 )
do b=1, Dcut**2
do a=1, Dcut
do c=1, Dcut
outmat2(a,b) = outmat2(a,b) + Lmat( a,c ) * Tmat( c,b )
end do
end do
end do
print *,'diff', maxval( abs( outmat1-outmat2 ) )
end program main
And the output is: ' diff 4.32958511410900557E-014 '
Why two methods give different results, although the difference is very small?
I use gfortran and the version on the cluster is:
' gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) '
I use intel mkl and the version seems to be ' 2018.5.274 '
The code is run on CentOS release 6.6 (Final).
But when running on my own PC (wsl Ubuntu), the output is exactly 0.
For my PC, the version of gfortran is 'gcc version 9.4.0'