target-1.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. #pragma omp declare target
  17. int tgtv = 6;
  18. int
  19. tgt (void)
  20. {
  21. #pragma omp atomic update
  22. tgtv++;
  23. return 0;
  24. }
  25. #pragma omp end declare target
  26. double
  27. fn2 (int x, int y, int z)
  28. {
  29. double b[1024], c[1024], s = 0;
  30. int i, j;
  31. fn1 (b, c, x);
  32. #pragma omp target data map(to: b)
  33. {
  34. #pragma omp target map(tofrom: c, s)
  35. #pragma omp teams num_teams(y) thread_limit(z) reduction(+:s) firstprivate(x)
  36. #pragma omp distribute dist_schedule(static, 4) collapse(1)
  37. for (j=0; j < x; j += y)
  38. #pragma omp parallel for reduction(+:s)
  39. for (i = j; i < j + y; i++)
  40. tgt (), s += b[i] * c[i];
  41. #pragma omp target update from(b, tgtv)
  42. }
  43. return s;
  44. }
  45. double
  46. fn3 (int x)
  47. {
  48. double b[1024], c[1024], s = 0;
  49. int i;
  50. fn1 (b, c, x);
  51. #pragma omp target map(to: b, c) map(tofrom:s)
  52. #pragma omp parallel for reduction(+:s)
  53. for (i = 0; i < x; i++)
  54. tgt (), s += b[i] * c[i];
  55. return s;
  56. }
  57. double
  58. fn4 (int x, double *p)
  59. {
  60. double b[1024], c[1024], d[1024], s = 0;
  61. int i;
  62. fn1 (b, c, x);
  63. fn1 (d + x, p + x, x);
  64. #pragma omp target map(to: b, c[0:x], d[x:x]) map(to:p[x:64 + (x & 31)]) \
  65. map(tofrom: s)
  66. #pragma omp parallel for reduction(+:s)
  67. for (i = 0; i < x; i++)
  68. s += b[i] * c[i] + d[x + i] + p[x + i];
  69. return s;
  70. }
  71. int
  72. main ()
  73. {
  74. double a = fn2 (128, 4, 6);
  75. int b = tgtv;
  76. double c = fn3 (61);
  77. #pragma omp target update from(tgtv)
  78. int d = tgtv;
  79. double e[1024];
  80. double f = fn4 (64, e);
  81. if (a != 13888.0 || b != 6 + 128 || c != 4062.0 || d != 6 + 128 + 61
  82. || f != 8032.0)
  83. abort ();
  84. return 0;
  85. }