xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/ordered-2.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* Trivial test of ordered.  */
2*404b540aSrobert 
3*404b540aSrobert /* { dg-require-effective-target sync_int_long } */
4*404b540aSrobert 
5*404b540aSrobert #include <omp.h>
6*404b540aSrobert #include <string.h>
7*404b540aSrobert #include <assert.h>
8*404b540aSrobert #include "libgomp_g.h"
9*404b540aSrobert 
10*404b540aSrobert 
11*404b540aSrobert #define N 100
12*404b540aSrobert static int next;
13*404b540aSrobert static int CHUNK, NTHR;
14*404b540aSrobert 
clean_data(void)15*404b540aSrobert static void clean_data (void)
16*404b540aSrobert {
17*404b540aSrobert   next = 0;
18*404b540aSrobert }
19*404b540aSrobert 
set_data(long i)20*404b540aSrobert static void set_data (long i)
21*404b540aSrobert {
22*404b540aSrobert   int n = __sync_fetch_and_add (&next, 1);
23*404b540aSrobert   assert (n == i);
24*404b540aSrobert }
25*404b540aSrobert 
26*404b540aSrobert 
27*404b540aSrobert #define TMPL_1(sched)							\
28*404b540aSrobert static void f_##sched##_1 (void *dummy)					\
29*404b540aSrobert {									\
30*404b540aSrobert   long s0, e0, i;							\
31*404b540aSrobert   if (GOMP_loop_ordered_##sched##_start (0, N, 1, CHUNK, &s0, &e0))	\
32*404b540aSrobert     do									\
33*404b540aSrobert       {									\
34*404b540aSrobert 	for (i = s0; i < e0; ++i)					\
35*404b540aSrobert 	  {								\
36*404b540aSrobert 	    GOMP_ordered_start ();					\
37*404b540aSrobert 	    set_data (i);						\
38*404b540aSrobert 	    GOMP_ordered_end ();					\
39*404b540aSrobert 	  }								\
40*404b540aSrobert       }									\
41*404b540aSrobert     while (GOMP_loop_ordered_##sched##_next (&s0, &e0));		\
42*404b540aSrobert   GOMP_loop_end ();							\
43*404b540aSrobert }									\
44*404b540aSrobert static void t_##sched##_1 (void)					\
45*404b540aSrobert {									\
46*404b540aSrobert   clean_data ();							\
47*404b540aSrobert   GOMP_parallel_start (f_##sched##_1, NULL, NTHR);			\
48*404b540aSrobert   f_##sched##_1 (NULL);							\
49*404b540aSrobert   GOMP_parallel_end ();							\
50*404b540aSrobert }
51*404b540aSrobert 
52*404b540aSrobert TMPL_1(static)
TMPL_1(dynamic)53*404b540aSrobert TMPL_1(dynamic)
54*404b540aSrobert TMPL_1(guided)
55*404b540aSrobert 
56*404b540aSrobert static void test (void)
57*404b540aSrobert {
58*404b540aSrobert   t_static_1 ();
59*404b540aSrobert   t_dynamic_1 ();
60*404b540aSrobert   t_guided_1 ();
61*404b540aSrobert }
62*404b540aSrobert 
main()63*404b540aSrobert int main()
64*404b540aSrobert {
65*404b540aSrobert   omp_set_dynamic (0);
66*404b540aSrobert 
67*404b540aSrobert   NTHR = 4;
68*404b540aSrobert 
69*404b540aSrobert   CHUNK = 1;
70*404b540aSrobert   test ();
71*404b540aSrobert 
72*404b540aSrobert   CHUNK = 5;
73*404b540aSrobert   test ();
74*404b540aSrobert 
75*404b540aSrobert   CHUNK = 7;
76*404b540aSrobert   test ();
77*404b540aSrobert 
78*404b540aSrobert   CHUNK = 0;
79*404b540aSrobert   t_static_1 ();
80*404b540aSrobert 
81*404b540aSrobert   return 0;
82*404b540aSrobert }
83