OSDN Git Service

23ec12547b9bb71036b7aab8eea3e55d0e928d48
[pf3gnuchains/gcc-fork.git] / libgomp / testsuite / libgomp.c / ordered-1.c
1 /* Test that all loop iterations are touched.  This doesn't verify 
2    scheduling order, merely coverage.  */
3 /* Note that we never call GOMP_ordered_start in here.  AFAICS, this is
4    valid; the only requirement is "not more than once per iteration".  */
5
6 #include <omp.h>
7 #include <string.h>
8 #include <assert.h>
9 #include "libgomp_g.h"
10
11
12 #define N 1000
13 static int S, E, INCR, CHUNK, NTHR;
14 static int data[N];
15
16 static void clean_data (void)
17 {
18   memset (data, -1, sizeof (data));
19 }
20
21 static void test_data (void)
22 {
23   int i, j;
24
25   for (i = 0; i < S; ++i)
26     assert (data[i] == -1);
27
28   for (j = 0; i < E; ++i, j = (j + 1) % INCR)
29     if (j == 0)
30       assert (data[i] != -1);
31     else
32       assert (data[i] == -1);
33
34   for (; i < N; ++i)
35     assert (data[i] == -1);
36 }
37
38 static void set_data (long i, int val)
39 {
40   int old;
41   assert (i >= 0 && i < N);
42   old = __sync_lock_test_and_set (data+i, val);
43   assert (old == -1);
44 }
45   
46
47 #define TMPL_1(sched)                                                   \
48 static void f_##sched##_1 (void *dummy)                                 \
49 {                                                                       \
50   int iam = omp_get_thread_num ();                                      \
51   long s0, e0, i;                                                       \
52   if (GOMP_loop_ordered_##sched##_start (S, E, INCR, CHUNK, &s0, &e0))  \
53     do                                                                  \
54       {                                                                 \
55         for (i = s0; i < e0; i += INCR)                                 \
56           set_data (i, iam);                                            \
57       }                                                                 \
58     while (GOMP_loop_ordered_##sched##_next (&s0, &e0));                \
59   GOMP_loop_end ();                                                     \
60 }                                                                       \
61 static void t_##sched##_1 (void)                                        \
62 {                                                                       \
63   clean_data ();                                                        \
64   GOMP_parallel_start (f_##sched##_1, NULL, NTHR);                      \
65   f_##sched##_1 (NULL);                                                 \
66   GOMP_parallel_end ();                                                 \
67   test_data ();                                                         \
68 }
69
70 TMPL_1(static)
71 TMPL_1(dynamic)
72 TMPL_1(guided)
73
74 static void test (void)
75 {
76   t_static_1 ();
77   t_dynamic_1 ();
78   t_guided_1 ();
79 }
80
81 int main()
82 {
83   omp_set_dynamic (0);
84
85   NTHR = 4;
86
87   S = 0, E = N, INCR = 1, CHUNK = 4;
88   test ();
89
90   S = 0, E = N, INCR = 2, CHUNK = 4;
91   test ();
92
93   S = 1, E = N-1, INCR = 1, CHUNK = 5;
94   test ();
95
96   S = 1, E = N-1, INCR = 2, CHUNK = 5;
97   test ();
98
99   S = 2, E = 4, INCR = 1, CHUNK = 1;
100   test ();
101
102   S = 0, E = N, INCR = 1, CHUNK = 0;
103   t_static_1 ();
104
105   S = 1, E = N-1, INCR = 1, CHUNK = 0;
106   t_static_1 ();
107
108   NTHR = 10;
109   S = 1, E = 9, INCR = 1, CHUNK = 0;
110   t_static_1 ();
111
112   return 0;
113 }