teams-2.c 2.2 KB

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