/* { 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 #include #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; }