teams-6.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /* { dg-do run } */
  2. #include <stdlib.h>
  3. #define EPS 0.00001
  4. #define N 10000
  5. void init (float *a, float *b, int n)
  6. {
  7. int i;
  8. for (i = 0; i < n; i++)
  9. {
  10. a[i] = 0.1 * i;
  11. b[i] = 0.01 * i * i;
  12. }
  13. }
  14. void vec_mult_ref (float *p, float *v1, float *v2, int n)
  15. {
  16. int i;
  17. for (i = 0; i < n; i++)
  18. p[i] = v1[i] * v2[i];
  19. }
  20. void vec_mult (float *p, float *v1, float *v2, int n)
  21. {
  22. int i;
  23. #pragma omp target teams map(to: v1[0:n], v2[:n]) map(from: p[0:n])
  24. #pragma omp distribute parallel for simd
  25. for (i = 0; i < n; i++)
  26. p[i] = v1[i] * v2[i];
  27. }
  28. void check (float *a, float *b, int n)
  29. {
  30. int i;
  31. for (i = 0 ; i < n ; i++)
  32. {
  33. float err = (a[i] == 0.0) ? b[i] : (b[i] - a[i]) / a[i];
  34. if (((err > 0) ? err : -err) > EPS)
  35. abort ();
  36. }
  37. }
  38. int main ()
  39. {
  40. float *p1 = (float *) malloc (N * sizeof (float));
  41. float *p2 = (float *) malloc (N * sizeof (float));
  42. float *v1 = (float *) malloc (N * sizeof (float));
  43. float *v2 = (float *) malloc (N * sizeof (float));
  44. init (v1, v2, N);
  45. vec_mult_ref (p1, v1, v2, N);
  46. vec_mult (p2, v1, v2, N);
  47. check (p1, p2, N);
  48. free (p1);
  49. free (p2);
  50. free (v1);
  51. free (v2);
  52. return 0;
  53. }