(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
examples-4/
target_data-4.c
       1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  
       5  #define EPS 0.000001
       6  
       7  const int MAX = 1800;
       8  
       9  void check (double *a, double *b, int N)
      10  {
      11    int i;
      12    for (i = 0; i < N; i++)
      13      if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
      14        abort ();
      15  }
      16  
      17  void init (double *a1, double *a2, int N)
      18  {
      19    double s = -1;
      20    int i;
      21    for (i = 0; i < N; i++)
      22      {
      23        a1[i] = s;
      24        a2[i] = i;
      25        s = -s;
      26      }
      27  }
      28  
      29  void vec_mult_ref (double *p1, double *v3, double *v4, int N)
      30  {
      31    int i;
      32    for (i = 0; i < N; i++)
      33      p1[i] = v3[i] * v4[i];
      34  }
      35  
      36  void foo_ref (double *p0, double *v1, double *v2, int N)
      37  {
      38    init (v1, v2, N);
      39    vec_mult_ref (p0, v1, v2, N);
      40  }
      41  
      42  void vec_mult (double *p1, double *v3, double *v4, int N)
      43  {
      44    int i;
      45    #pragma omp target map(to: v3[0:N], v4[:N]) map(from: p1[0:N])
      46      #pragma omp parallel for
      47        for (i = 0; i < N; i++)
      48  	p1[i] = v3[i] * v4[i];
      49  }
      50  
      51  void foo (double *p0, double *v1, double *v2, int N)
      52  {
      53    init (v1, v2, N);
      54  
      55    #pragma omp target data map(to: v1[0:N], v2[:N]) map(from: p0[0:N])
      56      vec_mult (p0, v1, v2, N);
      57  }
      58  
      59  int main ()
      60  {
      61    double *p1 = (double *) malloc (MAX * sizeof (double));
      62    double *p2 = (double *) malloc (MAX * sizeof (double));
      63    double *v1 = (double *) malloc (MAX * sizeof (double));
      64    double *v2 = (double *) malloc (MAX * sizeof (double));
      65  
      66    foo_ref (p1, v1, v2, MAX);
      67    foo (p2, v1, v2, MAX);
      68  
      69    check (p1, p2, MAX);
      70  
      71    free (p1);
      72    free (p2);
      73    free (v1);
      74    free (v2);
      75  
      76    return 0;
      77  }