Lines Matching full:task
26 /* This file handles the maintenance of tasks in response to task
62 /* Create a new task data structure. */
65 gomp_init_task (struct gomp_task *task, struct gomp_task *parent_task, in gomp_init_task() argument
70 overhead of task creation low. In the nqueens-1.c test, for a in gomp_init_task()
76 task->parent = parent_task; in gomp_init_task()
77 task->icv = *prev_icv; in gomp_init_task()
78 task->kind = GOMP_TASK_IMPLICIT; in gomp_init_task()
79 task->taskwait = NULL; in gomp_init_task()
80 task->in_tied_task = false; in gomp_init_task()
81 task->final_task = false; in gomp_init_task()
82 task->copy_ctors_done = false; in gomp_init_task()
83 task->parent_depends_on = false; in gomp_init_task()
84 priority_queue_init (&task->children_queue); in gomp_init_task()
85 task->taskgroup = NULL; in gomp_init_task()
86 task->dependers = NULL; in gomp_init_task()
87 task->depend_hash = NULL; in gomp_init_task()
88 task->depend_count = 0; in gomp_init_task()
91 /* Clean up a task, after completing it. */
97 struct gomp_task *task = thr->task; in gomp_end_task() local
99 gomp_finish_task (task); in gomp_end_task()
100 thr->task = task->parent; in gomp_end_task()
103 /* Clear the parent field of every task in LIST. */
120 Clear the parent field of every task in NODE within SP, and free
141 /* Clear the parent field of every task in Q and remove every task
160 For a TASK with in/out dependencies, fill in the various dependency
161 queues. PARENT is the parent of said task. DEPEND is as in
165 gomp_task_handle_depend (struct gomp_task *task, struct gomp_task *parent, in gomp_task_handle_depend() argument
179 task->depend[i].addr = depend[2 + i]; in gomp_task_handle_depend()
180 task->depend[i].is_in = i >= nout; in gomp_task_handle_depend()
209 task->depend[n].addr = d[0]; in gomp_task_handle_depend()
210 task->depend[n++].is_in = 0; in gomp_task_handle_depend()
214 task->depend[n].addr = depend[5 + i]; in gomp_task_handle_depend()
215 task->depend[n++].is_in = i >= nout + nmutexinoutset; in gomp_task_handle_depend()
222 task->depend[n].addr = d[0]; in gomp_task_handle_depend()
223 task->depend[n++].is_in = 1; in gomp_task_handle_depend()
226 task->depend_count = ndepend; in gomp_task_handle_depend()
227 task->num_dependees = 0; in gomp_task_handle_depend()
232 task->depend[i].next = NULL; in gomp_task_handle_depend()
233 task->depend[i].prev = NULL; in gomp_task_handle_depend()
234 task->depend[i].task = task; in gomp_task_handle_depend()
235 task->depend[i].redundant = false; in gomp_task_handle_depend()
236 task->depend[i].redundant_out = false; in gomp_task_handle_depend()
239 &task->depend[i], INSERT); in gomp_task_handle_depend()
243 /* If multiple depends on the same task are the same, all but the in gomp_task_handle_depend()
246 if ((*slot)->task == task) in gomp_task_handle_depend()
248 task->depend[i].redundant = true; in gomp_task_handle_depend()
259 if (task->depend[i].is_in && ent->is_in) in gomp_task_handle_depend()
265 struct gomp_task *tsk = ent->task; in gomp_task_handle_depend()
273 tsk->dependers->elem[0] = task; in gomp_task_handle_depend()
274 task->num_dependees++; in gomp_task_handle_depend()
281 == task)) in gomp_task_handle_depend()
293 tsk->dependers->elem[tsk->dependers->n_elem++] = task; in gomp_task_handle_depend()
294 task->num_dependees++; in gomp_task_handle_depend()
296 task->depend[i].next = *slot; in gomp_task_handle_depend()
297 (*slot)->prev = &task->depend[i]; in gomp_task_handle_depend()
299 *slot = &task->depend[i]; in gomp_task_handle_depend()
301 /* There is no need to store more than one depend({,in}out:) task per in gomp_task_handle_depend()
307 the new task's clause is depend({,in}out:), we know there is at most in gomp_task_handle_depend()
312 if (!task->depend[i].is_in && out) in gomp_task_handle_depend()
329 /* Called when encountering an explicit task directive. If IF_CLAUSE is
330 false, then we must not delay in executing the task. If UNTIED is true,
331 then the task may be executed by any member of the team.
356 /* If pthread_mutex_* is used for omp_*lock*, then each task must be in GOMP_task()
370 if (thr->task->taskgroup) in GOMP_task()
372 if (thr->task->taskgroup->cancelled) in GOMP_task()
374 if (thr->task->taskgroup->workshare in GOMP_task()
375 && thr->task->taskgroup->prev in GOMP_task()
376 && thr->task->taskgroup->prev->cancelled) in GOMP_task()
387 || (thr->task && thr->task->final_task) in GOMP_task()
390 struct gomp_task task; in GOMP_task() local
396 the parent task is suspended until the child task finishes and thus in GOMP_task()
399 && thr->task && thr->task->depend_hash) in GOMP_task()
402 gomp_init_task (&task, thr->task, gomp_icv (false)); in GOMP_task()
403 task.kind = GOMP_TASK_UNDEFERRED; in GOMP_task()
404 task.final_task = (thr->task && thr->task->final_task) in GOMP_task()
406 task.priority = priority; in GOMP_task()
407 if (thr->task) in GOMP_task()
409 task.in_tied_task = thr->task->in_tied_task; in GOMP_task()
410 task.taskgroup = thr->task->taskgroup; in GOMP_task()
412 thr->task = &task; in GOMP_task()
424 mutex region, but the only way this particular task.children in GOMP_task()
425 can be set is if this thread's task work function (fn) in GOMP_task()
428 task.children set by the current thread then changed by a in GOMP_task()
431 will see the real value of task.children. */ in GOMP_task()
432 if (!priority_queue_empty_p (&task.children_queue, MEMMODEL_RELAXED)) in GOMP_task()
435 gomp_clear_parent (&task.children_queue); in GOMP_task()
442 struct gomp_task *task; in GOMP_task() local
443 struct gomp_task *parent = thr->task; in GOMP_task()
452 task = gomp_malloc (sizeof (*task) + depend_size in GOMP_task()
454 arg = (char *) (((uintptr_t) (task + 1) + depend_size + arg_align - 1) in GOMP_task()
456 gomp_init_task (task, parent, gomp_icv (false)); in GOMP_task()
457 task->priority = priority; in GOMP_task()
458 task->kind = GOMP_TASK_UNDEFERRED; in GOMP_task()
459 task->in_tied_task = parent->in_tied_task; in GOMP_task()
460 task->taskgroup = taskgroup; in GOMP_task()
461 thr->task = task; in GOMP_task()
465 task->copy_ctors_done = true; in GOMP_task()
469 thr->task = parent; in GOMP_task()
470 task->kind = GOMP_TASK_WAITING; in GOMP_task()
471 task->fn = fn; in GOMP_task()
472 task->fn_data = arg; in GOMP_task()
473 task->final_task = (flags & GOMP_TASK_FLAG_FINAL) >> 1; in GOMP_task()
478 && !task->copy_ctors_done) in GOMP_task()
484 gomp_finish_task (task); in GOMP_task()
485 free (task); in GOMP_task()
502 gomp_task_handle_depend (task, parent, depend); in GOMP_task()
503 if (task->num_dependees) in GOMP_task()
518 task, priority, in GOMP_task()
521 task->parent_depends_on); in GOMP_task()
524 task, priority, in GOMP_task()
527 task->parent_depends_on); in GOMP_task()
530 task, priority, in GOMP_task()
533 task->parent_depends_on); in GOMP_task()
569 struct gomp_task *task) in ialias()
572 if (!priority_queue_task_in_queue_p (type, head, task)) in ialias()
573 gomp_fatal ("Attempt to move first missing task %p", task); in ialias()
578 list = priority_queue_lookup_priority (head, task->priority); in ialias()
581 gomp_fatal ("Unable to find priority %d", task->priority); in ialias()
586 priority_list_remove (list, task_to_priority_node (type, task), 0); in ialias()
587 priority_list_insert (type, list, task, task->priority, in ialias()
589 task->parent_depends_on); in ialias()
598 gomp_target_task_completion (struct gomp_team *team, struct gomp_task *task) in gomp_target_task_completion() argument
600 struct gomp_task *parent = task->parent; in gomp_target_task_completion()
603 task); in gomp_target_task_completion()
605 struct gomp_taskgroup *taskgroup = task->taskgroup; in gomp_target_task_completion()
608 task); in gomp_target_task_completion()
610 priority_queue_insert (PQ_TEAM, &team->task_queue, task, task->priority, in gomp_target_task_completion()
612 task->parent_depends_on); in gomp_target_task_completion()
613 task->kind = GOMP_TASK_WAITING; in gomp_target_task_completion()
618 /* One more task has had its dependencies met. in gomp_target_task_completion()
625 /* One more task has had its dependencies met. in gomp_target_task_completion()
633 /* One more task has had its dependencies met. in gomp_target_task_completion()
649 /* Signal that a target task TTASK has completed the asynchronously
650 running phase and should be requeued as a task to handle the
657 struct gomp_task *task = ttask->task; in GOMP_PLUGIN_target_task_completion() local
668 gomp_target_task_completion (team, task); in GOMP_PLUGIN_target_task_completion()
691 if (thr->task->taskgroup) in gomp_create_target_task()
693 if (thr->task->taskgroup->cancelled) in gomp_create_target_task()
695 if (thr->task->taskgroup->workshare in gomp_create_target_task()
696 && thr->task->taskgroup->prev in gomp_create_target_task()
697 && thr->task->taskgroup->prev->cancelled) in gomp_create_target_task()
703 struct gomp_task *task; in gomp_create_target_task() local
704 struct gomp_task *parent = thr->task; in gomp_create_target_task()
719 firstprivate on the target task. */ in gomp_create_target_task()
736 task = gomp_malloc (sizeof (*task) + depend_size in gomp_create_target_task()
741 gomp_init_task (task, parent, gomp_icv (false)); in gomp_create_target_task()
742 task->priority = 0; in gomp_create_target_task()
743 task->kind = GOMP_TASK_WAITING; in gomp_create_target_task()
744 task->in_tied_task = parent->in_tied_task; in gomp_create_target_task()
745 task->taskgroup = taskgroup; in gomp_create_target_task()
746 ttask = (struct gomp_target_task *) &task->depend[depend_cnt]; in gomp_create_target_task()
776 ttask->task = task; in gomp_create_target_task()
778 task->fn = NULL; in gomp_create_target_task()
779 task->fn_data = ttask; in gomp_create_target_task()
780 task->final_task = 0; in gomp_create_target_task()
789 gomp_finish_task (task); in gomp_create_target_task()
790 free (task); in gomp_create_target_task()
805 gomp_task_handle_depend (task, parent, depend); in gomp_create_target_task()
806 if (task->num_dependees) in gomp_create_target_task()
816 gomp_task_run_post_handle_depend_hash (task); in gomp_create_target_task()
818 gomp_finish_task (task); in gomp_create_target_task()
819 free (task); in gomp_create_target_task()
826 mapping part of the task in the current thread. */ in gomp_create_target_task()
830 priority_queue_insert (PQ_CHILDREN, &parent->children_queue, task, 0, in gomp_create_target_task()
833 task->parent_depends_on); in gomp_create_target_task()
836 task, 0, PRIORITY_INSERT_END, in gomp_create_target_task()
838 task->parent_depends_on); in gomp_create_target_task()
839 task->pnode[PQ_TEAM].next = NULL; in gomp_create_target_task()
840 task->pnode[PQ_TEAM].prev = NULL; in gomp_create_target_task()
841 task->kind = GOMP_TASK_TIED; in gomp_create_target_task()
845 thr->task = task; in gomp_create_target_task()
846 gomp_target_task_fn (task->fn_data); in gomp_create_target_task()
847 thr->task = parent; in gomp_create_target_task()
850 task->kind = GOMP_TASK_ASYNC_RUNNING; in gomp_create_target_task()
855 gomp_target_task_completion (team, task); in gomp_create_target_task()
861 priority_queue_insert (PQ_CHILDREN, &parent->children_queue, task, 0, in gomp_create_target_task()
864 task->parent_depends_on); in gomp_create_target_task()
866 priority_queue_insert (PQ_TASKGROUP, &taskgroup->taskgroup_queue, task, 0, in gomp_create_target_task()
869 task->parent_depends_on); in gomp_create_target_task()
870 priority_queue_insert (PQ_TEAM, &team->task_queue, task, 0, in gomp_create_target_task()
873 task->parent_depends_on); in gomp_create_target_task()
885 /* Given a parent_depends_on task in LIST, move it to the front of its
891 first, and last_parent_depends_on points to the last such task we
895 task->children
902 task->children
936 /* Given a parent_depends_on TASK in its parent's children_queue, move
946 priority_queue_upgrade_task (struct gomp_task *task, in priority_queue_upgrade_task() argument
950 struct priority_node *node = &task->pnode[PQ_CHILDREN]; in priority_queue_upgrade_task()
952 if (!task->parent_depends_on) in priority_queue_upgrade_task()
953 gomp_fatal ("priority_queue_upgrade_task: task must be a " in priority_queue_upgrade_task()
954 "parent_depends_on task"); in priority_queue_upgrade_task()
955 if (!priority_queue_task_in_queue_p (PQ_CHILDREN, head, task)) in priority_queue_upgrade_task()
956 gomp_fatal ("priority_queue_upgrade_task: cannot find task=%p", task); in priority_queue_upgrade_task()
961 = priority_queue_lookup_priority (head, task->priority); in priority_queue_upgrade_task()
985 /* The task in NODE is about to become TIED and TIED tasks in priority_list_downgrade_task()
988 things appropriately. However, a TIED task at the end is in priority_list_downgrade_task()
1004 /* If the current task is the last_parent_depends_on for its in priority_list_downgrade_task()
1023 /* Given a TASK in HEAD that is about to be executed, move it out of
1037 struct gomp_task *task) in priority_queue_downgrade_task() argument
1040 if (!priority_queue_task_in_queue_p (type, head, task)) in priority_queue_downgrade_task()
1041 gomp_fatal ("Attempt to downgrade missing task %p", task); in priority_queue_downgrade_task()
1046 = priority_queue_lookup_priority (head, task->priority); in priority_queue_downgrade_task()
1047 priority_list_downgrade_task (type, list, task); in priority_queue_downgrade_task()
1050 priority_list_downgrade_task (type, &head->l, task); in priority_queue_downgrade_task()
1053 /* Setup CHILD_TASK to execute. This is done by setting the task to
1056 overall team task queue entirely.
1058 Return TRUE if task or its containing taskgroup has been
1075 /* Task is about to go tied, move it out of the way. */ in gomp_task_run_pre()
1080 /* Task is about to go tied, move it out of the way. */ in gomp_task_run_pre()
1141 each task that depends on CHILD_TASK, to record the fact that there
1142 is one less dependency to worry about. If a task that depended on
1156 struct gomp_task *task = child_task->dependers->elem[i]; in gomp_task_run_post_handle_dependers() local
1158 /* CHILD_TASK satisfies a dependency for TASK. Keep track of in gomp_task_run_post_handle_dependers()
1159 TASK's remaining dependencies. Once TASK has no other in gomp_task_run_post_handle_dependers()
1162 if (--task->num_dependees != 0) in gomp_task_run_post_handle_dependers()
1165 struct gomp_taskgroup *taskgroup = task->taskgroup; in gomp_task_run_post_handle_dependers()
1169 task, task->priority, in gomp_task_run_post_handle_dependers()
1172 task->parent_depends_on); in gomp_task_run_post_handle_dependers()
1177 /* One more task has had its dependencies met. in gomp_task_run_post_handle_dependers()
1184 /* One more task has had its dependencies met. in gomp_task_run_post_handle_dependers()
1192 task->parent = NULL; in gomp_task_run_post_handle_dependers()
1196 task, task->priority, in gomp_task_run_post_handle_dependers()
1199 task->parent_depends_on); in gomp_task_run_post_handle_dependers()
1202 /* One more task has had its dependencies met. in gomp_task_run_post_handle_dependers()
1209 task, task->priority, in gomp_task_run_post_handle_dependers()
1212 task->parent_depends_on); in gomp_task_run_post_handle_dependers()
1251 /* If this was the last task the parent was depending on, in gomp_task_run_post_remove_parent()
1291 outside of the task lock mutex region, so in gomp_task_run_post_remove_taskgroup()
1309 struct gomp_task *task = thr->task; in gomp_barrier_handle_tasks() local
1366 thr->task = child_task; in gomp_barrier_handle_tasks()
1371 thr->task = task; in gomp_barrier_handle_tasks()
1390 thr->task = task; in gomp_barrier_handle_tasks()
1427 Wait for all children of the current task. */
1434 struct gomp_task *task = thr->task; in GOMP_taskwait() local
1440 /* The acquire barrier on load of task->children here synchronizes in GOMP_taskwait()
1444 child thread task work function are seen before we exit from in GOMP_taskwait()
1446 if (task == NULL in GOMP_taskwait()
1447 || priority_queue_empty_p (&task->children_queue, MEMMODEL_ACQUIRE)) in GOMP_taskwait()
1456 if (priority_queue_empty_p (&task->children_queue, MEMMODEL_RELAXED)) in GOMP_taskwait()
1458 bool destroy_taskwait = task->taskwait != NULL; in GOMP_taskwait()
1459 task->taskwait = NULL; in GOMP_taskwait()
1471 = priority_queue_next_task (PQ_CHILDREN, &task->children_queue, in GOMP_taskwait()
1477 = gomp_task_run_pre (child_task, task, team); in GOMP_taskwait()
1495 if (task->taskwait == NULL) in GOMP_taskwait()
1499 task->taskwait = &taskwait; in GOMP_taskwait()
1517 thr->task = child_task; in GOMP_taskwait()
1522 thr->task = task; in GOMP_taskwait()
1540 thr->task = task; in GOMP_taskwait()
1553 priority_queue_remove (PQ_CHILDREN, &task->children_queue, in GOMP_taskwait()
1569 - !task->in_tied_task; in GOMP_taskwait()
1578 Wait as if it was an mergeable included task construct with empty body. */
1591 if (thr->task->taskgroup) in GOMP_taskwait_depend()
1593 if (thr->task->taskgroup->cancelled) in GOMP_taskwait_depend()
1595 if (thr->task->taskgroup->workshare in GOMP_taskwait_depend()
1596 && thr->task->taskgroup->prev in GOMP_taskwait_depend()
1597 && thr->task->taskgroup->prev->cancelled) in GOMP_taskwait_depend()
1602 if (thr->task && thr->task->depend_hash) in GOMP_taskwait_depend()
1606 /* An undeferred task is about to run. Wait for all tasks that this
1607 undeferred task depends on.
1623 struct gomp_task *task = thr->task; in gomp_task_maybe_wait_for_dependencies() local
1668 ent = htab_find (task->depend_hash, &elem); in gomp_task_maybe_wait_for_dependencies()
1674 struct gomp_task *tsk = ent->task; in gomp_task_maybe_wait_for_dependencies()
1683 priority_queue_upgrade_task (tsk, task); in gomp_task_maybe_wait_for_dependencies()
1696 task->taskwait = &taskwait; in gomp_task_maybe_wait_for_dependencies()
1703 task->taskwait = NULL; in gomp_task_maybe_wait_for_dependencies()
1716 task->children_queue and team->task_queue here, so we should in gomp_task_maybe_wait_for_dependencies()
1718 running an undeferred task, perhaps that makes all tasks it in gomp_task_maybe_wait_for_dependencies()
1725 below if the task was actually removed from the children in gomp_task_maybe_wait_for_dependencies()
1729 = priority_queue_next_task (PQ_CHILDREN, &task->children_queue, in gomp_task_maybe_wait_for_dependencies()
1736 = gomp_task_run_pre (child_task, task, team); in gomp_task_maybe_wait_for_dependencies()
1768 thr->task = child_task; in gomp_task_maybe_wait_for_dependencies()
1773 thr->task = task; in gomp_task_maybe_wait_for_dependencies()
1791 thr->task = task; in gomp_task_maybe_wait_for_dependencies()
1804 priority_queue_remove (PQ_CHILDREN, &task->children_queue, in gomp_task_maybe_wait_for_dependencies()
1817 - !task->in_tied_task; in gomp_task_maybe_wait_for_dependencies()
1854 struct gomp_task *task = thr->task; in GOMP_taskgroup_start() local
1862 task->taskgroup = gomp_taskgroup_init (task->taskgroup); in GOMP_taskgroup_start()
1870 struct gomp_task *task = thr->task; in GOMP_taskgroup_end() local
1878 taskgroup = task->taskgroup; in GOMP_taskgroup_end()
1895 child thread task work function are seen before we exit from in GOMP_taskgroup_end()
1910 if (priority_queue_empty_p (&task->children_queue, in GOMP_taskgroup_end()
1914 = priority_queue_next_task (PQ_CHILDREN, &task->children_queue, in GOMP_taskgroup_end()
1972 thr->task = child_task; in GOMP_taskgroup_end()
1977 thr->task = task; in GOMP_taskgroup_end()
1995 thr->task = task; in GOMP_taskgroup_end()
2014 - !task->in_tied_task; in GOMP_taskgroup_end()
2022 task->taskgroup = taskgroup->prev; in GOMP_taskgroup_end()
2038 /* For worksharing task reductions, memory has been allocated in gomp_reduction_register()
2095 /* Ugly hack, hash_entry_type is defined for the task dependencies, in gomp_reduction_register()
2118 struct gomp_task *task = thr->task; in gomp_create_artificial_team() local
2119 struct gomp_task **implicit_task = &task; in gomp_create_artificial_team()
2120 icv = task ? &task->icv : &gomp_global_icv; in gomp_create_artificial_team()
2130 thr->task = &team->implicit_task[0]; in gomp_create_artificial_team()
2131 gomp_init_task (thr->task, NULL, icv); in gomp_create_artificial_team()
2137 thr->task = *implicit_task; in gomp_create_artificial_team()
2140 thr->task = &team->implicit_task[0]; in gomp_create_artificial_team()
2146 if (implicit_task != &task) in gomp_create_artificial_team()
2148 *implicit_task = thr->task; in gomp_create_artificial_team()
2149 thr->task = task; in gomp_create_artificial_team()
2167 for worksharing construct task reductions in cancellable parallel,
2176 struct gomp_task *task; in GOMP_taskgroup_reduction_register() local
2180 /* The task reduction code needs a team and task, so for in GOMP_taskgroup_reduction_register()
2187 task = thr->task; in GOMP_taskgroup_reduction_register()
2188 gomp_reduction_register (data, task->taskgroup->reductions, NULL, nthreads); in GOMP_taskgroup_reduction_register()
2189 task->taskgroup->reductions = data; in GOMP_taskgroup_reduction_register()
2216 struct gomp_task *task = thr->task; in ialias() local
2218 uintptr_t *data = task->taskgroup->reductions; in ialias()
2252 "task modifier for %p", ptrs[i]); in ialias()
2273 "with task modifier for %p", ptrs[i]); in ialias()
2292 struct gomp_task *task = thr->task; in gomp_workshare_task_reduction_register() local
2294 gomp_reduction_register (data, task->taskgroup->reductions, orig, nthreads); in gomp_workshare_task_reduction_register()
2295 task->taskgroup->reductions = data; in gomp_workshare_task_reduction_register()
2303 struct gomp_task *task; in gomp_workshare_taskgroup_start() local
2310 task = thr->task; in gomp_workshare_taskgroup_start()
2311 task->taskgroup = gomp_taskgroup_init (task->taskgroup); in gomp_workshare_taskgroup_start()
2312 task->taskgroup->workshare = true; in gomp_workshare_taskgroup_start()
2319 struct gomp_task *task = thr->task; in GOMP_workshare_task_reduction_unregister() local
2321 uintptr_t *data = task->taskgroup->reductions; in GOMP_workshare_task_reduction_unregister()
2336 return thr->task && thr->task->final_task; in omp_in_final()