矩阵乘法与LAPACK,BLAS,dgemm,intiger参数类型

时间:2013-12-21 00:12:29

标签: fortran fortran90 matrix-multiplication lapack blas

我正在测试矩阵乘法的不同选项,矩阵的参数类型不同。其中之一是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可能导致不同结果的原因是什么?

1 个答案:

答案 0 :(得分:2)

DGEMM适用于double precision 真实的数字,不适用于整数(任何类型)。

如果在使用integer数字DGEMM时获得任何(正确的)结果,我会感到惊讶。

另一方面,

MATMUL接受integer作为输入。