target-4.c 868 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /* { dg-do run } */
  2. #include <stdlib.h>
  3. #define EPS 0.000001
  4. #define N 100000
  5. void init (double *a1, double *a2)
  6. {
  7. double s = -1;
  8. int i;
  9. for (i = 0; i < N; i++)
  10. {
  11. a1[i] = s;
  12. a2[i] = i;
  13. s = -s;
  14. }
  15. }
  16. void check (double *a, double *b)
  17. {
  18. int i;
  19. for (i = 0; i < N; i++)
  20. if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
  21. abort ();
  22. }
  23. void vec_mult_ref (double *p, double *v1, double *v2)
  24. {
  25. int i;
  26. for (i = 0; i < N; i++)
  27. p[i] = v1[i] * v2[i];
  28. }
  29. void vec_mult (double *p, double *v1, double *v2)
  30. {
  31. int i;
  32. #pragma omp target map(to: v1[0:N], v2[:N]) map(from: p[0:N])
  33. #pragma omp parallel for
  34. for (i = 0; i < N; i++)
  35. p[i] = v1[i] * v2[i];
  36. }
  37. int main ()
  38. {
  39. double p1[N], p2[N];
  40. double v1[N], v2[N];
  41. init (v1, v2);
  42. vec_mult_ref (p1, v1, v2);
  43. vec_mult (p2, v1, v2);
  44. check (p1, p2);
  45. return 0;
  46. }