我正在测试矩阵乘法的不同选项,矩阵的参数类型不同。其中之一是BLAS中的dgemm例程。当我想要一个矩阵定义为整数(kind = 1),大小为1000x1000(nxp)时,它会与dgemm一起崩溃,但matmul会做得很好。当我将矩阵的大小减小到500x500时,两者都运行良好。此外,我将所有矩阵定义为实数(8),都计算矩阵乘积但结果不同。我正在使用的代码是:
program test
implicit none
real(8), allocatable :: x(:,:),xi(:,:),xt(:,:)
integer(kind=1), allocatable :: z(:,:)
integer :: i,j,n,p
real(8):: u,myone= 1.d0
n=1000
p=1000
allocate(x(n,n),z(n,p),xi(n,n),xt(n,n))
do i=1,n
do j=1,p
call random_number(u)
z(i,j)=real(floor(u*3),8)
enddo
enddo
print*,"matmul"
x=matmul(z,transpose(z))
do i=1,min(10,n)
write(*,'(10(g10.3,x))') x(i,1:min(10,n))
enddo
print*,"dgemm"
call dgemm('n' ,'t' ,n,n,p,myone ,Z,n ,Z,n ,myone ,X,n)
do i=1,min(10,n)
write(*,'(10(g10.3,x))') x(i,1:min(10,n))
enddo
end program test
我使用make语句编译代码,该语句运行以下代码(我将其命名为:Makefile):
f90=ifort
optf90=-O0 -heap-arrays
optdir=-I
mkl=-L/opt/intel/mkl/lib -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -openmp -lpthread
prog=test
dir= .
a.out: $(prog).o
$(f90) $(optf90) \
$(prog).o \
$(mkl) $(libf77)
$(prog).o: $(prog).f90
$(f90) $(optdir)$(dir) -c $(optf90) $(prog).f90
有没有人知道定义为intigers的大矩阵的dgemm例程有什么问题?matmul / dgemm可能导致不同结果的原因是什么?