mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-02 18:53:22 +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;
|
|
}
|