Viewing file: sections-1.c (1.3 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* Test that all sections are touched. */
/* { 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 data[N]; static int NTHR;
static void clean_data (void) { memset (data, -1, sizeof (data)); }
static void test_data (void) { int i;
for (i = 0; i < N; ++i) assert (data[i] != -1); }
static void set_data (unsigned i, int val) { int old; assert (i >= 1 && i <= N); old = __sync_lock_test_and_set (data+i-1, val); assert (old == -1); }
static void f_1 (void *dummy) { int iam = omp_get_thread_num (); unsigned long s;
for (s = GOMP_sections_start (N); s ; s = GOMP_sections_next ()) set_data (s, iam); GOMP_sections_end (); }
static void test_1 (void) { clean_data (); GOMP_parallel_start (f_1, NULL, NTHR); f_1 (NULL); GOMP_parallel_end (); test_data (); }
static void f_2 (void *dummy) { int iam = omp_get_thread_num (); unsigned s;
while ((s = GOMP_sections_next ())) set_data (s, iam); GOMP_sections_end_nowait (); }
static void test_2 (void) { clean_data (); GOMP_parallel_sections_start (f_2, NULL, NTHR, N); f_2 (NULL); GOMP_parallel_end (); test_data (); }
int main() { omp_set_dynamic (0);
NTHR = 4;
test_1 (); test_2 ();
return 0; }
|