depobj-1.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <stdlib.h>
  2. #include <omp.h>
  3. void
  4. dep (void)
  5. {
  6. int x = 1;
  7. omp_depend_t d1, d2;
  8. #pragma omp depobj (d1) depend(in: x)
  9. #pragma omp depobj (d2) depend(in: x)
  10. #pragma omp depobj (d2) update(out)
  11. #pragma omp parallel
  12. #pragma omp single
  13. {
  14. #pragma omp task shared (x) depend(depobj: d2)
  15. x = 2;
  16. #pragma omp task shared (x) depend(depobj: d1)
  17. if (x != 2)
  18. abort ();
  19. }
  20. #pragma omp depobj (d2) destroy
  21. #pragma omp depobj (d1) destroy
  22. }
  23. void
  24. dep2 (void)
  25. {
  26. #pragma omp parallel
  27. #pragma omp single
  28. {
  29. int x = 1;
  30. omp_depend_t d1, d2;
  31. #pragma omp depobj (d1) depend(out: x)
  32. #pragma omp depobj (*&d2) depend (in:x)
  33. #pragma omp depobj(d2)update(in)
  34. #pragma omp task shared (x) depend(depobj:d1)
  35. x = 2;
  36. #pragma omp task shared (x) depend(depobj : d2)
  37. if (x != 2)
  38. abort ();
  39. #pragma omp taskwait
  40. #pragma omp depobj(d1)destroy
  41. #pragma omp depobj((&d2)[0]) destroy
  42. }
  43. }
  44. void
  45. dep3 (void)
  46. {
  47. omp_depend_t d[2];
  48. #pragma omp parallel
  49. {
  50. int x = 1;
  51. #pragma omp single
  52. {
  53. #pragma omp depobj(d[0]) depend(out:x)
  54. #pragma omp depobj(d[1]) depend(in: x)
  55. #pragma omp task shared (x) depend(depobj: *d)
  56. x = 2;
  57. #pragma omp task shared (x) depend(depobj: *(d + 1))
  58. if (x != 2)
  59. abort ();
  60. }
  61. }
  62. #pragma omp depobj(d[0]) destroy
  63. #pragma omp depobj(d[1]) destroy
  64. }
  65. int xx;
  66. omp_depend_t dd1, dd2;
  67. void
  68. antidep (void)
  69. {
  70. xx = 1;
  71. #pragma omp parallel
  72. #pragma omp single
  73. {
  74. #pragma omp task shared(xx) depend(depobj:dd2)
  75. if (xx != 1)
  76. abort ();
  77. #pragma omp task shared(xx) depend(depobj:dd1)
  78. xx = 2;
  79. }
  80. }
  81. int
  82. main ()
  83. {
  84. dep ();
  85. dep2 ();
  86. dep3 ();
  87. #pragma omp depobj (dd1) depend (inout: xx)
  88. #pragma omp depobj (dd2) depend (in : xx)
  89. antidep ();
  90. #pragma omp depobj (dd2) destroy
  91. #pragma omp depobj (dd1) destroy
  92. return 0;
  93. }