0
|
1 /* { dg-do run } */
|
|
2
|
|
3 #include <omp.h>
|
|
4 #include <stdlib.h>
|
|
5 #include <string.h>
|
|
6
|
|
7 int
|
|
8 main (int argc, char **argv[])
|
|
9 {
|
|
10 int n = argc < 5 ? 12 : 31, i, m, l;
|
|
11 char a[n + 3];
|
|
12 unsigned short b[n / 2 - 1];
|
|
13 int c[n * 2 + 1];
|
|
14
|
|
15 for (i = 0; i < n + 3; i++)
|
|
16 a[i] = i;
|
|
17 for (i = 0; i < n / 2 - 1; i++)
|
|
18 b[i] = (i << 8) | i;
|
|
19 for (i = 0; i < n * 2 + 1; i++)
|
|
20 c[i] = (i << 24) | i;
|
|
21 l = 0;
|
|
22 m = n;
|
|
23 #pragma omp parallel default (shared) num_threads (4) \
|
|
24 firstprivate (a, m) private (b, i) reduction (+:l)
|
|
25 {
|
|
26 for (i = 0; i < m + 3; i++)
|
|
27 if (a[i] != i)
|
|
28 l++;
|
|
29 for (i = 0; i < m * 2 + 1; i++)
|
|
30 if (c[i] != ((i << 24) | i))
|
|
31 l++;
|
|
32 #pragma omp barrier
|
|
33 memset (a, omp_get_thread_num (), m + 3);
|
|
34 for (i = 0; i < m / 2 - 1; i++)
|
|
35 b[i] = a[0] + 7;
|
|
36 #pragma omp master
|
|
37 {
|
|
38 for (i = 0; i < m * 2 + 1; i++)
|
|
39 c[i] = a[0] + 16;
|
|
40 }
|
|
41 #pragma omp barrier
|
|
42 if (a[0] != omp_get_thread_num ())
|
|
43 l++;
|
|
44 for (i = 1; i < m + 3; i++)
|
|
45 if (a[i] != a[0])
|
|
46 l++;
|
|
47 for (i = 0; i < m / 2 - 1; i++)
|
|
48 if (b[i] != a[0] + 7)
|
|
49 l++;
|
|
50 for (i = 0; i < m * 2 + 1; i++)
|
|
51 if (c[i] != 16)
|
|
52 l++;
|
|
53 }
|
|
54 if (l)
|
|
55 abort ();
|
|
56 for (i = 0; i < n * 2 + 1; i++)
|
|
57 if (c[i] != 16)
|
|
58 l++;
|
|
59 return 0;
|
|
60 }
|