blob: 72d7af6dfd414458b148f37ec422eaba9a61cfa6 [file] [log] [blame]
/* { dg-do run } */
/* { 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_NUM_TEAMS "5" } */
/* { dg-set-target-env-var OMP_NUM_TEAMS_DEV_0 "6" } */
/* { dg-set-target-env-var OMP_NUM_TEAMS_DEV_1 "7" } */
/* { dg-set-target-env-var OMP_NUM_TEAMS_DEV_2 "8" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_ALL "2" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_DEV "3" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT "4" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_DEV_0 "5" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_DEV_1 "6" } */
/* { dg-set-target-env-var OMP_TEAMS_THREAD_LIMIT_DEV_2 "7" } */
#include <omp.h>
#include <stdlib.h>
#include <unistd.h>
int
main ()
{
if (omp_get_max_teams () != 5
|| omp_get_teams_thread_limit () != 4)
abort ();
#pragma omp teams
{
if (omp_get_num_teams () > 5
|| omp_get_team_num () >= 5)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 4
|| omp_get_thread_num () >= 4)
abort ();
}
omp_set_num_teams (4);
omp_set_teams_thread_limit (3);
if (omp_get_max_teams () != 4
|| omp_get_teams_thread_limit () != 3)
abort ();
#pragma omp teams
{
if (omp_get_num_teams () > 4
|| omp_get_team_num () >= 4)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 3
|| omp_get_thread_num () >= 3)
abort ();
}
#pragma omp teams num_teams(3) thread_limit(2)
{
if (omp_get_num_teams () != 3
|| omp_get_team_num () >= 3)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 2
|| omp_get_thread_num () >= 2)
abort ();
}
#pragma omp teams num_teams(5) thread_limit(4)
{
if (omp_get_num_teams () != 5
|| omp_get_team_num () >= 5)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 4
|| omp_get_thread_num () >= 4)
abort ();
}
int num_devices = omp_get_num_devices () > 3 ? 3 : omp_get_num_devices ();
for (int i = 0; i < num_devices; i++)
{
#pragma omp target device (i)
if (omp_get_max_teams () != 6 + i
|| omp_get_teams_thread_limit () != 5 + i)
abort ();
#pragma omp target device (i)
#pragma omp teams
#pragma omp parallel
if (omp_get_thread_limit () > 5 + i
|| omp_get_thread_num () >= 5 + i)
abort ();
#pragma omp target device (i)
{
omp_set_num_teams (5 + i);
omp_set_teams_thread_limit (4 + i);
if (omp_get_max_teams () != 5 + i
|| omp_get_teams_thread_limit () != 4 + i)
abort ();
}
/* omp_set_num_teams and omp_set_teams_thread_limit above set the value
of nteams-var and teams-thread-limit-var ICVs on device 'i', which has
scope 'device' and should be avaible in subsequent target regions. */
#pragma omp target device (i)
if (omp_get_max_teams () != 5 + i
|| omp_get_teams_thread_limit () != 4 + i)
abort ();
#pragma omp target device (i)
#pragma omp teams
{
if (omp_get_num_teams () > 5 + i
|| omp_get_team_num () >= 5 + i)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 4 + i
|| omp_get_thread_num () >= 4 + i)
abort ();
}
#pragma omp target device (i)
#pragma omp teams num_teams(6 + i) thread_limit(5 + i)
{
if (omp_get_num_teams () > 6 + i
|| omp_get_team_num () >= 6 + i)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 5 + i
|| omp_get_thread_num () >= 5 + i
|| omp_get_num_teams () > 6 + i
|| omp_get_team_num () >= 6 + i)
abort ();
}
#pragma omp target device (i)
#pragma omp teams num_teams(4 + i) thread_limit(3 + i)
{
if (omp_get_num_teams () > 4 + i
|| omp_get_team_num () >= 4 + i)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 3 + i
|| omp_get_thread_num () >= 3 + i
|| omp_get_num_teams () > 4 + i
|| omp_get_team_num () >= 4 + i)
abort ();
}
#pragma omp target device (i)
#pragma omp teams thread_limit(3 + i) num_teams(4 + i)
{
if (omp_get_num_teams () > 4 + i
|| omp_get_team_num () >= 4 + i)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > 3 + i
|| omp_get_thread_num () >= 3 + i
|| omp_get_num_teams () > 4 + i
|| omp_get_team_num () >= 4 + i)
abort ();
}
/* The NUM_TEAMS and THREAD_LIMIT clauses should not change the values
of the corresponding ICVs. */
#pragma omp target device (i)
if (omp_get_max_teams () != 5 + i
|| omp_get_teams_thread_limit () != 4 + i)
abort ();
/* This tests a large number of teams and threads. If it is larger than
2^15+1 then the according argument in the kernels arguments list
is encoded with two items instead of one. */
intptr_t large_num_teams = 66000;
intptr_t large_threads_limit = 67000;
#pragma omp target device (i)
{
omp_set_num_teams (large_num_teams + i);
omp_set_teams_thread_limit (large_threads_limit + i);
if (omp_get_max_teams () != large_num_teams + i
|| omp_get_teams_thread_limit () != large_threads_limit + i)
abort ();
}
#pragma omp target device (i)
if (omp_get_max_teams () != large_num_teams + i
|| omp_get_teams_thread_limit () != large_threads_limit + i)
abort ();
#pragma omp target device (i)
#pragma omp teams
{
if (omp_get_num_teams () > large_num_teams + i
|| omp_get_team_num () >= large_num_teams + i)
abort ();
#pragma omp parallel
if (omp_get_thread_limit () > large_threads_limit + i
|| omp_get_thread_num () >= large_threads_limit + i)
abort ();
}
}
return 0;
}