annotate libgomp/testsuite/libgomp.c-c++-common/task-reduction-2.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 #ifdef __cplusplus
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 extern "C"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 void abort (void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 struct S { long int s, t; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 bar (struct S *p, struct S *o)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 p->s = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 if (o->t != 5)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 p->t = 9;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 static inline void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 baz (struct S *o, struct S *i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 if (o->t != 5 || i->t != 9)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 o->s *= i->s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #pragma omp declare reduction (+: struct S : omp_out.s += omp_in.s) initializer (omp_priv = { 0, 3 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #pragma omp declare reduction (*: struct S : baz (&omp_out, &omp_in)) initializer (bar (&omp_priv, &omp_orig))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 struct S a = { 0, 7 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 struct S b = { 1, 5 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 foo (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 for (i = 0; i < 2; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 #pragma omp task in_reduction (*: b) in_reduction (+: a)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 a.s += 7;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 b.s *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 main ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 struct S c = { 0, 7 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 #pragma omp parallel
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 #pragma omp single
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 struct S d = { 1, 5 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 #pragma omp taskgroup task_reduction (+: a, c) task_reduction (*: b, d)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 for (i = 0; i < 4; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 #pragma omp task in_reduction (*: b, d) in_reduction (+: a, c)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 int j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 a.s += 7;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 b.s *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 for (j = 0; j < 2; j++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 #pragma omp task in_reduction (+: a) in_reduction (*: b) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 in_reduction (+: c) in_reduction (*: d)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 a.s += 7;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 b.s *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 c.s += 9;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 d.s *= 3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 foo ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 || (c.t != 7 && c.t != 3) || (d.t != 5 && d.t != 9))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 c.s += 9;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 d.s *= 3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 || (c.t != 7 && c.t != 3) || (d.t != 5 && d.t != 9))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 #define THREEP4 (3L * 3L * 3L * 3L)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 if (d.s != (THREEP4 * THREEP4 * THREEP4) || d.t != 5)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 if (a.s != 28 * 7 || a.t != 7 || b.s != (1L << 28) || b.t != 5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 || c.s != 12 * 9 || c.t != 7)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 abort ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 }