target_data-7.c 1.3 KB

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