5 subroutine matmul_depend (N
, BS
, A
, B
, C
)
8 real, dimension(N
, N
) :: A
, B
, C
9 integer :: i
, j
, k
, ii
, jj
, kk
14 !$omp task shared(A,B,C) private(ii,jj,kk) & ! I,J,K are firstprivate by default
15 !$omp depend ( in: A(i:i+BM, k:k+BM), B(k:k+BM, j:j+BM) ) &
16 !$omp depend ( inout: C(i:i+BM, j:j+BM) )
20 C(jj
,ii
) = C(jj
,ii
) + A(kk
,ii
) * B(jj
,kk
)
30 subroutine matmul_ref (N
, A
, B
, C
)
33 real, dimension(N
, N
) :: A
, B
, C
38 C(j
,i
) = C(j
,i
) + A(k
,i
) * B(j
,k
)
44 subroutine check (N
, A
, B
)
47 real, parameter :: EPS
= 0.000001
48 real, dimension(N
,N
) :: A
, B
52 diff
= A(i
, j
) - B(i
, j
)
53 if (diff
> EPS
.or
. -diff
> EPS
) then
60 subroutine init (N
, A
, B
)
63 real, dimension(N
,N
) :: A
, B
74 subroutine zero_init (N
, A
, B
)
77 real, dimension(N
,N
) :: A
, B
90 real, dimension(32, 32) :: A
, B
, C
, C_ref
93 call zero_init (32, C
, C_ref
)
95 call matmul_depend(32, 4, A
, B
, C
)
96 call matmul_ref(32, A
, B
, C_ref
)
98 call check (32, C
, C_ref
)