target-2.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. extern
  2. #ifdef __cplusplus
  3. "C"
  4. #endif
  5. void abort (void);
  6. void
  7. fn1 (double *x, double *y, int z)
  8. {
  9. int i;
  10. for (i = 0; i < z; i++)
  11. {
  12. x[i] = i & 31;
  13. y[i] = (i & 63) - 30;
  14. }
  15. }
  16. double
  17. fn2 (int x)
  18. {
  19. double s = 0;
  20. double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
  21. int i;
  22. fn1 (b, c, x);
  23. fn1 (e, d + x, x);
  24. #pragma omp target map(to: b, c[:x], d[x:x], e) map(tofrom: s)
  25. #pragma omp parallel for reduction(+:s)
  26. for (i = 0; i < x; i++)
  27. s += b[i] * c[i] + d[x + i] + sizeof (b) - sizeof (c);
  28. return s;
  29. }
  30. double
  31. fn3 (int x)
  32. {
  33. double s = 0;
  34. double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
  35. int i;
  36. fn1 (b, c, x);
  37. fn1 (e, d, x);
  38. #pragma omp target map(tofrom: s)
  39. #pragma omp parallel for reduction(+:s)
  40. for (i = 0; i < x; i++)
  41. s += b[i] * c[i] + d[i];
  42. return s;
  43. }
  44. double
  45. fn4 (int x)
  46. {
  47. double s = 0;
  48. double b[3 * x], c[3 * x], d[3 * x], e[3 * x];
  49. int i;
  50. fn1 (b, c, x);
  51. fn1 (e, d + x, x);
  52. #pragma omp target data map(from: b, c[:x], d[x:x], e)
  53. {
  54. #pragma omp target update to(b, c[:x], d[x:x], e)
  55. #pragma omp target map(c[:x], d[x:x], s)
  56. #pragma omp parallel for reduction(+:s)
  57. for (i = 0; i < x; i++)
  58. {
  59. s += b[i] * c[i] + d[x + i] + sizeof (b) - sizeof (c);
  60. b[i] = i + 0.5;
  61. c[i] = 0.5 - i;
  62. d[x + i] = 0.5 * i;
  63. }
  64. }
  65. for (i = 0; i < x; i++)
  66. if (b[i] != i + 0.5 || c[i] != 0.5 - i || d[x + i] != 0.5 * i)
  67. abort ();
  68. return s;
  69. }
  70. int
  71. main ()
  72. {
  73. double a = fn2 (128);
  74. if (a != 14080.0)
  75. abort ();
  76. double b = fn3 (128);
  77. if (a != b)
  78. abort ();
  79. double c = fn4 (256);
  80. if (c != 28160.0)
  81. abort ();
  82. return 0;
  83. }