1// { dg-do run }
2
3#include <omp.h>
4
5#define EPS 0.000001
6#define N 1000
7
8extern "C" void abort (void);
9
10void init (float *a1, float *a2, int n)
11{
12  int s = -1;
13  for (int i = 0; i < n; i++)
14    {
15      a1[i] = s * 0.01;
16      a2[i] = i;
17      s = -s;
18    }
19}
20
21void check (float *a, float *b, int n)
22{
23  for (int i = 0; i < n; i++)
24    if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
25      abort ();
26}
27
28void vec_mult_ref (float *&p, float *&v1, float *&v2, int n)
29{
30  for (int i = 0; i < n; i++)
31    p[i] = v1[i] * v2[i];
32}
33
34void vec_mult (float *&p, float *&v1, float *&v2, int n)
35{
36  #pragma omp target map(to: v1[0:n], v2[:n]) map(from: p[0:n])
37    #pragma omp parallel for
38      for (int i = 0; i < n; i++)
39	p[i] = v1[i] * v2[i];
40}
41
42int main ()
43{
44  float *p = new float [N];
45  float *p1 = new float [N];
46  float *v1 = new float [N];
47  float *v2 = new float [N];
48
49  init (v1, v2, N);
50
51  vec_mult_ref (p, v1, v2, N);
52  vec_mult (p1, v1, v2, N);
53
54  check (p, p1, N);
55
56  delete [] p;
57  delete [] p1;
58  delete [] v1;
59  delete [] v2;
60
61  return 0;
62}
63