aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-06-11 23:43:45 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-06-11 23:43:45 +0200
commit5f836cbbc1e3c163f205377dee0aef65aad4c61d (patch)
treee006f479132d2c9ab9f0c35199cdcdd31925db16 /libgomp
parent567f0b17912a7d55ec333eb93b74f82e7a4f8761 (diff)
downloadgcc-5f836cbbc1e3c163f205377dee0aef65aad4c61d.zip
gcc-5f836cbbc1e3c163f205377dee0aef65aad4c61d.tar.gz
gcc-5f836cbbc1e3c163f205377dee0aef65aad4c61d.tar.bz2
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
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog7
-rw-r--r--libgomp/libgomp.h1
-rw-r--r--libgomp/task.c12
3 files changed, 17 insertions, 3 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 5a1cac1..fb70823c 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -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.
diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h
index 6618012..7292358 100644
--- a/libgomp/libgomp.h
+++ b/libgomp/libgomp.h
@@ -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;
};
diff --git a/libgomp/task.c b/libgomp/task.c
index 903948c..ce991b8 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);