32#ifdef KMP_SUPPORT_GRAPH_OUTPUT
33static std::atomic<kmp_int32> kmp_node_id_seed = 0;
49#ifdef KMP_SUPPORT_GRAPH_OUTPUT
52#if USE_ITT_BUILD && USE_ITT_NOTIFY
53 __itt_sync_create(node,
"OMP task dep node", NULL, 0);
64size_t sizes[] = {997, 2003, 4001, 8191, 16001, 32003, 64007, 131071, 270029};
70 return ((
addr >> 6) ^ (
addr >> 2)) % hsize;
79 return current_dephash;
82 size_t size_to_allocate =
86 h = (
kmp_dephash_t *)__kmp_fast_allocate(thread, size_to_allocate);
100 h->buckets[
i] = NULL;
104 for (
size_t i = 0;
i < current_dephash->
size;
i++) {
106 for (entry = current_dephash->
buckets[
i]; entry; entry = next) {
115 h->buckets[new_bucket] = entry;
121 __kmp_fast_free(thread, current_dephash);
155 for (
size_t i = 0;
i < h_size;
i++)
165 if (
h->nelements != 0 &&
h->nconflicts /
h->size >= 1) {
195 h->buckets[bucket] = entry;
217 new_head->
next = list;
225#ifdef KMP_SUPPORT_GRAPH_OUTPUT
235#if OMPT_SUPPORT && OMPT_OPTIONAL
241 ompt_data_t *sink_data;
245 sink_data = &
__kmp_threads[gtid]->th.ompt_thread_info.task_data;
248 &(task_source->ompt_task_info.task_data), sink_data);
276 if (!
dep->dn.successors ||
dep->dn.successors->node != node) {
279 KA_TRACE(40, (
"__kmp_process_deps: T#%d adding dependence from %p to "
289 return npredecessors;
308 KA_TRACE(40, (
"__kmp_process_deps: T#%d adding dependence from %p to "
317 return npredecessors;
323 KA_TRACE(30, (
"__kmp_process_dep_all: T#%d processing dep_all, "
324 "dep_barrier = %d\n",
343 for (
size_t i = 0;
i <
h->size;
i++) {
372 KA_TRACE(30, (
"__kmp_process_dep_all: T#%d found %d predecessors\n", gtid,
374 return npredecessors;
377template <
bool filter>
382 KA_TRACE(30, (
"__kmp_process_deps<%d>: T#%d processing %d dependences : "
383 "dep_barrier = %d\n",
384 filter, gtid, ndeps, dep_barrier));
391 if (filter &&
dep->base_addr == 0)
400 if (
dep->flags.out) {
489 KA_TRACE(30, (
"__kmp_process_deps<%d>: T#%d found %d predecessors\n", filter,
490 gtid, npredecessors));
491 return npredecessors;
494#define NO_DEP_BARRIER (false)
495#define DEP_BARRIER (true)
504 int i, n_mtxs = 0, dep_all = 0;
508 KA_TRACE(20, (
"__kmp_check_deps: T#%d checking dependences for task %p : %d "
509 "possibly aliased dependences, %d non-aliased dependences : "
510 "dep_barrier=%d .\n",
511 gtid, taskdata, ndeps, ndeps_noalias, dep_barrier));
515 for (
i = 0;
i < ndeps;
i++) {
516 if (dep_list[
i].base_addr != 0 &&
522 for (
int j =
i + 1;
j < ndeps;
j++) {
523 if (dep_list[
i].base_addr == dep_list[
j].base_addr) {
561 ndeps, dep_list,
task);
563 gtid, node, hash, dep_barrier, ndeps_noalias, noalias_dep_list,
task);
580 KA_TRACE(20, (
"__kmp_check_deps: T#%d found %d predecessors for task %p \n",
581 gtid, npredecessors, taskdata));
585 return npredecessors > 0 ? true :
false;
611 KA_TRACE(10, (
"__kmpc_omp_task_with_deps(enter): T#%d loc=%p task=%p\n", gtid,
612 loc_ref, new_taskdata));
619 if (!current_task->ompt_task_info.frame.enter_frame.ptr)
620 current_task->ompt_task_info.frame.enter_frame.ptr =
624 &(current_task->ompt_task_info.task_data),
625 &(current_task->ompt_task_info.frame),
626 &(new_taskdata->ompt_task_info.task_data),
628 OMPT_LOAD_OR_GET_RETURN_ADDRESS(gtid));
631 new_taskdata->ompt_task_info.frame.enter_frame.ptr =
637 if (ndeps + ndeps_noalias > 0 &&
ompt_enabled.ompt_callback_dependences) {
640 int ompt_ndeps = ndeps + ndeps_noalias;
641 ompt_dependence_t *ompt_deps = (ompt_dependence_t *)KMP_OMPT_DEPS_ALLOC(
642 thread, (ndeps + ndeps_noalias) *
sizeof(ompt_dependence_t));
646 for (
i = 0;
i < ndeps;
i++) {
647 ompt_deps[
i].variable.ptr = (
void *)dep_list[
i].base_addr;
649 ompt_deps[
i].dependence_type = ompt_dependence_type_out_all_memory;
651 ompt_deps[
i].dependence_type = ompt_dependence_type_inout;
652 else if (dep_list[
i].flags.
out)
653 ompt_deps[
i].dependence_type = ompt_dependence_type_out;
654 else if (dep_list[
i].flags.
in)
655 ompt_deps[
i].dependence_type = ompt_dependence_type_in;
656 else if (dep_list[
i].flags.
mtx)
657 ompt_deps[
i].dependence_type = ompt_dependence_type_mutexinoutset;
658 else if (dep_list[
i].flags.
set)
659 ompt_deps[
i].dependence_type = ompt_dependence_type_inoutset;
660 else if (dep_list[
i].flags.
all)
661 ompt_deps[
i].dependence_type = ompt_dependence_type_out_all_memory;
663 for (
i = 0;
i < ndeps_noalias;
i++) {
664 ompt_deps[ndeps +
i].variable.ptr = (
void *)noalias_dep_list[
i].base_addr;
666 ompt_deps[ndeps +
i].dependence_type =
667 ompt_dependence_type_out_all_memory;
668 else if (noalias_dep_list[
i].flags.
in && noalias_dep_list[
i].
flags.
out)
669 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_inout;
670 else if (noalias_dep_list[
i].flags.
out)
671 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_out;
672 else if (noalias_dep_list[
i].flags.
in)
673 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_in;
674 else if (noalias_dep_list[
i].flags.
mtx)
675 ompt_deps[ndeps +
i].dependence_type =
676 ompt_dependence_type_mutexinoutset;
677 else if (noalias_dep_list[
i].flags.
set)
678 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_inoutset;
679 else if (noalias_dep_list[
i].flags.
all)
680 ompt_deps[ndeps +
i].dependence_type =
681 ompt_dependence_type_out_all_memory;
684 &(new_taskdata->ompt_task_info.task_data), ompt_deps, ompt_ndeps);
687 KMP_OMPT_DEPS_FREE(thread, ompt_deps);
700 if (!serial && (ndeps > 0 || ndeps_noalias > 0)) {
719 KA_TRACE(10, (
"__kmpc_omp_task_with_deps(exit): T#%d task had blocking "
721 "loc=%p task=%p, return: TASK_CURRENT_NOT_QUEUED\n",
722 gtid, loc_ref, new_taskdata));
725 current_task->ompt_task_info.frame.enter_frame = ompt_data_none;
731 KA_TRACE(10, (
"__kmpc_omp_task_with_deps(exit): T#%d ignored dependences "
732 "for task (serialized) loc=%p task=%p\n",
733 gtid, loc_ref, new_taskdata));
736 KA_TRACE(10, (
"__kmpc_omp_task_with_deps(exit): T#%d task had no blocking "
738 "loc=%p task=%p, transferring to __kmp_omp_task\n",
739 gtid, loc_ref, new_taskdata));
744 current_task->ompt_task_info.frame.enter_frame = ompt_data_none;
752 ompt_data_t *taskwait_task_data) {
755 taskwait_task_data, ompt_taskwait_complete, NULL);
757 current_task->ompt_task_info.frame.enter_frame.ptr = NULL;
758 *taskwait_task_data = ompt_data_none;
777 noalias_dep_list,
false);
790 KA_TRACE(10, (
"__kmpc_omp_taskwait_deps(enter): T#%d loc=%p nowait#%d\n",
791 gtid, loc_ref, has_no_wait));
792 if (ndeps == 0 && ndeps_noalias == 0) {
793 KA_TRACE(10, (
"__kmpc_omp_taskwait_deps(exit): T#%d has no dependences to "
794 "wait upon : loc=%p\n",
808 ompt_data_t *taskwait_task_data = &thread->th.ompt_thread_info.task_data;
811 if (!current_task->ompt_task_info.frame.enter_frame.ptr)
812 current_task->ompt_task_info.frame.enter_frame.ptr =
816 &(current_task->ompt_task_info.task_data),
817 &(current_task->ompt_task_info.frame), taskwait_task_data,
818 ompt_task_taskwait | ompt_task_undeferred | ompt_task_mergeable, 1,
819 OMPT_LOAD_OR_GET_RETURN_ADDRESS(gtid));
825 if (ndeps + ndeps_noalias > 0 &&
ompt_enabled.ompt_callback_dependences) {
828 int ompt_ndeps = ndeps + ndeps_noalias;
829 ompt_dependence_t *ompt_deps = (ompt_dependence_t *)KMP_OMPT_DEPS_ALLOC(
830 thread, (ndeps + ndeps_noalias) *
sizeof(ompt_dependence_t));
834 for (
i = 0;
i < ndeps;
i++) {
835 ompt_deps[
i].variable.ptr = (
void *)dep_list[
i].base_addr;
837 ompt_deps[
i].dependence_type = ompt_dependence_type_inout;
838 else if (dep_list[
i].flags.
out)
839 ompt_deps[
i].dependence_type = ompt_dependence_type_out;
840 else if (dep_list[
i].flags.
in)
841 ompt_deps[
i].dependence_type = ompt_dependence_type_in;
842 else if (dep_list[
i].flags.
mtx)
843 ompt_deps[ndeps +
i].dependence_type =
844 ompt_dependence_type_mutexinoutset;
845 else if (dep_list[
i].flags.
set)
846 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_inoutset;
848 for (
i = 0;
i < ndeps_noalias;
i++) {
849 ompt_deps[ndeps +
i].variable.ptr = (
void *)noalias_dep_list[
i].base_addr;
850 if (noalias_dep_list[
i].flags.
in && noalias_dep_list[
i].
flags.
out)
851 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_inout;
852 else if (noalias_dep_list[
i].flags.
out)
853 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_out;
854 else if (noalias_dep_list[
i].flags.
in)
855 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_in;
856 else if (noalias_dep_list[
i].flags.
mtx)
857 ompt_deps[ndeps +
i].dependence_type =
858 ompt_dependence_type_mutexinoutset;
859 else if (noalias_dep_list[
i].flags.
set)
860 ompt_deps[ndeps +
i].dependence_type = ompt_dependence_type_inoutset;
863 taskwait_task_data, ompt_deps, ompt_ndeps);
866 KMP_OMPT_DEPS_FREE(thread, ompt_deps);
879 ignore && thread->th.th_task_team != NULL &&
880 thread->th.th_task_team->tt.tt_found_proxy_tasks ==
FALSE &&
881 thread->th.th_task_team->tt.tt_hidden_helper_task_encountered ==
FALSE;
882 ignore = ignore || current_task->
td_dephash == NULL;
885 KA_TRACE(10, (
"__kmpc_omp_taskwait_deps(exit): T#%d has no blocking "
886 "dependences : loc=%p\n",
889 __ompt_taskwait_dep_finish(current_task, taskwait_task_data);
900 KA_TRACE(10, (
"__kmpc_omp_taskwait_deps(exit): T#%d has no blocking "
901 "dependences : loc=%p\n",
904 __ompt_taskwait_dep_finish(current_task, taskwait_task_data);
910 while ((nrefs = node.
dn.
nrefs) > 3) {
919 int thread_finished =
FALSE;
934 while ((nrefs = node.
dn.
nrefs) > 3) {
941 __ompt_taskwait_dep_finish(current_task, taskwait_task_data);
943 KA_TRACE(10, (
"__kmpc_omp_taskwait_deps(exit): T#%d finished waiting : loc=%p\
struct kmp_task kmp_task_t
kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list)
void __kmpc_omp_wait_deps(ident_t *loc_ref, kmp_int32 gtid, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t new_size
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync p
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function h
struct kmp_dephash kmp_dephash_t
union kmp_task_team kmp_task_team_t
union kmp_depnode kmp_depnode_t
#define TASK_CURRENT_NOT_QUEUED
struct kmp_depend_info kmp_depend_info_t
#define KMP_TASK_TO_TASKDATA(task)
#define __kmp_thread_malloc(th, size)
struct kmp_depnode_list kmp_depnode_list_t
kmp_info_t ** __kmp_threads
int __kmp_task_stealing_constraint
#define __kmp_allocate(size)
struct kmp_base_depnode kmp_base_depnode_t
static void __kmp_assert_valid_gtid(kmp_int32 gtid)
struct kmp_dephash_entry kmp_dephash_entry_t
kmp_int32 __kmp_omp_task(kmp_int32 gtid, kmp_task_t *new_task, bool serialize_immediate)
struct kmp_taskdata kmp_taskdata_t
union KMP_ALIGN_CACHE kmp_info kmp_info_t
#define __kmp_thread_free(th, ptr)
#define KMP_DEBUG_ASSERT(cond)
void __kmp_printf(char const *format,...)
#define USE_ITT_BUILD_ARG(x)
static void __kmp_init_lock(kmp_lock_t *lck)
kmp_ticket_lock_t kmp_lock_t
#define KMP_ATOMIC_ADD(p, v)
#define KMP_ATOMIC_ST_RLX(p, v)
#define KMP_ATOMIC_INC(p)
kmp_depnode_list_t * __kmpc_task_get_successors(kmp_task_t *task)
static bool __kmp_check_deps(kmp_int32 gtid, kmp_depnode_t *node, kmp_task_t *task, kmp_dephash_t **hash, bool dep_barrier, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list)
static kmp_int32 __kmp_depnode_link_successor(kmp_int32 gtid, kmp_info_t *thread, kmp_task_t *task, kmp_depnode_t *node, kmp_depnode_list_t *plist)
static kmp_int32 __kmp_process_dep_all(kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t *h, bool dep_barrier, kmp_task_t *task)
@ KMP_DEPHASH_MASTER_SIZE
kmp_base_depnode_t * __kmpc_task_get_depnode(kmp_task_t *task)
static kmp_dephash_t * __kmp_dephash_extend(kmp_info_t *thread, kmp_dephash_t *current_dephash)
void __kmpc_omp_taskwait_deps_51(ident_t *loc_ref, kmp_int32 gtid, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list, kmp_int32 has_no_wait)
static kmp_dephash_entry * __kmp_dephash_find(kmp_info_t *thread, kmp_dephash_t **hash, kmp_intptr_t addr)
static size_t __kmp_dephash_hash(kmp_intptr_t addr, size_t hsize)
static void __kmp_track_dependence(kmp_int32 gtid, kmp_depnode_t *source, kmp_depnode_t *sink, kmp_task_t *sink_task)
static void __kmp_init_node(kmp_depnode_t *node, bool on_stack)
static kmp_int32 __kmp_process_deps(kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t **hash, bool dep_barrier, kmp_int32 ndeps, kmp_depend_info_t *dep_list, kmp_task_t *task)
static kmp_dephash_t * __kmp_dephash_create(kmp_info_t *thread, kmp_taskdata_t *current_task)
static kmp_depnode_list_t * __kmp_add_node(kmp_info_t *thread, kmp_depnode_list_t *list, kmp_depnode_t *node)
static kmp_depnode_t * __kmp_node_ref(kmp_depnode_t *node)
#define KMP_ACQUIRE_DEPNODE(gtid, n)
static void __kmp_depnode_list_free(kmp_info_t *thread, kmp_depnode_list *list)
static void __kmp_node_deref(kmp_info_t *thread, kmp_depnode_t *node)
#define KMP_RELEASE_DEPNODE(gtid, n)
ompt_callbacks_active_t ompt_enabled
ompt_callbacks_internal_t ompt_callbacks
#define TASK_TYPE_DETAILS_FORMAT(info)
#define OMPT_GET_FRAME_ADDRESS(level)
char const * psource
String describing the source location.
std::atomic< kmp_int32 > npredecessors
std::atomic< kmp_int32 > nrefs
kmp_lock_t * mtx_locks[MAX_MTX_DEPS]
kmp_depnode_list_t * successors
kmp_int32 tt_found_proxy_tasks
kmp_int32 tt_hidden_helper_task_encountered
struct kmp_depend_info::@316005266217326044116252041340323012067311074074::@332100123210042362154056135173262054277336320356 flags
kmp_dephash_entry_t * next_in_bucket
kmp_depnode_list_t * last_set
kmp_depnode_list_t * prev_set
kmp_dephash_entry_t ** buckets
kmp_depnode_list_t * next
kmp_dephash_t * td_dephash
kmp_depnode_t * td_depnode
kmp_tasking_flags_t td_flags