Commit 6893f028 authored by Pavel Kus's avatar Pavel Kus

rewriting matrix-matrix multiplications by BLAS calls

parent cf3cb8dc
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
real(kind=C_DATATYPE_KIND) :: h_mat(4, nb+3) real(kind=C_DATATYPE_KIND) :: h_mat(4, nb+3)
real(kind=C_DATATYPE_KIND) :: s_mat(4, 4) real(kind=C_DATATYPE_KIND) :: s_mat(4, 4)
integer(kind=ik) :: i integer(kind=ik) :: i, j, k
! Calculate dot product of the two Householder vectors ! Calculate dot product of the two Householder vectors
...@@ -102,24 +102,33 @@ ...@@ -102,24 +102,33 @@
h_mat(3,3:nb+1) = -hh(2:nb, 3) h_mat(3,3:nb+1) = -hh(2:nb, 3)
h_mat(4,2:nb) = -hh(2:nb, 4) h_mat(4,2:nb) = -hh(2:nb, 4)
! TODO we actually need just the strictly upper triangle of s_mat ! TODO we do not need the diagonal, but how to do it with BLAS?
! TODO take care when changing to BLAS !s_mat = - matmul(h_mat, transpose(h_mat))
! TODO we do not even need diagonal, which might not be achievable by blas. call DSYRK('L', 'N', 4, nb+3, &
! TODO lets see how much does it matter -1.0_rk8, h_mat, 4, &
s_mat = - matmul(h_mat, transpose(h_mat)) 0.0_rk8, s_mat, 4)
s_mat(1,1) = 1 s_mat(1,1) = 1
s_mat(2,2) = 1 s_mat(2,2) = 1
s_mat(3,3) = 1 s_mat(3,3) = 1
s_mat(4,4) = 1 s_mat(4,4) = 1
w_comb = matmul(q(1:ldq, 1:nb+3), -transpose(h_mat)) ! w_comb = - matmul(q(1:nq, 1:nb+3), transpose(h_mat))
call DGEMM('N', 'T', nq, 4, nb+3, &
-1.0_rk8, q, ldq, &
h_mat, 4, &
0.0_rk8, w_comb, nq)
! Rank-1 update ! Rank-1 update
do i = 1, 4 do i = 1, 4
w_comb(1:nq,i) = matmul(w_comb(1:nq,1:i), hh(1,i) * s_mat(i,1:i)) w_comb(1:nq,i) = matmul(w_comb(1:nq,1:i), hh(1,i) * s_mat(i,1:i))
enddo enddo
q(1:nq, 1:nb+3) = matmul(w_comb, h_mat) + q(1:nq, 1:nb+3) !q(1:nq, 1:nb+3) = matmul(w_comb, h_mat) + q(1:nq, 1:nb+3)
call DGEMM('N', 'N', nq, nb+3, 4, &
1.0_rk8, w_comb, nq, &
h_mat, 4, &
1.0_rk8, q, ldq)
end subroutine end subroutine
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment