aboutsummaryrefslogtreecommitdiff
path: root/libgomp/taskloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgomp/taskloop.c')
-rw-r--r--libgomp/taskloop.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/libgomp/taskloop.c b/libgomp/taskloop.c
index 791178a..9d27dd0 100644
--- a/libgomp/taskloop.c
+++ b/libgomp/taskloop.c
@@ -97,6 +97,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
#endif
TYPE task_step = step;
+ TYPE nfirst_task_step = step;
unsigned long nfirst = n;
if (flags & GOMP_TASK_FLAG_GRAINSIZE)
{
@@ -109,7 +110,22 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
if (num_tasks != ndiv)
num_tasks = ~0UL;
#endif
- if (num_tasks <= 1)
+ if ((flags & GOMP_TASK_FLAG_STRICT)
+ && num_tasks != ~0ULL)
+ {
+ UTYPE mod = n % grainsize;
+ task_step = (TYPE) grainsize * step;
+ if (mod)
+ {
+ num_tasks++;
+ nfirst_task_step = (TYPE) mod * step;
+ if (num_tasks == 1)
+ task_step = nfirst_task_step;
+ else
+ nfirst = num_tasks - 2;
+ }
+ }
+ else if (num_tasks <= 1)
{
num_tasks = 1;
task_step = end - start;
@@ -124,6 +140,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
task_step = (TYPE) grainsize * step;
if (mul != n)
{
+ nfirst_task_step = task_step;
task_step += step;
nfirst = n - mul - 1;
}
@@ -135,6 +152,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
task_step = (TYPE) div * step;
if (mod)
{
+ nfirst_task_step = task_step;
task_step += step;
nfirst = mod - 1;
}
@@ -153,6 +171,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
task_step = (TYPE) div * step;
if (mod)
{
+ nfirst_task_step = task_step;
task_step += step;
nfirst = mod - 1;
}
@@ -225,7 +244,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
start += task_step;
((TYPE *)arg)[1] = start;
if (i == nfirst)
- task_step -= step;
+ task_step = nfirst_task_step;
fn (arg);
arg += arg_size;
if (!priority_queue_empty_p (&task[i].children_queue,
@@ -258,7 +277,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
start += task_step;
((TYPE *)data)[1] = start;
if (i == nfirst)
- task_step -= step;
+ task_step = nfirst_task_step;
fn (data);
if (!priority_queue_empty_p (&task.children_queue,
MEMMODEL_RELAXED))
@@ -303,7 +322,7 @@ GOMP_taskloop (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *),
start += task_step;
((TYPE *)arg)[1] = start;
if (i == nfirst)
- task_step -= step;
+ task_step = nfirst_task_step;
thr->task = parent;
task->kind = GOMP_TASK_WAITING;
task->fn = fn;