mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-03 10:49:58 +00:00
63 lines
1.7 KiB
C
63 lines
1.7 KiB
C
|
/* { 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;
|
||
|
}
|