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