2018-11-09 Jakub Jelinek <jakub@redhat.com>
[official-gcc.git] / libgomp / testsuite / libgomp.c-c++-common / task-reduction-14.c
blob37c00d4394aaa57690e17a64494f933bdad8a882
1 extern
2 #ifdef __cplusplus
3 "C"
4 #endif
5 void abort (void);
6 #pragma omp declare reduction (foo: int: omp_out += omp_in - 1) initializer (omp_priv = 1)
8 int
9 main ()
11 int i, v = 0;
12 unsigned long long j;
13 volatile unsigned long long sixtyfour = 64;
14 int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
15 #pragma omp parallel
17 #define P(str) _Pragma (#str)
18 #define ONE_ORDERED_LOOP(var, i, max, n, clauses...) \
19 P (omp for ordered(1) reduction (task, foo: var) clauses) \
20 for (i = 1; i <= max; i++) \
21 { \
22 P (omp task in_reduction (foo: var)) \
23 var++; \
24 P (omp ordered depend(sink: i - 1)) \
25 if (v++ != i + n - 1) \
26 abort (); \
27 _Pragma ("omp ordered depend(source)") \
28 var++; \
29 } \
30 if (var != 128 || v != 64 + n) \
31 abort (); \
32 _Pragma ("omp barrier")
33 ONE_ORDERED_LOOP (a, i, 64, 0, )
34 ONE_ORDERED_LOOP (b, i, 64, 64, schedule (monotonic: static))
35 ONE_ORDERED_LOOP (c, i, 64, 128, schedule (static, 1))
36 ONE_ORDERED_LOOP (d, i, 64, 192, schedule (monotonic: runtime))
37 ONE_ORDERED_LOOP (e, i, 64, 256, schedule (dynamic, 2))
38 ONE_ORDERED_LOOP (f, i, 64, 320, schedule (monotonic: guided, 3))
39 ONE_ORDERED_LOOP (g, i, 64, 384, schedule (auto))
40 #pragma omp single
41 { v = 0; a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; }
42 ONE_ORDERED_LOOP (a, j, sixtyfour, 0, )
43 ONE_ORDERED_LOOP (b, j, sixtyfour, 64, schedule (static))
44 ONE_ORDERED_LOOP (c, j, sixtyfour, 128, schedule (monotonic: static, 1))
45 ONE_ORDERED_LOOP (d, j, sixtyfour, 192, schedule (runtime))
46 ONE_ORDERED_LOOP (e, j, sixtyfour, 256, schedule (monotonic: dynamic, 2))
47 ONE_ORDERED_LOOP (f, j, sixtyfour, 320, schedule (guided, 3))
48 ONE_ORDERED_LOOP (g, j, sixtyfour, 384, schedule (monotonic: auto))
50 return 0;