1 ! Exercise three levels of parallelism using SGEMM from BLAS.
4 ! { dg-additional-options "-fopenacc-dim=::128" }
6 ! { dg-additional-options -Wuninitialized }
8 ! Implicitly set vector_length to 128 using -fopenacc-dim.
9 subroutine openacc_sgemm (m
, n
, k
, alpha
, a
, b
, beta
, c
)
12 real :: a(k
,*), b(k
,*), c(m
,*)
16 ! { dg-note {'temp' was declared here} {} { target *-*-* } .-1 }
18 !$acc parallel loop copy(c(1:m,1:n)) copyin(a(1:k,1:m),b(1:k,1:n)) firstprivate (temp)
19 ! { dg-warning {'temp' is used uninitialized} {} { target *-*-* } .-1 }
24 !$acc loop reduction(+:temp)
26 temp
= temp
+ a(l
,i
)*b(l
,j
)
31 c(i
,j
) = alpha
*temp
+ beta
*c(i
,j
)
35 end subroutine openacc_sgemm
37 subroutine host_sgemm (m
, n
, k
, alpha
, a
, b
, beta
, c
)
40 real :: a(k
,*), b(k
,*), c(m
,*)
49 temp
= temp
+ a(l
,i
)*b(l
,j
)
54 c(i
,j
) = alpha
*temp
+ beta
*c(i
,j
)
58 end subroutine host_sgemm
61 integer, parameter :: M
= 100, N
= 50, K
= 2000
62 real :: a(K
, M
), b(K
, N
), c(M
, N
), d (M
, N
), e (M
, N
)
76 call openacc_sgemm (M
, N
, K
, alpha
, a
, b
, beta
, c
)
77 call host_sgemm (M
, N
, K
, alpha
, a
, b
, beta
, e
)
81 if (c(i
,j
) /= e(i
,j
)) stop 1