(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
target-2.c
       1  extern
       2  #ifdef __cplusplus
       3  "C"
       4  #endif
       5  void abort (void);
       6  
       7  void
       8  fn1 (double *x, double *y, int z)
       9  {
      10    int i;
      11    for (i = 0; i < z; i++)
      12      {
      13        x[i] = i & 31;
      14        y[i] = (i & 63) - 30;
      15      }
      16  }
      17  
      18  double
      19  fn2 (int x)
      20  {
      21    double s = 0;
      22    double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
      23    int i;
      24    fn1 (b, c, x);
      25    fn1 (e, d + x, x);
      26    #pragma omp target map(to: b, c[:x], d[x:x], e) map(tofrom: s)
      27      #pragma omp parallel for reduction(+:s)
      28        for (i = 0; i < x; i++)
      29  	s += b[i] * c[i] + d[x + i] + sizeof (b) - sizeof (c);
      30    return s;
      31  }
      32  
      33  double
      34  fn3 (int x)
      35  {
      36    double s = 0;
      37    double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
      38    int i;
      39    fn1 (b, c, x);
      40    fn1 (e, d, x);
      41    #pragma omp target map(tofrom: s)
      42      #pragma omp parallel for reduction(+:s)
      43        for (i = 0; i < x; i++)
      44  	s += b[i] * c[i] + d[i];
      45    return s;
      46  }
      47  
      48  double
      49  fn4 (int x)
      50  {
      51    double s = 0;
      52    double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
      53    int i;
      54    fn1 (b, c, x);
      55    fn1 (e, d + x, x);
      56    #pragma omp target data map(from: b, c[:x], d[x:x], e)
      57      {
      58        #pragma omp target update to(b, c[:x], d[x:x], e)
      59        #pragma omp target map(c[:x], d[x:x], s)
      60  	#pragma omp parallel for reduction(+:s)
      61  	  for (i = 0; i < x; i++)
      62  	    {
      63  	      s += b[i] * c[i] + d[x + i] + sizeof (b) - sizeof (c);
      64  	      b[i] = i + 0.5;
      65  	      c[i] = 0.5 - i;
      66  	      d[x + i] = 0.5 * i;
      67  	    }
      68      }
      69    for (i = 0; i < x; i++)
      70      if (b[i] != i + 0.5 || c[i] != 0.5 - i || d[x + i] != 0.5 * i)
      71        abort ();
      72    return s;
      73  }
      74  
      75  int
      76  main ()
      77  {
      78    double a = fn2 (128);
      79    if (a != 14080.0)
      80      abort ();
      81    double b = fn3 (128);
      82    if (a != b)
      83      abort ();
      84    double c = fn4 (256);
      85    if (c != 28160.0)
      86      abort ();
      87    return 0;
      88  }