blob: 012f09d8f77c82fea361f009ef7d7925e579d107 [file] [log] [blame]
/* { dg-do run } */
/* { dg-set-target-env-var OMP_MAX_TASK_PRIORITY "10" } */
/* This test verifies that the "priority" clause of omp task works as
advertised.
Testing the OpenMP task scheduler is a bit tricky, especially when
trying to determine what ran first (without explicitly calling
time() and/or synchronizing between threads). What we do here is
run in single threaded mode which guarantees that we won't run into
data races while accessing the "prio" array.
We give each task a priority from 0..63, while setting
OMP_MAX_TASK_PRIORITY to 10, which basically gives us 10 lower
priority tasks, and the rest scheduled to run earlier. We verify
that the priority < 10 tasks run last. */
#include <omp.h>
#include <stdlib.h>
#define N 64
int main()
{
int tsknum=0, prio[N];
int max_priority = omp_get_max_task_priority ();
int saved_tsknum = -1;
int i;
#pragma omp parallel num_threads(1)
#pragma omp single private (i)
{
for (i = 0; i < N; i++)
#pragma omp task priority(i ^ 1)
{
int t;
#pragma omp atomic capture seq_cst
t = tsknum++;
prio[t] = i ^ 1;
}
#pragma omp atomic read seq_cst
saved_tsknum = tsknum;
}
/* If any of the tasks have run before all tasks were created, don't
make any assumption on the task order. Otherwise, we should have
tasks with >= max_priority scheduled first in arbitrary order,
followed by the rest of tasks in decreasing priority order, as
there is only one thread that can schedule them. */
if (saved_tsknum == 0)
{
for (i = 0; i < N; i++)
if (i < N - max_priority)
{
if (prio[i] < max_priority)
abort ();
}
else if (i != N - prio[i] - 1)
abort ();
}
return 0;
}