task-3.c 1002 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* { dg-do run } */
  2. #include <omp.h>
  3. extern void abort ();
  4. int l = 5;
  5. int
  6. foo (int i)
  7. {
  8. int j = 7;
  9. const int k = 8;
  10. #pragma omp task firstprivate (i) shared (j, l)
  11. {
  12. #pragma omp critical
  13. {
  14. j += i;
  15. l += k;
  16. }
  17. }
  18. i++;
  19. #pragma omp task firstprivate (i) shared (j, l)
  20. {
  21. #pragma omp critical
  22. {
  23. j += i;
  24. l += k;
  25. }
  26. }
  27. i++;
  28. #pragma omp task firstprivate (i) shared (j, l)
  29. {
  30. #pragma omp critical
  31. {
  32. j += i;
  33. l += k;
  34. }
  35. }
  36. i++;
  37. #pragma omp task firstprivate (i) shared (j, l)
  38. {
  39. #pragma omp critical
  40. {
  41. j += i;
  42. l += k;
  43. }
  44. }
  45. i++;
  46. #pragma omp taskwait
  47. return (i != 8 * omp_get_thread_num () + 4
  48. || j != 4 * i - 3
  49. || k != 8);
  50. }
  51. int
  52. main (void)
  53. {
  54. int r = 0;
  55. #pragma omp parallel num_threads (4) reduction(+:r)
  56. if (omp_get_num_threads () != 4)
  57. {
  58. #pragma omp master
  59. l = 133;
  60. }
  61. else if (foo (8 * omp_get_thread_num ()))
  62. r++;
  63. if (r || l != 133)
  64. abort ();
  65. return 0;
  66. }