xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/loop-1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* Test that all loop iterations are touched.  This doesn't verify
2*404b540aSrobert    scheduling order, merely coverage.  */
3*404b540aSrobert 
4*404b540aSrobert /* { dg-require-effective-target sync_int_long } */
5*404b540aSrobert 
6*404b540aSrobert #include <omp.h>
7*404b540aSrobert #include <string.h>
8*404b540aSrobert #include <assert.h>
9*404b540aSrobert #include "libgomp_g.h"
10*404b540aSrobert 
11*404b540aSrobert 
12*404b540aSrobert #define N 10000
13*404b540aSrobert static int S, E, INCR, CHUNK, NTHR;
14*404b540aSrobert static int data[N];
15*404b540aSrobert 
clean_data(void)16*404b540aSrobert static void clean_data (void)
17*404b540aSrobert {
18*404b540aSrobert   memset (data, -1, sizeof (data));
19*404b540aSrobert }
20*404b540aSrobert 
test_data(void)21*404b540aSrobert static void test_data (void)
22*404b540aSrobert {
23*404b540aSrobert   int i, j;
24*404b540aSrobert 
25*404b540aSrobert   for (i = 0; i < S; ++i)
26*404b540aSrobert     assert (data[i] == -1);
27*404b540aSrobert 
28*404b540aSrobert   for (j = 0; i < E; ++i, j = (j + 1) % INCR)
29*404b540aSrobert     if (j == 0)
30*404b540aSrobert       assert (data[i] != -1);
31*404b540aSrobert     else
32*404b540aSrobert       assert (data[i] == -1);
33*404b540aSrobert 
34*404b540aSrobert   for (; i < N; ++i)
35*404b540aSrobert     assert (data[i] == -1);
36*404b540aSrobert }
37*404b540aSrobert 
set_data(long i,int val)38*404b540aSrobert static void set_data (long i, int val)
39*404b540aSrobert {
40*404b540aSrobert   int old;
41*404b540aSrobert   assert (i >= 0 && i < N);
42*404b540aSrobert   old = __sync_lock_test_and_set (data+i, val);
43*404b540aSrobert   assert (old == -1);
44*404b540aSrobert }
45*404b540aSrobert 
46*404b540aSrobert 
47*404b540aSrobert #define TMPL_1(sched)						\
48*404b540aSrobert static void f_##sched##_1 (void *dummy)				\
49*404b540aSrobert {								\
50*404b540aSrobert   int iam = omp_get_thread_num ();				\
51*404b540aSrobert   long s0, e0, i;						\
52*404b540aSrobert   if (GOMP_loop_##sched##_start (S, E, INCR, CHUNK, &s0, &e0))	\
53*404b540aSrobert     do								\
54*404b540aSrobert       {								\
55*404b540aSrobert 	for (i = s0; i < e0; i += INCR)				\
56*404b540aSrobert 	  set_data (i, iam);					\
57*404b540aSrobert       }								\
58*404b540aSrobert     while (GOMP_loop_##sched##_next (&s0, &e0));		\
59*404b540aSrobert   GOMP_loop_end ();						\
60*404b540aSrobert }								\
61*404b540aSrobert static void t_##sched##_1 (void)				\
62*404b540aSrobert {								\
63*404b540aSrobert   clean_data ();						\
64*404b540aSrobert   GOMP_parallel_start (f_##sched##_1, NULL, NTHR);		\
65*404b540aSrobert   f_##sched##_1 (NULL);						\
66*404b540aSrobert   GOMP_parallel_end ();						\
67*404b540aSrobert   test_data ();							\
68*404b540aSrobert }
69*404b540aSrobert 
70*404b540aSrobert TMPL_1(static)
TMPL_1(dynamic)71*404b540aSrobert TMPL_1(dynamic)
72*404b540aSrobert TMPL_1(guided)
73*404b540aSrobert 
74*404b540aSrobert #define TMPL_2(sched)					\
75*404b540aSrobert static void f_##sched##_2 (void *dummy)			\
76*404b540aSrobert {							\
77*404b540aSrobert   int iam = omp_get_thread_num ();			\
78*404b540aSrobert   long s0, e0, i;					\
79*404b540aSrobert   while (GOMP_loop_##sched##_next (&s0, &e0))		\
80*404b540aSrobert     {							\
81*404b540aSrobert       for (i = s0; i < e0; i += INCR)			\
82*404b540aSrobert 	set_data (i, iam);				\
83*404b540aSrobert     }							\
84*404b540aSrobert   GOMP_loop_end_nowait ();				\
85*404b540aSrobert }							\
86*404b540aSrobert static void t_##sched##_2 (void)			\
87*404b540aSrobert {							\
88*404b540aSrobert   clean_data ();					\
89*404b540aSrobert   GOMP_parallel_loop_##sched##_start			\
90*404b540aSrobert     (f_##sched##_2, NULL, NTHR, S, E, INCR, CHUNK);	\
91*404b540aSrobert   f_##sched##_2 (NULL);					\
92*404b540aSrobert   GOMP_parallel_end ();					\
93*404b540aSrobert   test_data ();						\
94*404b540aSrobert }
95*404b540aSrobert 
96*404b540aSrobert TMPL_2(static)
97*404b540aSrobert TMPL_2(dynamic)
98*404b540aSrobert TMPL_2(guided)
99*404b540aSrobert 
100*404b540aSrobert static void test (void)
101*404b540aSrobert {
102*404b540aSrobert   t_static_1 ();
103*404b540aSrobert   t_dynamic_1 ();
104*404b540aSrobert   t_guided_1 ();
105*404b540aSrobert   t_static_2 ();
106*404b540aSrobert   t_dynamic_2 ();
107*404b540aSrobert   t_guided_2 ();
108*404b540aSrobert }
109*404b540aSrobert 
main()110*404b540aSrobert int main()
111*404b540aSrobert {
112*404b540aSrobert   omp_set_dynamic (0);
113*404b540aSrobert 
114*404b540aSrobert   NTHR = 4;
115*404b540aSrobert 
116*404b540aSrobert   S = 0, E = N, INCR = 1, CHUNK = 4;
117*404b540aSrobert   test ();
118*404b540aSrobert 
119*404b540aSrobert   S = 0, E = N, INCR = 2, CHUNK = 4;
120*404b540aSrobert   test ();
121*404b540aSrobert 
122*404b540aSrobert   S = 1, E = N-1, INCR = 1, CHUNK = 5;
123*404b540aSrobert   test ();
124*404b540aSrobert 
125*404b540aSrobert   S = 1, E = N-1, INCR = 2, CHUNK = 5;
126*404b540aSrobert   test ();
127*404b540aSrobert 
128*404b540aSrobert   S = 2, E = 4, INCR = 1, CHUNK = 1;
129*404b540aSrobert   test ();
130*404b540aSrobert 
131*404b540aSrobert   S = 0, E = N, INCR = 1, CHUNK = 0;
132*404b540aSrobert   t_static_1 ();
133*404b540aSrobert   t_static_2 ();
134*404b540aSrobert 
135*404b540aSrobert   S = 1, E = N-1, INCR = 1, CHUNK = 0;
136*404b540aSrobert   t_static_1 ();
137*404b540aSrobert   t_static_2 ();
138*404b540aSrobert 
139*404b540aSrobert   return 0;
140*404b540aSrobert }
141