taskloop-4.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* { dg-do run } */
  2. /* { dg-options "-O2" } */
  3. int u[64], v;
  4. __attribute__((noinline, noclone)) int
  5. test (int a, int b, int c, int d, void (*fn) (int, int, int, int),
  6. int *num_tasks, int *min_iters, int *max_iters)
  7. {
  8. int i, t = 0;
  9. __builtin_memset (u, 0, sizeof u);
  10. v = 0;
  11. fn (a, b, c, d);
  12. *min_iters = 0;
  13. *max_iters = 0;
  14. *num_tasks = v;
  15. if (v)
  16. {
  17. *min_iters = u[0];
  18. *max_iters = u[0];
  19. t = u[0];
  20. for (i = 1; i < v; i++)
  21. {
  22. if (*min_iters > u[i])
  23. *min_iters = u[i];
  24. if (*max_iters < u[i])
  25. *max_iters = u[i];
  26. t += u[i];
  27. }
  28. }
  29. return t;
  30. }
  31. void
  32. grainsize (int a, int b, int c, int d)
  33. {
  34. int i, j = 0, k = 0;
  35. #pragma omp taskloop firstprivate (j, k) grainsize(d)
  36. for (i = a; i < b; i += c)
  37. {
  38. if (j == 0)
  39. {
  40. #pragma omp atomic capture
  41. k = v++;
  42. if (k >= 64)
  43. __builtin_abort ();
  44. }
  45. u[k] = ++j;
  46. }
  47. }
  48. void
  49. num_tasks (int a, int b, int c, int d)
  50. {
  51. int i, j = 0, k = 0;
  52. #pragma omp taskloop firstprivate (j, k) num_tasks(d)
  53. for (i = a; i < b; i += c)
  54. {
  55. if (j == 0)
  56. {
  57. #pragma omp atomic capture
  58. k = v++;
  59. if (k >= 64)
  60. __builtin_abort ();
  61. }
  62. u[k] = ++j;
  63. }
  64. }
  65. int
  66. main ()
  67. {
  68. #pragma omp parallel
  69. #pragma omp single
  70. {
  71. int min_iters, max_iters, ntasks;
  72. /* If grainsize is present, # of task loop iters is >= grainsize && < 2 * grainsize,
  73. unless # of loop iterations is smaller than grainsize. */
  74. if (test (0, 79, 1, 17, grainsize, &ntasks, &min_iters, &max_iters) != 79
  75. || min_iters < 17 || max_iters >= 17 * 2)
  76. __builtin_abort ();
  77. if (test (-49, 2541, 7, 28, grainsize, &ntasks, &min_iters, &max_iters) != 370
  78. || min_iters < 28 || max_iters >= 28 * 2)
  79. __builtin_abort ();
  80. if (test (7, 21, 2, 15, grainsize, &ntasks, &min_iters, &max_iters) != 7
  81. || ntasks != 1 || min_iters != 7 || max_iters != 7)
  82. __builtin_abort ();
  83. /* If num_tasks is present, # of tasks is min (# of loop iters, num_tasks)
  84. and each task has at least one iteration. */
  85. if (test (-51, 2500, 48, 9, num_tasks, &ntasks, &min_iters, &max_iters) != 54
  86. || ntasks != 9)
  87. __builtin_abort ();
  88. if (test (0, 25, 2, 17, num_tasks, &ntasks, &min_iters, &max_iters) != 13
  89. || ntasks != 13)
  90. __builtin_abort ();
  91. }
  92. return 0;
  93. }