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