target-2.c 794 B

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