1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  
       5  #define EPS 0.0001
       6  #define N 1024*1024
       7  
       8  void init (float B[], float C[], int n)
       9  {
      10    int i;
      11    for (i = 0; i < n; i++)
      12      {
      13        B[i] = 0.1 * i;
      14        C[i] = 0.01 * i * i;
      15      }
      16  }
      17  
      18  float dotprod_ref (float B[], float C[], int n)
      19  {
      20    int i;
      21    float sum = 0.0;
      22  
      23    for (i = 0; i < n; i++)
      24      sum += B[i] * C[i];
      25  
      26    return sum;
      27  }
      28  
      29  float dotprod (float B[], float C[], int n)
      30  {
      31    int i;
      32    float sum = 0;
      33  
      34    #pragma omp target teams map(to: B[0:n], C[0:n]) \
      35  			   map(tofrom: sum) reduction(+:sum)
      36      #pragma omp distribute parallel for reduction(+:sum)
      37        for (i = 0; i < n; i++)
      38  	sum += B[i] * C[i];
      39  
      40    return sum;
      41  }
      42  
      43  void check (float a, float b)
      44  {
      45    float err = (b == 0.0) ? a : (a - b) / b;
      46    if (((err > 0) ? err : -err) > EPS)
      47      abort ();
      48  }
      49  
      50  int main ()
      51  {
      52    float *v1 = (float *) malloc (N * sizeof (float));
      53    float *v2 = (float *) malloc (N * sizeof (float));
      54  
      55    float p1, p2;
      56  
      57    init (v1, v2, N);
      58  
      59    p1 = dotprod_ref (v1, v2, N);
      60    p2 = dotprod (v1, v2, N);
      61  
      62    check (p1, p2);
      63  
      64    free (v1);
      65    free (v2);
      66  
      67    return 0;
      68  }