2015-11-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / libgomp / testsuite / libgomp.c / examples-4 / teams-2.c
blob7d0a60ebb5146c6770790670e1b37b04b031cf11
1 /* { dg-do run } */
3 #include <stdlib.h>
5 #define EPS 0.0001
6 #define N 1024*1024
8 void init (float B[], float C[], int n)
10 int i;
11 for (i = 0; i < n; i++)
13 B[i] = 0.1 * i;
14 C[i] = 0.01 * i * i;
18 float dotprod_ref (float B[], float C[], int n)
20 int i;
21 float sum = 0.0;
23 for (i = 0; i < n; i++)
24 sum += B[i] * C[i];
26 return sum;
29 float dotprod (float B[], float C[], int n, int block_size,
30 int num_teams, int block_threads)
32 int i, i0;
33 float sum = 0;
35 #pragma omp target map(to: B[0:n], C[0:n]) map(tofrom: sum)
36 #pragma omp teams num_teams(num_teams) thread_limit(block_threads) \
37 reduction(+:sum)
38 #pragma omp distribute
39 for (i0 = 0; i0 < n; i0 += block_size)
40 #pragma omp parallel for reduction(+:sum)
41 for (i = i0; i < ((i0 + block_size > n) ? n : i0 + block_size); i++)
42 sum += B[i] * C[i];
44 return sum;
47 void check (float a, float b)
49 float err = (b == 0.0) ? a : (a - b) / b;
50 if (((err > 0) ? err : -err) > EPS)
51 abort ();
54 int main ()
56 float *v1 = (float *) malloc (N * sizeof (float));
57 float *v2 = (float *) malloc (N * sizeof (float));
59 float p1, p2;
61 init (v1, v2, N);
63 p1 = dotprod_ref (v1, v2, N);
64 p2 = dotprod (v1, v2, N, N / 8, 2, 8);
66 check (p1, p2);
68 free (v1);
69 free (v2);
71 return 0;