diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-11 21:43:45 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-11 21:43:45 +0000 |
commit | 9ead5ba09452820435a61778a944899a0254e021 (patch) | |
tree | e006f479132d2c9ab9f0c35199cdcdd31925db16 /libgomp/task.c | |
parent | 4269e8535352196970285286f1dfc847b09e3173 (diff) | |
download | gcc-9ead5ba09452820435a61778a944899a0254e021.tar.gz |
* libgomp.h (struct gomp_task): Add in_tied_task field.
* task.c (gomp_init_task): Initialize it.
(GOMP_task): Likewise. Call gomp_team_barrier_set_task_pending
unconditionally. Don't call gomp_team_barrier_wake if
current task is implicit or if(0) from implicit and number of
running tasks is equal to nthreads - 1.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136682 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp/task.c')
-rw-r--r-- | libgomp/task.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libgomp/task.c b/libgomp/task.c index 903948ceca3..ce991b8dca2 100644 --- a/libgomp/task.c +++ b/libgomp/task.c @@ -43,6 +43,7 @@ gomp_init_task (struct gomp_task *task, struct gomp_task *parent_task, task->icv = *prev_icv; task->kind = GOMP_TASK_IMPLICIT; task->in_taskwait = false; + task->in_tied_task = false; task->children = NULL; gomp_sem_init (&task->taskwait_sem, 0); } @@ -103,6 +104,8 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), gomp_init_task (&task, thr->task, gomp_icv (false)); task.kind = GOMP_TASK_IFFALSE; + if (thr->task) + task.in_tied_task = thr->task->in_tied_task; thr->task = &task; if (__builtin_expect (cpyfn != NULL, 0)) { @@ -134,6 +137,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), & ~(uintptr_t) (arg_align - 1)); gomp_init_task (task, parent, gomp_icv (false)); task->kind = GOMP_TASK_IFFALSE; + task->in_tied_task = parent->in_tied_task; thr->task = task; if (cpyfn) cpyfn (arg, data); @@ -143,6 +147,7 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), task->kind = GOMP_TASK_WAITING; task->fn = fn; task->fn_data = arg; + task->in_tied_task = true; gomp_mutex_lock (&team->task_lock); if (parent->children) { @@ -170,9 +175,10 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), task->prev_queue = task; team->task_queue = task; } - if (team->task_count++ == 0) - gomp_team_barrier_set_task_pending (&team->barrier); - do_wake = team->task_running_count < team->nthreads; + ++team->task_count; + gomp_team_barrier_set_task_pending (&team->barrier); + do_wake = team->task_running_count + !parent->in_tied_task + < team->nthreads; gomp_mutex_unlock (&team->task_lock); if (do_wake) gomp_team_barrier_wake (&team->barrier, 1); |