1  /* { dg-do run } */
       2  /* { dg-additional-options "-DCHUNKSZ=5000" { target { ! run_expensive_tests } } } */
       3  /* { dg-additional-options "-DCHUNKSZ=1000" { target run_expensive_tests } } */
       4  
       5  #include <stdlib.h>
       6  
       7  #define EPS 0.00001
       8  #define N 100000
       9  
      10  float Y[N];
      11  float Z[N];
      12  
      13  #pragma omp declare target
      14  float F (float a)
      15  {
      16    return -a;
      17  }
      18  #pragma omp end declare target
      19  
      20  void pipedF_ref ()
      21  {
      22    int i;
      23    for (i = 0; i < N; i++)
      24      Y[i] = F (Y[i]);
      25  }
      26  
      27  void pipedF ()
      28  {
      29    int i, C;
      30    for (C = 0; C < N; C += CHUNKSZ)
      31      {
      32        #pragma omp task
      33  	#pragma omp target map(Z[C:CHUNKSZ])
      34  	  #pragma omp parallel for
      35  	    for (i = C; i < C + CHUNKSZ; i++)
      36  	      Z[i] = F (Z[i]);
      37      }
      38    #pragma omp taskwait
      39  }
      40  
      41  void init ()
      42  {
      43    int i;
      44    for (i = 0; i < N; i++)
      45      Y[i] = Z[i] = 0.1 * i;
      46  }
      47  
      48  void check ()
      49  {
      50    int i;
      51    for (i = 0; i < N; i++)
      52      {
      53        float err = (Z[i] == 0.0) ? Y[i] : (Y[i] - Z[i]) / Z[i];
      54        if (((err > 0) ? err : -err) > EPS)
      55  	abort ();
      56      }
      57  }
      58  
      59  int main ()
      60  {
      61    init ();
      62  
      63    pipedF_ref ();
      64    pipedF ();
      65  
      66    check ();
      67  
      68    return 0;
      69  }