matrix matrix multiplication using BLAS3 routine gemm

matrix matrix multiplication using BLAS3 routine gemm

eide's picture

Hi,

I have some problems using the gemm routine, please see:

    program mm_test
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! test matrix matrix multiplication
!
! compile
!
!ifort   -w mm_test.f90 
!        "/opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64"/libmkl_intel_lp64.a 
!        -Wl,--start-group 
!               "/opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64"/libmkl_intel_thread.a 
!               "/opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64"/libmkl_core.a 
!        -Wl,--end-group 
!        -L"/opt/intel/composer_xe_2011_sp1.9.293/mkl/../compiler/lib/intel64" -liomp5 -lpthread 
!        -o x_mm
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    implicit none
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    integer   (kind = 4)               :: i,j
    real      (kind = 4)               :: a(2,3),b(3,2),c(2,2),alpha, beta
    complex   (kind = 8)               :: ca(2,3),cb(3,2),cc(2,2),calpha, cbeta
    character (len = 1)                :: transa,transb
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! real example
    transa = 'N'
    transb = 'N'
    alpha  = 1.0
    beta   = 0.0
    a(1,1) = 1.0
    a(1,2) = 2.0
    a(1,3) = 3.0
    a(2,1) = 4.0
    a(2,2) = 5.0
    a(2,3) = 6.0
    b = transpose(a)
    call sgemm(transa, transb, 2, 2, 3, alpha, a, 2, b, 3, beta, c, 2)
    print*,'result for real numbers'
    do i = 1,2
        do j = 1,2
            print*,i,j,c(i,j)
        enddo ! j
    enddo ! i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! double complex numbers
    transa = 'N'
    transb = 'N'
    calpha  = DCMPLX(1.0,0.0)
    cbeta   = DCMPLX(0.0,0.0)
    ca(1,1) = DCMPLX(1.0,0.0)
    ca(1,2) = DCMPLX(2.0,0.0)
    ca(1,3) = DCMPLX(3.0,0.0)
    ca(2,1) = DCMPLX(4.0,0.0)
    ca(2,2) = DCMPLX(5.0,0.0)
    ca(2,3) = DCMPLX(6.0,0.0)
    cb = dconjg(transpose(ca))
    call dzgemm(transa, transb, 2, 2, 3, calpha, ca, 2, cb, 3, cbeta, cc, 2)
    print*,'result for complex numbers'
    do i = 1,2
        do j = 1,2
            print*,i,j,cc(i,j)
        enddo ! j
    enddo ! i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! double complex numbers test with internal conjugate transpose
    transa = 'N'
    transb = 'C'
    calpha  = DCMPLX(1.0,0.0)
    cbeta   = DCMPLX(0.0,0.0)
    ca(1,1) = DCMPLX(1.0,0.0)
    ca(1,2) = DCMPLX(2.0,0.0)
    ca(1,3) = DCMPLX(3.0,0.0)
    ca(2,1) = DCMPLX(4.0,0.0)
    ca(2,2) = DCMPLX(5.0,0.0)
    ca(2,3) = DCMPLX(6.0,0.0)
    call dzgemm(transa, transb, 2, 2, 3, calpha, ca, 2, ca, 2, cbeta, cc, 2)
    print*,'result for complex numbers test'
    do i = 1,2
        do j = 1,2
            print*,i,j,cc(i,j)
        enddo ! j
    enddo ! i
    end program mm_test

it produces the following screen output

result for real numbers
           1           1   14.00000    
           1           2   32.00000    
           2           1   32.00000    
           2           2   77.00000    
 result for complex numbers
           1           1 (15.0000000000000,0.000000000000000E+000)
           1           2 (36.0000000000000,0.000000000000000E+000)
           2           1 (0.000000000000000E+000,0.000000000000000E+000)
           2           2 (0.000000000000000E+000,0.000000000000000E+000)
 result for complex numbers test
           1           1 (15.0000000000000,0.000000000000000E+000)
           1           2 (36.0000000000000,0.000000000000000E+000)
           2           1 (0.000000000000000E+000,0.000000000000000E+000)
           2           2 (0.000000000000000E+000,0.000000000000000E+000)

I wonder why the resulting complex matrix is not symmetric (like in the real number example), although it should be? Can anybody help me?

Thank you in advance.

Eide

3 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.
mecej4's picture

You are not calling dzgemm with arguments of the specified types. To catch this kind of error, add the following statement to your source code and the compiler will tell you what the errors are:


          include 'mkl.fi'

eide's picture

Hi mecej,

thank you very much. The first matrix has to be double precision - now it is correct. Thanks for the tip with the include file.

Cheers Eide

Login to leave a comment.