Я тестирую различные варианты умножения матриц с разными типами параметров для матриц. Одна из них - процедура dgemm в BLAS. Когда я хотел создать матрицу, определенную как integer (kind = 1) размером 1000x1000 (nxp), она разбилась с помощью dgemm, но matmul делает это хорошо. Когда я уменьшаю размер матриц до 500x500, обе работают хорошо. Кроме того, я определил все матрицы как вещественные (8), оба вычислили матричное произведение, но результаты были разными. Код, который я использую:Матричное умножение с LAPACK, BLAS, dgemm, тип параметра intiger
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
компилировать код с косметическим заявлением, в котором работает следующий код (я назвал его: 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
Кто-нибудь знает, что это проблема с обычной процедурой dgemm для больших матриц, определяемой как интигеры, и какова может быть причина для разных результатов с matmul/dgemm?