blob: 4ba259ce819afd30a5cd1bdf2fb9b50f348692ee [file] [log] [blame]
#include <omp.h>
#include <stdlib.h>
void
foo (int x, int *a)
{
#pragma omp masked
{
if (omp_get_thread_num () != 0)
abort ();
a[128]++;
}
#pragma omp masked filter (0)
{
if (omp_get_thread_num () != 0)
abort ();
a[129]++;
}
#pragma omp masked filter (7)
{
if (omp_get_thread_num () != 7)
abort ();
a[130]++;
}
#pragma omp masked filter (x)
{
if (omp_get_thread_num () != x)
abort ();
a[131]++;
}
#pragma omp masked taskloop simd filter (x) grainsize (12) simdlen (4)
for (int i = 0; i < 128; i++)
a[i] += i;
}
int
main ()
{
int a[136] = {};
#pragma omp parallel num_threads (4)
foo (4, a);
for (int i = 0; i < 128; i++)
if (a[i])
abort ();
if (a[128] != 1 || a[129] != 1 || a[130] || a[131])
abort ();
#pragma omp parallel num_threads (4)
foo (3, a);
for (int i = 0; i < 128; i++)
if (a[i] != i)
abort ();
if (a[128] != 2 || a[129] != 2 || a[130] || a[131] != 1)
abort ();
#pragma omp parallel num_threads (8)
foo (8, a);
for (int i = 0; i < 128; i++)
if (a[i] != i)
abort ();
if (a[128] != 3 || a[129] != 3 || a[130] != 1 || a[131] != 1)
abort ();
#pragma omp parallel num_threads (8)
foo (6, a);
for (int i = 0; i < 128; i++)
if (a[i] != 2 * i)
abort ();
if (a[128] != 4 || a[129] != 4 || a[130] != 2 || a[131] != 2)
abort ();
for (int i = 0; i < 8; i++)
a[i] = 0;
/* The filter expression can evaluate to different values in different threads. */
#pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () + 1)
a[omp_get_thread_num ()]++;
for (int i = 0; i < 8; i++)
if (a[i])
abort ();
/* And multiple threads can be filtered. */
#pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () & ~1)
a[omp_get_thread_num ()]++;
for (int i = 0; i < 8; i++)
if (a[i] != !(i & 1))
abort ();
return 0;
}