(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
target-1.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  #pragma omp declare target
      19  int tgtv = 6;
      20  int
      21  tgt (void)
      22  {
      23    #pragma omp atomic update
      24      tgtv++;
      25    return 0;
      26  }
      27  #pragma omp end declare target
      28  
      29  double
      30  fn2 (int x, int y, int z)
      31  {
      32    double b[1024], c[1024], s = 0;
      33    int i, j;
      34    fn1 (b, c, x);
      35    #pragma omp target data map(to: b)
      36    {
      37      #pragma omp target map(tofrom: c, s)
      38        #pragma omp teams num_teams(y) thread_limit(z) reduction(+:s) firstprivate(x)
      39  	#pragma omp distribute dist_schedule(static, 4) collapse(1)
      40  	  for (j=0; j < x; j += y)
      41  	    #pragma omp parallel for reduction(+:s)
      42  	      for (i = j; i < j + y; i++)
      43  		tgt (), s += b[i] * c[i];
      44      #pragma omp target update from(b, tgtv)
      45    }
      46    return s;
      47  }
      48  
      49  double
      50  fn3 (int x)
      51  {
      52    double b[1024], c[1024], s = 0;
      53    int i;
      54    fn1 (b, c, x);
      55    #pragma omp target map(to: b, c) map(tofrom:s)
      56      #pragma omp parallel for reduction(+:s)
      57        for (i = 0; i < x; i++)
      58  	tgt (), s += b[i] * c[i];
      59    return s;
      60  }
      61  
      62  double
      63  fn4 (int x, double *p)
      64  {
      65    double b[1024], c[1024], d[1024], s = 0;
      66    int i;
      67    fn1 (b, c, x);
      68    fn1 (d + x, p + x, x);
      69    #pragma omp target map(to: b, c[0:x], d[x:x]) map(to:p[x:64 + (x & 31)]) \
      70  		     map(tofrom: s)
      71      #pragma omp parallel for reduction(+:s)
      72        for (i = 0; i < x; i++)
      73  	s += b[i] * c[i] + d[x + i] + p[x + i];
      74    return s;
      75  }
      76  
      77  int
      78  main ()
      79  {
      80    double a = fn2 (128, 4, 6);
      81    int b = tgtv;
      82    double c = fn3 (61);
      83    #pragma omp target update from(tgtv)
      84    int d = tgtv;
      85    double e[1024];
      86    double f = fn4 (64, e);
      87    if (a != 13888.0 || b != 6 + 128 || c != 4062.0 || d != 6 + 128 + 61
      88        || f != 8032.0)
      89      abort ();
      90    return 0;
      91  }