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