target_data-6.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* { dg-do run } */
  2. /* { dg-require-effective-target offload_device_nonshared_as } */
  3. #include <stdlib.h>
  4. #include <omp.h>
  5. #define EPS 0.000001
  6. #define THRESHOLD 1000
  7. const int MAX = 1800;
  8. void check (float *a, float *b, int N)
  9. {
  10. int i;
  11. for (i = 0; i < N; i++)
  12. if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
  13. abort ();
  14. }
  15. void init (float *a1, float *a2, int N)
  16. {
  17. float s = -1;
  18. int i;
  19. for (i = 0; i < N; i++)
  20. {
  21. a1[i] = s;
  22. a2[i] = i;
  23. s = -s;
  24. }
  25. }
  26. void init_again (float *a1, float *a2, int N)
  27. {
  28. float s = -1;
  29. int i;
  30. for (i = 0; i < N; i++)
  31. {
  32. a1[i] = s * 10;
  33. a2[i] = i;
  34. s = -s;
  35. }
  36. }
  37. void vec_mult_ref (float *p, float *v1, float *v2, int N)
  38. {
  39. int i;
  40. init (v1, v2, N);
  41. for (i = 0; i < N; i++)
  42. p[i] = v1[i] * v2[i];
  43. init_again (v1, v2, N);
  44. for (i = 0; i < N; i++)
  45. p[i] = p[i] + (v1[i] * v2[i]);
  46. }
  47. void vec_mult (float *p, float *v1, float *v2, int N)
  48. {
  49. int i;
  50. init (v1, v2, N);
  51. #pragma omp target data if(N > THRESHOLD) map(from: p[0:N])
  52. {
  53. #pragma omp target if (N > THRESHOLD) map(to: v1[:N], v2[:N])
  54. {
  55. if (omp_is_initial_device ())
  56. abort;
  57. #pragma omp parallel for
  58. for (i = 0; i < N; i++)
  59. p[i] = v1[i] * v2[i];
  60. }
  61. init_again (v1, v2, N);
  62. #pragma omp target if (N > THRESHOLD) map(to: v1[:N], v2[:N])
  63. {
  64. if (omp_is_initial_device ())
  65. abort ();
  66. #pragma omp parallel for
  67. for (i = 0; i < N; i++)
  68. p[i] = p[i] + (v1[i] * v2[i]);
  69. }
  70. }
  71. }
  72. int main ()
  73. {
  74. float *p1 = (float *) malloc (MAX * sizeof (float));
  75. float *p2 = (float *) malloc (MAX * sizeof (float));
  76. float *v1 = (float *) malloc (MAX * sizeof (float));
  77. float *v2 = (float *) malloc (MAX * sizeof (float));
  78. vec_mult_ref (p1, v1, v2, MAX);
  79. vec_mult (p2, v1, v2, MAX);
  80. check (p1, p2, MAX);
  81. free (p1);
  82. free (p2);
  83. free (v1);
  84. free (v2);
  85. return 0;
  86. }