target-5.c 1.1 KB

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