2013-12-21 1 views
0

Я тестирую различные варианты умножения матриц с разными типами параметров для матриц. Одна из них - процедура 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?

ответ

2

DGEMM работ на double precisionдействительные цифры, а не целые числа (любого рода).

Я был бы удивлен, если бы у вас были какие-либо (правильные) результаты при использовании integer номеров с DGEMM.

MATMUL, с другой стороны, принимает integer s как ввод.

 Смежные вопросы

  • Нет связанных вопросов^_^