depend-mutexinout-2.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. int
  2. main ()
  3. {
  4. int a, b, c = 0;
  5. #pragma omp parallel num_threads(2)
  6. {
  7. #pragma omp barrier
  8. #pragma omp single
  9. {
  10. #pragma omp task depend(out: a)
  11. {
  12. int i;
  13. a = 0;
  14. for (i = 0; i < 524288; ++i)
  15. {
  16. asm volatile ("" : "+g" (a));
  17. a++;
  18. }
  19. }
  20. #pragma omp task depend(out: b)
  21. {
  22. int i;
  23. b = 0;
  24. for (i = 0; i < 64; ++i)
  25. {
  26. asm volatile ("" : "+g" (b));
  27. b++;
  28. }
  29. }
  30. #pragma omp task depend(in: a) depend(mutexinoutset: c)
  31. {
  32. int i;
  33. int d = c;
  34. for (i = 0; i < 524288 + 64 - a; ++i)
  35. {
  36. asm volatile ("" : "+g" (d) : "g" (&a) : "memory");
  37. d++;
  38. }
  39. asm volatile ("" : "+g" (d), "+g" (c));
  40. c = d;
  41. }
  42. #pragma omp task depend(in: b) depend(mutexinoutset: c)
  43. {
  44. int i;
  45. int d = c;
  46. for (i = 0; i < 524288 + 64 - b; ++i)
  47. {
  48. asm volatile ("" : "+g" (d) : "g" (&b) : "memory");
  49. d++;
  50. }
  51. asm volatile ("" : "+g" (d), "+g" (c));
  52. c = d;
  53. }
  54. }
  55. }
  56. if (c != 524288 + 64)
  57. __builtin_abort ();
  58. return 0;
  59. }