Add support for ARMv8-R architecture
[official-gcc.git] / libgomp / testsuite / libgomp.fortran / examples-4 / task_dep-5.f90
blob0746531728e301a4213e7ce33d4aaf00f6f4a06e
1 ! { dg-do run }
3 module task_dep5_mod
4 contains
5 subroutine matmul_depend (N, BS, A, B, C)
6 implicit none
7 integer :: N, BS, BM
8 real, dimension(N, N) :: A, B, C
9 integer :: i, j, k, ii, jj, kk
10 BM = BS - 1
11 do i = 1, N, BS
12 do j = 1, N, BS
13 do k = 1, N, BS
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) )
17 do ii = i, i+BM
18 do jj = j, j+BM
19 do kk = k, k+BM
20 C(jj,ii) = C(jj,ii) + A(kk,ii) * B(jj,kk)
21 end do
22 end do
23 end do
24 !$omp end task
25 end do
26 end do
27 end do
28 end subroutine
30 subroutine matmul_ref (N, A, B, C)
31 implicit none
32 integer :: N
33 real, dimension(N, N) :: A, B, C
34 integer :: i, j, k
35 do i = 1, N
36 do j = 1, N
37 do k = 1, N
38 C(j,i) = C(j,i) + A(k,i) * B(j,k)
39 end do
40 end do
41 end do
42 end subroutine
44 subroutine check (N, A, B)
45 integer :: N
46 integer :: i, j
47 real, parameter :: EPS = 0.000001
48 real, dimension(N,N) :: A, B
49 real :: diff
50 do i = 1, N
51 do j = 1, N
52 diff = A(i, j) - B(i, j)
53 if (diff > EPS .or. -diff > EPS) then
54 call abort ()
55 end if
56 end do
57 end do
58 end subroutine
60 subroutine init (N, A, B)
61 integer :: N
62 integer :: i, j, s
63 real, dimension(N,N) :: A, B
64 s = -1
65 do i = 1, N
66 do j = 1, N
67 A(i, j) = i*j*s
68 B(i, j) = i+j
69 s = -s
70 end do
71 end do
72 end subroutine
74 subroutine zero_init (N, A, B)
75 integer :: N
76 integer :: i, j
77 real, dimension(N,N) :: A, B
78 do i = 1, N
79 do j = 1, N
80 A(i, j) = 0
81 B(i, j) = 0
82 end do
83 end do
84 end subroutine
86 end module
88 program main
89 use task_dep5_mod
90 real, dimension(32, 32) :: A, B, C, C_ref
92 call init (32, A, B)
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)
100 end program