103 lines
2.2 KiB
Fortran
103 lines
2.2 KiB
Fortran
! { dg-do run }
|
|
use omp_lib
|
|
call test_master
|
|
call test_critical
|
|
call test_barrier
|
|
call test_atomic
|
|
|
|
contains
|
|
subroutine test_master
|
|
logical :: i, j
|
|
i = .false.
|
|
j = .false.
|
|
!$omp parallel num_threads (4)
|
|
!$omp master
|
|
i = .true.
|
|
j = omp_get_thread_num () .eq. 0
|
|
!$omp endmaster
|
|
!$omp end parallel
|
|
if (.not. (i .or. j)) call abort
|
|
end subroutine test_master
|
|
|
|
subroutine test_critical_1 (i, j)
|
|
integer :: i, j
|
|
!$omp critical(critical_foo)
|
|
i = i + 1
|
|
!$omp end critical (critical_foo)
|
|
!$omp critical
|
|
j = j + 1
|
|
!$omp end critical
|
|
end subroutine test_critical_1
|
|
|
|
subroutine test_critical
|
|
integer :: i, j, n
|
|
n = -1
|
|
i = 0
|
|
j = 0
|
|
!$omp parallel num_threads (4)
|
|
if (omp_get_thread_num () .eq. 0) n = omp_get_num_threads ()
|
|
call test_critical_1 (i, j)
|
|
call test_critical_1 (i, j)
|
|
!$omp critical
|
|
j = j + 1
|
|
!$omp end critical
|
|
!$omp critical (critical_foo)
|
|
i = i + 1
|
|
!$omp endcritical (critical_foo)
|
|
!$omp end parallel
|
|
if (n .lt. 1 .or. i .ne. n * 3 .or. j .ne. n * 3) call abort
|
|
end subroutine test_critical
|
|
|
|
subroutine test_barrier
|
|
integer :: i
|
|
logical :: j
|
|
i = 23
|
|
j = .false.
|
|
!$omp parallel num_threads (4)
|
|
if (omp_get_thread_num () .eq. 0) i = 5
|
|
!$omp flush (i)
|
|
!$omp barrier
|
|
if (i .ne. 5) then
|
|
!$omp atomic
|
|
j = j .or. .true.
|
|
end if
|
|
!$omp end parallel
|
|
if (i .ne. 5 .or. j) call abort
|
|
end subroutine test_barrier
|
|
|
|
subroutine test_atomic
|
|
integer :: a, b, c, d, e, f, g
|
|
a = 0
|
|
b = 1
|
|
c = 0
|
|
d = 1024
|
|
e = 1024
|
|
f = -1
|
|
g = -1
|
|
!$omp parallel num_threads (8)
|
|
!$omp atomic
|
|
a = a + 2 + 4
|
|
!$omp atomic
|
|
b = 3 * b
|
|
!$omp atomic
|
|
c = 8 - c
|
|
!$omp atomic
|
|
d = d / 2
|
|
!$omp atomic
|
|
e = min (e, omp_get_thread_num ())
|
|
!$omp atomic
|
|
f = max (omp_get_thread_num (), f)
|
|
if (omp_get_thread_num () .eq. 0) g = omp_get_num_threads ()
|
|
!$omp end parallel
|
|
if (g .le. 0 .or. g .gt. 8) call abort
|
|
if (a .ne. 6 * g .or. b .ne. 3 ** g) call abort
|
|
if (iand (g, 1) .eq. 1) then
|
|
if (c .ne. 8) call abort
|
|
else if (c .ne. 0) then
|
|
call abort
|
|
end if
|
|
if (d .ne. 1024 / (2 ** g)) call abort
|
|
if (e .ne. 0 .or. f .ne. g - 1) call abort
|
|
end subroutine test_atomic
|
|
end
|