1 #include <omp.h>
2 #include <stdlib.h>
3
4 void
5 foo (int x, int *a)
6 {
7 #pragma omp masked
8 {
9 if (omp_get_thread_num () != 0)
10 abort ();
11 a[128]++;
12 }
13 #pragma omp masked filter (0)
14 {
15 if (omp_get_thread_num () != 0)
16 abort ();
17 a[129]++;
18 }
19 #pragma omp masked filter (7)
20 {
21 if (omp_get_thread_num () != 7)
22 abort ();
23 a[130]++;
24 }
25 #pragma omp masked filter (x)
26 {
27 if (omp_get_thread_num () != x)
28 abort ();
29 a[131]++;
30 }
31 #pragma omp masked taskloop simd filter (x) grainsize (12) simdlen (4)
32 for (int i = 0; i < 128; i++)
33 a[i] += i;
34 }
35
36 int
37 main ()
38 {
39 int a[136] = {};
40 #pragma omp parallel num_threads (4)
41 foo (4, a);
42 for (int i = 0; i < 128; i++)
43 if (a[i])
44 abort ();
45 if (a[128] != 1 || a[129] != 1 || a[130] || a[131])
46 abort ();
47 #pragma omp parallel num_threads (4)
48 foo (3, a);
49 for (int i = 0; i < 128; i++)
50 if (a[i] != i)
51 abort ();
52 if (a[128] != 2 || a[129] != 2 || a[130] || a[131] != 1)
53 abort ();
54 #pragma omp parallel num_threads (8)
55 foo (8, a);
56 for (int i = 0; i < 128; i++)
57 if (a[i] != i)
58 abort ();
59 if (a[128] != 3 || a[129] != 3 || a[130] != 1 || a[131] != 1)
60 abort ();
61 #pragma omp parallel num_threads (8)
62 foo (6, a);
63 for (int i = 0; i < 128; i++)
64 if (a[i] != 2 * i)
65 abort ();
66 if (a[128] != 4 || a[129] != 4 || a[130] != 2 || a[131] != 2)
67 abort ();
68 for (int i = 0; i < 8; i++)
69 a[i] = 0;
70 /* The filter expression can evaluate to different values in different threads. */
71 #pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () + 1)
72 a[omp_get_thread_num ()]++;
73 for (int i = 0; i < 8; i++)
74 if (a[i])
75 abort ();
76 /* And multiple threads can be filtered. */
77 #pragma omp parallel masked num_threads (8) filter (omp_get_thread_num () & ~1)
78 a[omp_get_thread_num ()]++;
79 for (int i = 0; i < 8; i++)
80 if (a[i] != !(i & 1))
81 abort ();
82 return 0;
83 }