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