libgomp.h (struct gomp_task): Add in_tied_task field.
* 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. From-SVN: r136682
This commit is contained in:
parent
567f0b1791
commit
5f836cbbc1
3 changed files with 17 additions and 3 deletions
|
@ -1,5 +1,12 @@
|
|||
2008-06-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* 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.
|
||||
|
||||
PR libgomp/36471
|
||||
* omp_lib.f90.in (omp_get_ancestor_thread_num_8,
|
||||
omp_get_team_size_8): Fix pastos.
|
||||
|
|
|
@ -253,6 +253,7 @@ struct gomp_task
|
|||
void *fn_data;
|
||||
enum gomp_task_kind kind;
|
||||
bool in_taskwait;
|
||||
bool in_tied_task;
|
||||
gomp_sem_t taskwait_sem;
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue