2015-11-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / libgomp / testsuite / libgomp.c / examples-4 / target_update-1.c
blob727d475f6c7a9f243d79c1f4391f0dd75723bc1c
1 /* { dg-do run } */
3 #include <stdlib.h>
5 const int MAX = 1800;
7 void check (int *a, int *b, int N)
9 int i;
10 for (i = 0; i < N; i++)
11 if (a[i] != b[i])
12 abort ();
15 void init (int *a1, int *a2, int N)
17 int i, s = -1;
18 for (i = 0; i < N; i++)
20 a1[i] = s;
21 a2[i] = i;
22 s = -s;
26 void init_again (int *a1, int *a2, int N)
28 int i, s = -1;
29 for (i = 0; i < N; i++)
31 a1[i] = s * 10;
32 a2[i] = i;
33 s = -s;
37 void vec_mult_ref (int *p, int *v1, int *v2, int N)
39 int i;
41 init (v1, v2, MAX);
43 for (i = 0; i < N; i++)
44 p[i] = v1[i] * v2[i];
46 init_again (v1, v2, N);
48 for (i = 0; i < N; i++)
49 p[i] = p[i] + (v1[i] * v2[i]);
52 void vec_mult (int *p, int *v1, int *v2, int N)
54 int i;
56 init (v1, v2, MAX);
58 #pragma omp target data map(to: v1[:N], v2[:N]) map(from: p[0:N])
60 #pragma omp target
61 #pragma omp parallel for
62 for (i = 0; i < N; i++)
63 p[i] = v1[i] * v2[i];
65 init_again (v1, v2, N);
67 #pragma omp target update to(v1[:N], v2[:N])
69 #pragma omp target
70 #pragma omp parallel for
71 for (i = 0; i < N; i++)
72 p[i] = p[i] + (v1[i] * v2[i]);
76 int main ()
78 int *p1 = (int *) malloc (MAX * sizeof (int));
79 int *p2 = (int *) malloc (MAX * sizeof (int));
80 int *v1 = (int *) malloc (MAX * sizeof (int));
81 int *v2 = (int *) malloc (MAX * sizeof (int));
83 vec_mult_ref (p1, v1, v2, MAX);
84 vec_mult (p2, v1, v2, MAX);
86 check (p1, p2, MAX);
88 free (p1);
89 free (p2);
90 free (v1);
91 free (v2);
93 return 0;