re PR libgomp/35625 (schedule(guided) loops forever if ((end - start) % incr) != 0)
PR libgomp/35625 * iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end. (gomp_iter_guided_next): Likewise. * testsuite/libgomp.c/pr35625.c: New test. From-SVN: r133306
This commit is contained in:
parent
483d8a4ab5
commit
9e7759638a
3 changed files with 36 additions and 11 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-03-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR libgomp/35625
|
||||||
|
* iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end.
|
||||||
|
(gomp_iter_guided_next): Likewise.
|
||||||
|
* testsuite/libgomp.c/pr35625.c: New test.
|
||||||
|
|
||||||
2008-03-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
2008-03-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||||
|
|
||||||
* aclocal.m4: Regenerate.
|
* aclocal.m4: Regenerate.
|
||||||
|
|
|
@ -242,16 +242,16 @@ gomp_iter_guided_next_locked (long *pstart, long *pend)
|
||||||
if (ws->next == ws->end)
|
if (ws->next == ws->end)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
n = (ws->end - ws->next) / ws->incr;
|
start = ws->next;
|
||||||
|
n = (ws->end - start) / ws->incr;
|
||||||
q = (n + nthreads - 1) / nthreads;
|
q = (n + nthreads - 1) / nthreads;
|
||||||
|
|
||||||
if (q < ws->chunk_size)
|
if (q < ws->chunk_size)
|
||||||
q = ws->chunk_size;
|
q = ws->chunk_size;
|
||||||
if (q > n)
|
if (q <= n)
|
||||||
q = n;
|
end = start + q * ws->incr;
|
||||||
|
else
|
||||||
start = ws->next;
|
end = ws->end;
|
||||||
end = start + q * ws->incr;
|
|
||||||
|
|
||||||
ws->next = end;
|
ws->next = end;
|
||||||
*pstart = start;
|
*pstart = start;
|
||||||
|
@ -286,15 +286,15 @@ gomp_iter_guided_next (long *pstart, long *pend)
|
||||||
if (start == end)
|
if (start == end)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
n = (end - start) / ws->incr;
|
n = (end - start) / incr;
|
||||||
q = (n + nthreads - 1) / nthreads;
|
q = (n + nthreads - 1) / nthreads;
|
||||||
|
|
||||||
if (q < chunk_size)
|
if (q < chunk_size)
|
||||||
q = chunk_size;
|
q = chunk_size;
|
||||||
if (q > n)
|
if (__builtin_expect (q <= n, 1))
|
||||||
q = n;
|
nend = start + q * incr;
|
||||||
|
else
|
||||||
nend = start + q * incr;
|
nend = end;
|
||||||
|
|
||||||
tmp = __sync_val_compare_and_swap (&ws->next, start, nend);
|
tmp = __sync_val_compare_and_swap (&ws->next, start, nend);
|
||||||
if (__builtin_expect (tmp == start, 1))
|
if (__builtin_expect (tmp == start, 1))
|
||||||
|
|
18
libgomp/testsuite/libgomp.c/pr35625.c
Normal file
18
libgomp/testsuite/libgomp.c/pr35625.c
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/* PR libgomp/35625 */
|
||||||
|
/* { dg-do run } */
|
||||||
|
/* { dg-options "-std=c99" } */
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
|
#pragma omp for schedule (guided, 10)
|
||||||
|
for (int i = 0; i < 1826; i += 10)
|
||||||
|
;
|
||||||
|
#pragma omp for schedule (guided, 10)
|
||||||
|
for (int i = 0; i > -1826; i -= 10)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue