blob: c8e6a0d0f1281c68a0c540788d1d55ac339cfa46 [file] [log] [blame] [edit]
! { 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