taskgroup-1.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. extern
  2. #ifdef __cplusplus
  3. "C"
  4. #endif
  5. void abort (void);
  6. int v[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
  7. int
  8. main ()
  9. {
  10. #pragma omp parallel num_threads (4)
  11. #pragma omp single
  12. {
  13. int i;
  14. #pragma omp taskgroup
  15. {
  16. for (i = 0; i < 16; i += 2)
  17. #pragma omp task
  18. {
  19. #pragma omp task
  20. v[i]++;
  21. #pragma omp task
  22. v[i + 1]++;
  23. }
  24. }
  25. for (i = 0; i < 16; i++)
  26. if (v[i] != i + 2)
  27. abort ();
  28. #pragma omp taskgroup
  29. {
  30. for (i = 0; i < 16; i += 2)
  31. #pragma omp task
  32. {
  33. #pragma omp task
  34. v[i]++;
  35. #pragma omp task
  36. v[i + 1]++;
  37. #pragma omp taskwait
  38. }
  39. }
  40. for (i = 0; i < 16; i++)
  41. if (v[i] != i + 3)
  42. abort ();
  43. #pragma omp taskgroup
  44. {
  45. for (i = 0; i < 16; i += 2)
  46. #pragma omp task
  47. {
  48. #pragma omp task
  49. v[i]++;
  50. v[i + 1]++;
  51. }
  52. #pragma omp taskwait
  53. for (i = 0; i < 16; i += 2)
  54. #pragma omp task
  55. v[i + 1]++;
  56. }
  57. for (i = 0; i < 16; i++)
  58. if (v[i] != i + 4 + (i & 1))
  59. abort ();
  60. #pragma omp taskgroup
  61. {
  62. for (i = 0; i < 16; i += 2)
  63. {
  64. #pragma omp taskgroup
  65. {
  66. #pragma omp task
  67. v[i]++;
  68. #pragma omp task
  69. v[i + 1]++;
  70. }
  71. if (v[i] != i + 5 || v[i + 1] != i + 7)
  72. abort ();
  73. #pragma omp task
  74. v[i]++;
  75. }
  76. }
  77. for (i = 0; i < 16; i++)
  78. if (v[i] != i + 6)
  79. abort ();
  80. }
  81. return 0;
  82. }