target_update-2.c 1.6 KB

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