# matrix matrix multiplication using BLAS3 routine gemm

## matrix matrix multiplication using BLAS3 routine gemm

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

publicaciones de 3 / 0 nuevos
Para obtener más información sobre las optimizaciones del compilador, consulte el aviso sobre la optimización.

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'`

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

## Deje un comentario

Por favor inicie sesión para agregar un comentario. ¿No es socio?