lastprivate-conditional-1.C 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. extern "C" void abort ();
  2. int w;
  3. struct S { int s, &t; S () : s (0), t (w) {}; void foo (short &); bool bar (int, int); void baz (short &); };
  4. bool
  5. S::bar (int i, int q)
  6. {
  7. switch (q)
  8. {
  9. case 0: return (i % 17) == 7;
  10. case 1: return (i % 19) == 2;
  11. case 2: return (i % 23) == 5;
  12. default: abort ();
  13. }
  14. }
  15. void
  16. S::foo (short &x)
  17. {
  18. #pragma omp for lastprivate (conditional: x, s, t)
  19. for (int i = 0; i < 1025; ++i)
  20. {
  21. if (bar (i, 0))
  22. x = i;
  23. if (bar (i, 1))
  24. s = i + 3;
  25. if (bar (i, 2))
  26. t = i + 6;
  27. }
  28. }
  29. void
  30. S::baz (short &x)
  31. {
  32. #pragma omp parallel for lastprivate (conditional: x, s, t) collapse (3)
  33. for (int i = 0; i < 15; ++i)
  34. for (int j = -4; j < 9; j++)
  35. for (int k = 12; k > 7; --k)
  36. {
  37. int l = (k - 8) + (j + 4) * 5 + i * 13 * 5;
  38. if (bar (l, 0))
  39. x = l;
  40. if (bar (l, 1))
  41. s = l + 3;
  42. if (bar (l, 2))
  43. t = l + 6;
  44. }
  45. }
  46. int
  47. main ()
  48. {
  49. short x;
  50. S s;
  51. #pragma omp parallel
  52. s.foo (x);
  53. if (x != 1010 || s.s != 1012 || s.t != 1023)
  54. abort ();
  55. s.baz (x);
  56. if (x != 959 || s.s != 974 || s.t != 977)
  57. abort ();
  58. }