(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
examples-4/
target_update-2.c
       1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  
       5  const int MAX = 1800;
       6  
       7  void check (int *a, int *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 (int *a1, int *a2, int N)
      16  {
      17    int i, s = -1;
      18    for (i = 0; i < N; i++)
      19      {
      20        a1[i] = s;
      21        a2[i] = i;
      22        s = -s;
      23      }
      24  }
      25  
      26  int maybe_init_again (int *a, int N)
      27  {
      28    int i;
      29    for (i = 0; i < N; i++)
      30      a[i] = i;
      31    return 1;
      32  }
      33  
      34  void vec_mult_ref (int *p, int *v1, int *v2, int N)
      35  {
      36    int i;
      37  
      38    init (v1, v2, N);
      39  
      40    for (i = 0; i < N; i++)
      41      p[i] = v1[i] * v2[i];
      42  
      43    maybe_init_again (v1, N);
      44    maybe_init_again (v2, N);
      45  
      46    for (i = 0; i < N; i++)
      47      p[i] = p[i] + (v1[i] * v2[i]);
      48  }
      49  
      50  void vec_mult (int *p, int *v1, int *v2, int N)
      51  {
      52    int i;
      53  
      54    init (v1, v2, N);
      55  
      56    #pragma omp target data map(to: v1[:N], v2[:N]) map(from: p[0:N])
      57      {
      58        int changed;
      59  
      60        #pragma omp target
      61  	#pragma omp parallel for
      62  	  for (i = 0; i < N; i++)
      63  	    p[i] = v1[i] * v2[i];
      64  
      65        changed = maybe_init_again (v1, N);
      66        #pragma omp target update if (changed) to(v1[:N])
      67  
      68        changed = maybe_init_again (v2, N);
      69        #pragma omp target update if (changed) to(v2[:N])
      70  
      71        #pragma omp target
      72  	#pragma omp parallel for
      73  	  for (i = 0; i < N; i++)
      74  	    p[i] = p[i] + (v1[i] * v2[i]);
      75      }
      76  }
      77  
      78  int main ()
      79  {
      80    int *p = (int *) malloc (MAX * sizeof (int));
      81    int *p1 = (int *) malloc (MAX * sizeof (int));
      82    int *v1 = (int *) malloc (MAX * sizeof (int));
      83    int *v2 = (int *) malloc (MAX * sizeof (int));
      84  
      85    vec_mult_ref (p, v1, v2, MAX);
      86    vec_mult (p1, v1, v2, MAX);
      87  
      88    check (p, p1, MAX);
      89  
      90    free (p);
      91    free (p1);
      92    free (v1);
      93    free (v2);
      94  
      95    return 0;
      96  }