aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/icv-6.f90
blob: c8e6a0d0f1281c68a0c540788d1d55ac339cfa46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
! { dg-set-target-env-var OMP_NUM_TEAMS_ALL "3" }
! { dg-set-target-env-var OMP_NUM_TEAMS_DEV "4" }
! { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_ALL "2" }
! { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_DEV "3" }

! This test considers the hierarchical usage of ICVs on the device, i.e. if
! e.g. OMP_NUM_TEAMS_DEV_<device_num> is not configured, then the value of
! OMP_NUM_TEAMS_DEV should be used for the targets.

use omp_lib
implicit none (type, external)
  integer :: num_devices, i, stat, tmp
  logical :: err
  character(len=40) :: val

  ! The following environment variables should not be set.
  call get_environment_variable ("OMP_NUM_TEAMS_DEV_0", val, status=stat)
  if (stat /= 1) return
  call get_environment_variable ("OMP_NUM_TEAMS_DEV_1", val, status=stat)
  if (stat /= 1) return
  call get_environment_variable ("OMP_NUM_TEAMS_DEV_2", val, status=stat)
  if (stat /= 1) return
  call get_environment_variable ("OMP_TEAMS_THREAD_LIMIT_DEV_0", val, status=stat)
  if (stat /= 1) return
  call get_environment_variable ("OMP_TEAMS_THREAD_LIMIT_DEV_1", val, status=stat)
  if (stat /= 1) return
  call get_environment_variable ("OMP_TEAMS_THREAD_LIMIT_DEV_2", val, status=stat)
  if (stat /= 1) return

  if (omp_get_num_devices () > 3) then
    num_devices = 3
  else
    num_devices = omp_get_num_devices ()
  end if

  do i=0,num_devices-1

    ! Testing NUM_TEAMS.
    if (env_is_set ("OMP_NUM_TEAMS_DEV", "4")) then
      err = .false.
      !$omp target device(i) map(tofrom: err)
      if (omp_get_max_teams () /= 4) err = .true.
      !$omp end target
      if (err) stop 1

      err = .false.
      !$omp target device(i) map(tofrom: err)
      !$omp teams
      if (omp_get_num_teams () > 4 .or. omp_get_team_num () >= 4) &
        err = .true.
      !$omp end teams
      !$omp end target
      if (err) stop 2

      err = .false.
      !$omp target device(i) map(tofrom: err)
      call omp_set_num_teams (3 + i)
      if (omp_get_max_teams () /= 3 + i) err = .true.
      !$omp end target
      if (err) stop 3

      err = .false.
      !$omp target device(i) map(tofrom: err)
      if (omp_get_max_teams () /= 3 + i) err = .true.
      !$omp end target
      if (err) stop 4

      err = .false.
      !$omp target device(i) map(tofrom: err)
      !$omp teams
      if (omp_get_num_teams () > 3 + i .or. omp_get_team_num () >= 3 + i) &
        err = .true.
      !$omp end teams
      !$omp end target
      if (err) stop 5
    end if

    ! Testing TEAMS-THREAD-LIMIT
    if (env_is_set ("OMP_TEAMS_THREAD_LIMIT_DEV", "3")) then
      err = .false.
      !$omp target device(i) map(tofrom: err)
      if (omp_get_teams_thread_limit () /= 3) err = .true.
      !$omp end target
      if (err) stop 6

      err = .false.
      !$omp target device(i) map(tofrom: err)
      !$omp teams
      !$omp parallel
      if (omp_get_thread_limit () > 3 .or. omp_get_thread_num () >= 3) &
        err = .true.
      !$omp end parallel
      !$omp end teams
      !$omp end target
      if (err) stop 7

      err = .false.
      !$omp target device(i) map(tofrom: err)
      call omp_set_teams_thread_limit (2 + i)
      if (omp_get_teams_thread_limit () /= 2 + i) err = .true.
      !$omp end target
      if (err) stop 8

      err = .false.
      !$omp target device(i) map(tofrom: err)
      if (omp_get_teams_thread_limit () /= 2 + i) err = .true.
      !$omp end target
      if (err) stop 9

      err = .false.
      !$omp target device(i) map(tofrom: err)
      !$omp teams
      !$omp parallel
      if (omp_get_thread_limit () > 2 + i .or. omp_get_thread_num () >= 2 + i) &
        err = .true.
      !$omp end parallel
      !$omp end teams
      !$omp end target
      if (err) stop 10
    end if

  end do

contains
  logical function env_is_set (name, val)
    character(len=*) :: name, val
    character(len=40) :: val2
    integer :: stat
    call get_environment_variable (name, val2, status=stat)
    if (stat == 0) then
      if (val == val2) then
        env_is_set = .true.
        return
      end if
    else if (stat /= 1) then
      error stop 10
    endif
    env_is_set = .false.
  end
end