task-4.c 660 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /* { dg-do run } */
  2. #include <omp.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int e;
  6. void __attribute__((noinline))
  7. baz (int i, int *p, int j, int *q)
  8. {
  9. if (p[0] != 1 || p[i] != 3 || q[0] != 2 || q[j] != 4)
  10. #pragma omp atomic
  11. e++;
  12. }
  13. void __attribute__((noinline))
  14. foo (int i, int j)
  15. {
  16. int p[i + 1];
  17. int q[j + 1];
  18. memset (p, 0, sizeof (p));
  19. memset (q, 0, sizeof (q));
  20. p[0] = 1;
  21. p[i] = 3;
  22. q[0] = 2;
  23. q[j] = 4;
  24. #pragma omp task firstprivate (p, q)
  25. baz (i, p, j, q);
  26. }
  27. int
  28. main (void)
  29. {
  30. #pragma omp parallel num_threads (4)
  31. foo (5 + omp_get_thread_num (), 7 + omp_get_thread_num ());
  32. if (e)
  33. abort ();
  34. return 0;
  35. }