async_target-1.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. #include <stdlib.h>
  5. #define EPS 0.00001
  6. #define N 100000
  7. float Y[N];
  8. float Z[N];
  9. #pragma omp declare target
  10. float F (float a)
  11. {
  12. return -a;
  13. }
  14. #pragma omp end declare target
  15. void pipedF_ref ()
  16. {
  17. int i;
  18. for (i = 0; i < N; i++)
  19. Y[i] = F (Y[i]);
  20. }
  21. void pipedF ()
  22. {
  23. int i, C;
  24. for (C = 0; C < N; C += CHUNKSZ)
  25. {
  26. #pragma omp task
  27. #pragma omp target map(Z[C:CHUNKSZ])
  28. #pragma omp parallel for
  29. for (i = C; i < C + CHUNKSZ; i++)
  30. Z[i] = F (Z[i]);
  31. }
  32. #pragma omp taskwait
  33. }
  34. void init ()
  35. {
  36. int i;
  37. for (i = 0; i < N; i++)
  38. Y[i] = Z[i] = 0.1 * i;
  39. }
  40. void check ()
  41. {
  42. int i;
  43. for (i = 0; i < N; i++)
  44. {
  45. float err = (Z[i] == 0.0) ? Y[i] : (Y[i] - Z[i]) / Z[i];
  46. if (((err > 0) ? err : -err) > EPS)
  47. abort ();
  48. }
  49. }
  50. int main ()
  51. {
  52. init ();
  53. pipedF_ref ();
  54. pipedF ();
  55. check ();
  56. return 0;
  57. }