target-35.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <omp.h>
  2. #include <stdlib.h>
  3. #pragma omp declare target
  4. __attribute__((noinline))
  5. void
  6. foo (int x, int y, int z, int *a, int *b)
  7. {
  8. if (x == 0)
  9. {
  10. int i, j;
  11. for (i = 0; i < 64; i++)
  12. #pragma omp parallel for shared (a, b)
  13. for (j = 0; j < 32; j++)
  14. foo (3, i, j, a, b);
  15. }
  16. else if (x == 1)
  17. {
  18. int i, j;
  19. #pragma omp distribute dist_schedule (static, 1)
  20. for (i = 0; i < 64; i++)
  21. #pragma omp parallel for shared (a, b)
  22. for (j = 0; j < 32; j++)
  23. foo (3, i, j, a, b);
  24. }
  25. else if (x == 2)
  26. {
  27. int j;
  28. #pragma omp parallel for shared (a, b)
  29. for (j = 0; j < 32; j++)
  30. foo (3, y, j, a, b);
  31. }
  32. else
  33. {
  34. #pragma omp atomic
  35. b[y] += z;
  36. #pragma omp atomic
  37. *a += 1;
  38. }
  39. }
  40. __attribute__((noinline))
  41. int
  42. bar (int x, int y, int z)
  43. {
  44. int a, b[64], i;
  45. a = 8;
  46. for (i = 0; i < 64; i++)
  47. b[i] = i;
  48. foo (x, y, z, &a, b);
  49. if (x == 0)
  50. {
  51. if (a != 8 + 64 * 32)
  52. return 1;
  53. for (i = 0; i < 64; i++)
  54. if (b[i] != i + 31 * 32 / 2)
  55. return 1;
  56. }
  57. else if (x == 1)
  58. {
  59. int c = omp_get_num_teams ();
  60. int d = omp_get_team_num ();
  61. int e = d;
  62. int f = 0;
  63. for (i = 0; i < 64; i++)
  64. if (i == e)
  65. {
  66. if (b[i] != i + 31 * 32 / 2)
  67. return 1;
  68. f++;
  69. e = e + c;
  70. }
  71. else if (b[i] != i)
  72. return 1;
  73. if (a < 8 || a > 8 + f * 32)
  74. return 1;
  75. }
  76. else if (x == 2)
  77. {
  78. if (a != 8 + 32)
  79. return 1;
  80. for (i = 0; i < 64; i++)
  81. if (b[i] != i + (i == y ? 31 * 32 / 2 : 0))
  82. return 1;
  83. }
  84. else if (x == 3)
  85. {
  86. if (a != 8 + 1)
  87. return 1;
  88. for (i = 0; i < 64; i++)
  89. if (b[i] != i + (i == y ? z : 0))
  90. return 1;
  91. }
  92. return 0;
  93. }
  94. #pragma omp end declare target
  95. int
  96. main ()
  97. {
  98. int i, j, err = 0;
  99. #pragma omp target map(tofrom:err)
  100. #pragma omp teams reduction(+:err)
  101. err += bar (0, 0, 0);
  102. if (err)
  103. abort ();
  104. #pragma omp target map(tofrom:err)
  105. #pragma omp teams reduction(+:err)
  106. err += bar (1, 0, 0);
  107. if (err)
  108. abort ();
  109. #pragma omp target map(tofrom:err)
  110. #pragma omp teams reduction(+:err)
  111. #pragma omp distribute
  112. for (i = 0; i < 64; i++)
  113. err += bar (2, i, 0);
  114. if (err)
  115. abort ();
  116. #pragma omp target map(tofrom:err)
  117. #pragma omp teams reduction(+:err)
  118. #pragma omp distribute
  119. for (i = 0; i < 64; i++)
  120. #pragma omp parallel for reduction(+:err)
  121. for (j = 0; j < 32; j++)
  122. err += bar (3, i, j);
  123. if (err)
  124. abort ();
  125. return 0;
  126. }