Commit 3696163c by Jakub Jelinek Committed by Jakub Jelinek

task.c (GOMP_taskgroup_end): If taskgroup->num_children is not zero...

	* task.c (GOMP_taskgroup_end): If taskgroup->num_children
	is not zero, but taskgroup->children is NULL and there are
	any task->children, schedule those instead of waiting.
	* testsuite/libgomp.c/depend-6.c: New test.
	* testsuite/libgomp.c/depend-7.c: New test.
	* testsuite/libgomp.c/depend-8.c: New test.
	* testsuite/libgomp.c/depend-9.c: New test.
	* testsuite/libgomp.c/depend-10.c: New test.

From-SVN: r213592
parent c6d4f6b4
2014-08-04 Jakub Jelinek <jakub@redhat.com>
* task.c (GOMP_taskgroup_end): If taskgroup->num_children
is not zero, but taskgroup->children is NULL and there are
any task->children, schedule those instead of waiting.
* testsuite/libgomp.c/depend-6.c: New test.
* testsuite/libgomp.c/depend-7.c: New test.
* testsuite/libgomp.c/depend-8.c: New test.
* testsuite/libgomp.c/depend-9.c: New test.
* testsuite/libgomp.c/depend-10.c: New test.
2014-08-01 Jakub Jelinek <jakub@redhat.com> 2014-08-01 Jakub Jelinek <jakub@redhat.com>
* libgomp.h (struct gomp_task_depend_entry): Add redundant_out field. * libgomp.h (struct gomp_task_depend_entry): Add redundant_out field.
......
...@@ -1115,18 +1115,26 @@ GOMP_taskgroup_end (void) ...@@ -1115,18 +1115,26 @@ GOMP_taskgroup_end (void)
if (taskgroup->children == NULL) if (taskgroup->children == NULL)
{ {
if (taskgroup->num_children) if (taskgroup->num_children)
goto do_wait;
gomp_mutex_unlock (&team->task_lock);
if (to_free)
{ {
gomp_finish_task (to_free); if (task->children == NULL)
free (to_free); goto do_wait;
child_task = task->children;
}
else
{
gomp_mutex_unlock (&team->task_lock);
if (to_free)
{
gomp_finish_task (to_free);
free (to_free);
}
goto finish;
} }
goto finish;
} }
if (taskgroup->children->kind == GOMP_TASK_WAITING) else
child_task = taskgroup->children;
if (child_task->kind == GOMP_TASK_WAITING)
{ {
child_task = taskgroup->children;
cancelled cancelled
= gomp_task_run_pre (child_task, child_task->parent, taskgroup, = gomp_task_run_pre (child_task, child_task->parent, taskgroup,
team); team);
...@@ -1143,6 +1151,7 @@ GOMP_taskgroup_end (void) ...@@ -1143,6 +1151,7 @@ GOMP_taskgroup_end (void)
} }
else else
{ {
child_task = NULL;
do_wait: do_wait:
/* All tasks we are waiting for are already running /* All tasks we are waiting for are already running
in other threads. Wait for them. */ in other threads. Wait for them. */
...@@ -1174,20 +1183,9 @@ GOMP_taskgroup_end (void) ...@@ -1174,20 +1183,9 @@ GOMP_taskgroup_end (void)
finish_cancelled:; finish_cancelled:;
size_t new_tasks size_t new_tasks
= gomp_task_run_post_handle_depend (child_task, team); = gomp_task_run_post_handle_depend (child_task, team);
child_task->prev_taskgroup->next_taskgroup
= child_task->next_taskgroup;
child_task->next_taskgroup->prev_taskgroup
= child_task->prev_taskgroup;
--taskgroup->num_children;
if (taskgroup->children == child_task)
{
if (child_task->next_taskgroup != child_task)
taskgroup->children = child_task->next_taskgroup;
else
taskgroup->children = NULL;
}
gomp_task_run_post_remove_parent (child_task); gomp_task_run_post_remove_parent (child_task);
gomp_clear_parent (child_task->children); gomp_clear_parent (child_task->children);
gomp_task_run_post_remove_taskgroup (child_task);
to_free = child_task; to_free = child_task;
child_task = NULL; child_task = NULL;
team->task_count--; team->task_count--;
......
/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
#include "depend-5.c"
/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
#include "depend-1.c"
/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
#include "depend-2.c"
/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
#include "depend-3.c"
/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */
#include "depend-4.c"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment