| /* Trivial test of ordered. */ |
| |
| /* { dg-require-effective-target sync_int_long } */ |
| |
| #include <omp.h> |
| #include <string.h> |
| #include <assert.h> |
| #include "libgomp_g.h" |
| |
| |
| #define N 100 |
| static int next; |
| static int CHUNK, NTHR; |
| |
| static void clean_data (void) |
| { |
| next = 0; |
| } |
| |
| static void set_data (long i) |
| { |
| int n = __sync_fetch_and_add (&next, 1); |
| assert (n == i); |
| } |
| |
| |
| #define TMPL_1(sched) \ |
| static void f_##sched##_1 (void *dummy) \ |
| { \ |
| long s0, e0, i; \ |
| if (GOMP_loop_ordered_##sched##_start (0, N, 1, CHUNK, &s0, &e0)) \ |
| do \ |
| { \ |
| for (i = s0; i < e0; ++i) \ |
| { \ |
| GOMP_ordered_start (); \ |
| set_data (i); \ |
| GOMP_ordered_end (); \ |
| } \ |
| } \ |
| while (GOMP_loop_ordered_##sched##_next (&s0, &e0)); \ |
| GOMP_loop_end (); \ |
| } \ |
| static void t_##sched##_1 (void) \ |
| { \ |
| clean_data (); \ |
| GOMP_parallel_start (f_##sched##_1, NULL, NTHR); \ |
| f_##sched##_1 (NULL); \ |
| GOMP_parallel_end (); \ |
| } |
| |
| TMPL_1(static) |
| TMPL_1(dynamic) |
| TMPL_1(guided) |
| |
| static void test (void) |
| { |
| t_static_1 (); |
| t_dynamic_1 (); |
| t_guided_1 (); |
| } |
| |
| int main() |
| { |
| omp_set_dynamic (0); |
| |
| NTHR = 4; |
| |
| CHUNK = 1; |
| test (); |
| |
| CHUNK = 5; |
| test (); |
| |
| CHUNK = 7; |
| test (); |
| |
| CHUNK = 0; |
| t_static_1 (); |
| |
| return 0; |
| } |