mirror of
https://github.com/autc04/Retro68.git
synced 2025-03-02 10:30:00 +00:00
84 lines
1.9 KiB
C
84 lines
1.9 KiB
C
#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;
|
|
}
|