Index: openmp/runtime/src/kmp.h =================================================================== --- openmp/runtime/src/kmp.h +++ openmp/runtime/src/kmp.h @@ -959,21 +959,6 @@ kmp_uint64 pool_used; } kmp_allocator_t; -extern omp_allocator_handle_t __kmpc_init_allocator(int gtid, - omp_memspace_handle_t, - int ntraits, - omp_alloctrait_t traits[]); -extern void __kmpc_destroy_allocator(int gtid, omp_allocator_handle_t al); -extern void __kmpc_set_default_allocator(int gtid, omp_allocator_handle_t al); -extern omp_allocator_handle_t __kmpc_get_default_allocator(int gtid); -extern void *__kmpc_alloc(int gtid, size_t sz, omp_allocator_handle_t al); -extern void *__kmpc_calloc(int gtid, size_t nmemb, size_t sz, - omp_allocator_handle_t al); -extern void *__kmpc_realloc(int gtid, void *ptr, size_t sz, - omp_allocator_handle_t al, - omp_allocator_handle_t free_al); -extern void __kmpc_free(int gtid, void *ptr, omp_allocator_handle_t al); - extern void __kmp_init_memkind(); extern void __kmp_fini_memkind(); @@ -3316,38 +3301,6 @@ extern void __kmp_yield(); -extern void __kmpc_dispatch_init_4(ident_t *loc, kmp_int32 gtid, - enum sched_type schedule, kmp_int32 lb, - kmp_int32 ub, kmp_int32 st, kmp_int32 chunk); -extern void __kmpc_dispatch_init_4u(ident_t *loc, kmp_int32 gtid, - enum sched_type schedule, kmp_uint32 lb, - kmp_uint32 ub, kmp_int32 st, - kmp_int32 chunk); -extern void __kmpc_dispatch_init_8(ident_t *loc, kmp_int32 gtid, - enum sched_type schedule, kmp_int64 lb, - kmp_int64 ub, kmp_int64 st, kmp_int64 chunk); -extern void __kmpc_dispatch_init_8u(ident_t *loc, kmp_int32 gtid, - enum sched_type schedule, kmp_uint64 lb, - kmp_uint64 ub, kmp_int64 st, - kmp_int64 chunk); - -extern int __kmpc_dispatch_next_4(ident_t *loc, kmp_int32 gtid, - kmp_int32 *p_last, kmp_int32 *p_lb, - kmp_int32 *p_ub, kmp_int32 *p_st); -extern int __kmpc_dispatch_next_4u(ident_t *loc, kmp_int32 gtid, - kmp_int32 *p_last, kmp_uint32 *p_lb, - kmp_uint32 *p_ub, kmp_int32 *p_st); -extern int __kmpc_dispatch_next_8(ident_t *loc, kmp_int32 gtid, - kmp_int32 *p_last, kmp_int64 *p_lb, - kmp_int64 *p_ub, kmp_int64 *p_st); -extern int __kmpc_dispatch_next_8u(ident_t *loc, kmp_int32 gtid, - kmp_int32 *p_last, kmp_uint64 *p_lb, - kmp_uint64 *p_ub, kmp_int64 *p_st); - -extern void __kmpc_dispatch_fini_4(ident_t *loc, kmp_int32 gtid); -extern void __kmpc_dispatch_fini_8(ident_t *loc, kmp_int32 gtid); -extern void __kmpc_dispatch_fini_4u(ident_t *loc, kmp_int32 gtid); -extern void __kmpc_dispatch_fini_8u(ident_t *loc, kmp_int32 gtid); #ifdef KMP_GOMP_COMPAT @@ -3371,9 +3324,61 @@ extern void __kmp_aux_dispatch_fini_chunk_8(ident_t *loc, kmp_int32 gtid); extern void __kmp_aux_dispatch_fini_chunk_4u(ident_t *loc, kmp_int32 gtid); extern void __kmp_aux_dispatch_fini_chunk_8u(ident_t *loc, kmp_int32 gtid); - +extern int __kmp_aux_dispatch_next_4(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_int32 *p_lb, + kmp_int32 *p_ub, kmp_int32 *p_st); +extern int __kmp_aux_dispatch_next_4u(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_uint32 *p_lb, + kmp_uint32 *p_ub, kmp_int32 *p_st); +extern int __kmp_aux_dispatch_next_8(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_int64 *p_lb, + kmp_int64 *p_ub, kmp_int64 *p_st); +extern int __kmp_aux_dispatch_next_8u(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_uint64 *p_lb, + kmp_uint64 *p_ub, kmp_int64 *p_st); + +void __kmp_aux_doacross_init(ident_t *loc, kmp_int32 gtid, kmp_int32 num_dims, + const struct kmp_dim *dims); +void __kmp_aux_doacross_wait(ident_t *loc, kmp_int32 gtid, + const kmp_int64 *vec); +void __kmp_aux_doacross_post(ident_t *loc, kmp_int32 gtid, + const kmp_int64 *vec); +void __kmp_aux_doacross_fini(ident_t *loc, kmp_int32 gtid); + +void __kmp_aux_barrier(ident_t *, kmp_int32 global_tid); +void __kmp_aux_ordered(ident_t *, kmp_int32 global_tid); +void __kmp_aux_end_ordered(ident_t *, kmp_int32 global_tid); +void __kmp_aux_critical(ident_t *, kmp_int32 global_tid, kmp_critical_name *); +void __kmp_aux_end_critical(ident_t *, kmp_int32 global_tid, + kmp_critical_name *); + +kmp_int32 __kmp_aux_omp_task(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *new_task); +kmp_int32 __kmp_aux_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 __kmp_aux_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); +kmp_int32 __kmp_aux_cancel(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind); +kmp_int32 __kmp_aux_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind); +void __kmp_aux_taskloop(ident_t *loc, kmp_int32 gtid, kmp_task_t *task, + kmp_int32 if_val, kmp_uint64 *lb, kmp_uint64 *ub, + kmp_int64 st, kmp_int32 nogroup, kmp_int32 sched, + kmp_uint64 grainsize, void *task_dup); #endif /* KMP_GOMP_COMPAT */ +void __kmp_aux_taskgroup(ident_t *loc, int gtid); +void __kmp_aux_end_taskgroup(ident_t *loc, int gtid); +void __kmp_aux_end_serialized_parallel(ident_t *, kmp_int32 global_tid); +void __kmp_aux_critical_with_hint(ident_t *, kmp_int32 global_tid, + kmp_critical_name *, uint32_t hint); + extern kmp_uint32 __kmp_eq_4(kmp_uint32 value, kmp_uint32 checker); extern kmp_uint32 __kmp_neq_4(kmp_uint32 value, kmp_uint32 checker); extern kmp_uint32 __kmp_lt_4(kmp_uint32 value, kmp_uint32 checker); @@ -3576,8 +3581,6 @@ kmp_info_t *this_thr, kmp_team_t *team); -// should never have been exported -KMP_EXPORT int __kmpc_invoke_task_func(int gtid); extern int __kmp_invoke_teams_master(int gtid); extern void __kmp_teams_master(int gtid); extern int __kmp_aux_get_team_num(); @@ -3609,9 +3612,6 @@ extern void __kmp_finish_implicit_task(kmp_info_t *this_thr); extern void __kmp_free_implicit_task(kmp_info_t *this_thr); -extern kmp_event_t *__kmpc_task_allow_completion_event(ident_t *loc_ref, - int gtid, - kmp_task_t *task); extern void __kmp_fulfill_event(kmp_event_t *event); extern void __kmp_free_task_team(kmp_info_t *thread, @@ -3653,187 +3653,12 @@ /* ------------------------------------------------------------------------ */ -KMP_EXPORT void __kmpc_begin(ident_t *, kmp_int32 flags); -KMP_EXPORT void __kmpc_end(ident_t *); - -KMP_EXPORT void __kmpc_threadprivate_register_vec(ident_t *, void *data, - kmpc_ctor_vec ctor, - kmpc_cctor_vec cctor, - kmpc_dtor_vec dtor, - size_t vector_length); -KMP_EXPORT void __kmpc_threadprivate_register(ident_t *, void *data, - kmpc_ctor ctor, kmpc_cctor cctor, - kmpc_dtor dtor); -KMP_EXPORT void *__kmpc_threadprivate(ident_t *, kmp_int32 global_tid, - void *data, size_t size); - -KMP_EXPORT kmp_int32 __kmpc_global_thread_num(ident_t *); -KMP_EXPORT kmp_int32 __kmpc_global_num_threads(ident_t *); -KMP_EXPORT kmp_int32 __kmpc_bound_thread_num(ident_t *); -KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *); - -KMP_EXPORT kmp_int32 __kmpc_ok_to_fork(ident_t *); -KMP_EXPORT void __kmpc_fork_call(ident_t *, kmp_int32 nargs, - kmpc_micro microtask, ...); - -KMP_EXPORT void __kmpc_serialized_parallel(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_end_serialized_parallel(ident_t *, kmp_int32 global_tid); - -KMP_EXPORT void __kmpc_flush(ident_t *); -KMP_EXPORT void __kmpc_barrier(ident_t *, kmp_int32 global_tid); -KMP_EXPORT kmp_int32 __kmpc_master(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_end_master(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_ordered(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_end_ordered(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_critical(ident_t *, kmp_int32 global_tid, - kmp_critical_name *); -KMP_EXPORT void __kmpc_end_critical(ident_t *, kmp_int32 global_tid, - kmp_critical_name *); -KMP_EXPORT void __kmpc_critical_with_hint(ident_t *, kmp_int32 global_tid, - kmp_critical_name *, uint32_t hint); - -KMP_EXPORT kmp_int32 __kmpc_barrier_master(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_end_barrier_master(ident_t *, kmp_int32 global_tid); - -KMP_EXPORT kmp_int32 __kmpc_barrier_master_nowait(ident_t *, - kmp_int32 global_tid); - -KMP_EXPORT kmp_int32 __kmpc_single(ident_t *, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_end_single(ident_t *, kmp_int32 global_tid); - -KMP_EXPORT void KMPC_FOR_STATIC_INIT(ident_t *loc, kmp_int32 global_tid, - kmp_int32 schedtype, kmp_int32 *plastiter, - kmp_int *plower, kmp_int *pupper, - kmp_int *pstride, kmp_int incr, - kmp_int chunk); - -KMP_EXPORT void __kmpc_for_static_fini(ident_t *loc, kmp_int32 global_tid); - -KMP_EXPORT void __kmpc_copyprivate(ident_t *loc, kmp_int32 global_tid, - size_t cpy_size, void *cpy_data, - void (*cpy_func)(void *, void *), - kmp_int32 didit); - -extern void KMPC_SET_NUM_THREADS(int arg); -extern void KMPC_SET_DYNAMIC(int flag); -extern void KMPC_SET_NESTED(int flag); - -/* OMP 3.0 tasking interface routines */ -KMP_EXPORT kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *new_task); -KMP_EXPORT kmp_task_t *__kmpc_omp_task_alloc(ident_t *loc_ref, kmp_int32 gtid, - kmp_int32 flags, - size_t sizeof_kmp_task_t, - size_t sizeof_shareds, - kmp_routine_entry_t task_entry); -KMP_EXPORT kmp_task_t *__kmpc_omp_target_task_alloc(ident_t *loc_ref, kmp_int32 gtid, - kmp_int32 flags, - size_t sizeof_kmp_task_t, - size_t sizeof_shareds, - kmp_routine_entry_t task_entry, - kmp_int64 device_id); -KMP_EXPORT void __kmpc_omp_task_begin_if0(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task); -KMP_EXPORT void __kmpc_omp_task_complete_if0(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task); -KMP_EXPORT kmp_int32 __kmpc_omp_task_parts(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *new_task); -KMP_EXPORT kmp_int32 __kmpc_omp_taskwait(ident_t *loc_ref, kmp_int32 gtid); - -KMP_EXPORT kmp_int32 __kmpc_omp_taskyield(ident_t *loc_ref, kmp_int32 gtid, - int end_part); - -#if TASK_UNUSED -void __kmpc_omp_task_begin(ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *task); -void __kmpc_omp_task_complete(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task); -#endif // TASK_UNUSED -/* ------------------------------------------------------------------------ */ - -KMP_EXPORT void __kmpc_taskgroup(ident_t *loc, int gtid); -KMP_EXPORT void __kmpc_end_taskgroup(ident_t *loc, int gtid); - -KMP_EXPORT 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); -KMP_EXPORT 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); extern kmp_int32 __kmp_omp_task(kmp_int32 gtid, kmp_task_t *new_task, bool serialize_immediate); -KMP_EXPORT kmp_int32 __kmpc_cancel(ident_t *loc_ref, kmp_int32 gtid, - kmp_int32 cncl_kind); -KMP_EXPORT kmp_int32 __kmpc_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, - kmp_int32 cncl_kind); -KMP_EXPORT kmp_int32 __kmpc_cancel_barrier(ident_t *loc_ref, kmp_int32 gtid); KMP_EXPORT int __kmp_get_cancellation_status(int cancel_kind); -KMP_EXPORT void __kmpc_proxy_task_completed(kmp_int32 gtid, kmp_task_t *ptask); -KMP_EXPORT void __kmpc_proxy_task_completed_ooo(kmp_task_t *ptask); -KMP_EXPORT void __kmpc_taskloop(ident_t *loc, kmp_int32 gtid, kmp_task_t *task, - kmp_int32 if_val, kmp_uint64 *lb, - kmp_uint64 *ub, kmp_int64 st, kmp_int32 nogroup, - kmp_int32 sched, kmp_uint64 grainsize, - void *task_dup); -KMP_EXPORT void *__kmpc_task_reduction_init(int gtid, int num_data, void *data); -KMP_EXPORT void *__kmpc_taskred_init(int gtid, int num_data, void *data); -KMP_EXPORT void *__kmpc_task_reduction_get_th_data(int gtid, void *tg, void *d); -KMP_EXPORT void *__kmpc_task_reduction_modifier_init(ident_t *loc, int gtid, - int is_ws, int num, - void *data); -KMP_EXPORT void *__kmpc_taskred_modifier_init(ident_t *loc, int gtid, int is_ws, - int num, void *data); -KMP_EXPORT void __kmpc_task_reduction_modifier_fini(ident_t *loc, int gtid, - int is_ws); -KMP_EXPORT kmp_int32 __kmpc_omp_reg_task_with_affinity( - ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 naffins, - kmp_task_affinity_info_t *affin_list); - -/* Lock interface routines (fast versions with gtid passed in) */ -KMP_EXPORT void __kmpc_init_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_init_nest_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_destroy_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_destroy_nest_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_set_lock(ident_t *loc, kmp_int32 gtid, void **user_lock); -KMP_EXPORT void __kmpc_set_nest_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_unset_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT void __kmpc_unset_nest_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); -KMP_EXPORT int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock); -KMP_EXPORT int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, - void **user_lock); - -KMP_EXPORT void __kmpc_init_lock_with_hint(ident_t *loc, kmp_int32 gtid, - void **user_lock, uintptr_t hint); -KMP_EXPORT void __kmpc_init_nest_lock_with_hint(ident_t *loc, kmp_int32 gtid, - void **user_lock, - uintptr_t hint); - -/* Interface to fast scalable reduce methods routines */ - -KMP_EXPORT kmp_int32 __kmpc_reduce_nowait( - ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, - void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), - kmp_critical_name *lck); -KMP_EXPORT void __kmpc_end_reduce_nowait(ident_t *loc, kmp_int32 global_tid, - kmp_critical_name *lck); -KMP_EXPORT kmp_int32 __kmpc_reduce( - ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, - void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), - kmp_critical_name *lck); -KMP_EXPORT void __kmpc_end_reduce(ident_t *loc, kmp_int32 global_tid, - kmp_critical_name *lck); /* Internal fast reduction routines */ @@ -3845,42 +3670,6 @@ // this function is for testing set/get/determine reduce method KMP_EXPORT kmp_int32 __kmp_get_reduce_method(void); -KMP_EXPORT kmp_uint64 __kmpc_get_taskid(); -KMP_EXPORT kmp_uint64 __kmpc_get_parent_taskid(); - -// C++ port -// missing 'extern "C"' declarations - -KMP_EXPORT kmp_int32 __kmpc_in_parallel(ident_t *loc); -KMP_EXPORT void __kmpc_pop_num_threads(ident_t *loc, kmp_int32 global_tid); -KMP_EXPORT void __kmpc_push_num_threads(ident_t *loc, kmp_int32 global_tid, - kmp_int32 num_threads); - -KMP_EXPORT void __kmpc_push_proc_bind(ident_t *loc, kmp_int32 global_tid, - int proc_bind); -KMP_EXPORT void __kmpc_push_num_teams(ident_t *loc, kmp_int32 global_tid, - kmp_int32 num_teams, - kmp_int32 num_threads); -KMP_EXPORT void __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, - kmpc_micro microtask, ...); -struct kmp_dim { // loop bounds info casted to kmp_int64 - kmp_int64 lo; // lower - kmp_int64 up; // upper - kmp_int64 st; // stride -}; -KMP_EXPORT void __kmpc_doacross_init(ident_t *loc, kmp_int32 gtid, - kmp_int32 num_dims, - const struct kmp_dim *dims); -KMP_EXPORT void __kmpc_doacross_wait(ident_t *loc, kmp_int32 gtid, - const kmp_int64 *vec); -KMP_EXPORT void __kmpc_doacross_post(ident_t *loc, kmp_int32 gtid, - const kmp_int64 *vec); -KMP_EXPORT void __kmpc_doacross_fini(ident_t *loc, kmp_int32 gtid); - -KMP_EXPORT void *__kmpc_threadprivate_cached(ident_t *loc, kmp_int32 global_tid, - void *data, size_t size, - void ***cache); - // Symbols for MS mutual detection. extern int _You_must_link_with_exactly_one_OpenMP_library; extern int _You_must_link_with_Intel_OpenMP_library; @@ -3940,7 +3729,6 @@ typedef enum kmp_target_offload_kind kmp_target_offload_kind_t; // Set via OMP_TARGET_OFFLOAD if specified, defaults to tgt_default otherwise extern kmp_target_offload_kind_t __kmp_target_offload; -extern int __kmpc_get_target_offload(); // Constants used in libomptarget #define KMP_DEVICE_DEFAULT -1 // This is libomptarget's default device. @@ -3958,7 +3746,6 @@ // This stores the pause state of the runtime extern kmp_pause_status_t __kmp_pause_status; -extern int __kmpc_pause_resource(kmp_pause_status_t level); extern int __kmp_pause_resource(kmp_pause_status_t level); // Soft resume sets __kmp_pause_status, and wakes up all threads. extern void __kmp_resume_if_soft_paused(); @@ -3975,6 +3762,36 @@ #ifdef __cplusplus } + +template +kmp_int32 __kmp_omp_taskwait_template(ident_t *loc_ref, kmp_int32 gtid, + void *frame_address, + void *return_address); +template +void __kmp_omp_task_begin_if0_template(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task, + void *enter_frame_address, + void *exit_frame_address, + void *return_address); +template +void __kmp_omp_task_complete_if0_template(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task); + +#if OMPT_SUPPORT +OMPT_NOINLINE +void __kmp_omp_task_begin_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task, void *enter_frame_address, + void *exit_frame_address, + void *return_address); +OMPT_NOINLINE +void __kmp_omp_task_complete_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task); +#if OMPT_OPTIONAL +OMPT_NOINLINE +kmp_int32 __kmp_omp_taskwait_ompt(ident_t *loc_ref, kmp_int32 gtid, + void *frame_address, void *return_address); +#endif // OMPT_OPTIONAL +#endif // OMPT_SUPPORT #endif template @@ -4019,4 +3836,6 @@ #endif /* USE_ITT_BUILD */ kmp_int32 is_constrained); +#include "kmp_cexternal.h" + #endif /* KMP_H */ Index: openmp/runtime/src/kmp_cancel.cpp =================================================================== --- openmp/runtime/src/kmp_cancel.cpp +++ openmp/runtime/src/kmp_cancel.cpp @@ -26,7 +26,8 @@ Request cancellation of the binding OpenMP region. */ -kmp_int32 __kmpc_cancel(ident_t *loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) { +kmp_int32 __kmp_aux_cancel(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind) { kmp_info_t *this_thr = __kmp_threads[gtid]; KC_TRACE(10, ("__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid, @@ -121,6 +122,10 @@ return 0 /* false */; } +kmp_int32 __kmpc_cancel(ident_t *loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) { + return __kmp_aux_cancel(loc_ref, gtid, cncl_kind); +} + /*! @ingroup CANCELLATION @param loc_ref location of the original task directive @@ -132,8 +137,8 @@ Cancellation point for the encountering thread. */ -kmp_int32 __kmpc_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, - kmp_int32 cncl_kind) { +kmp_int32 __kmp_aux_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind) { kmp_info_t *this_thr = __kmp_threads[gtid]; KC_TRACE(10, @@ -228,6 +233,10 @@ return 0 /* false */; } +kmp_int32 __kmpc_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind) { + return __kmp_aux_cancellationpoint(loc_ref, gtid, cncl_kind); +} /*! @ingroup CANCELLATION @param loc_ref location of the original task directive Index: openmp/runtime/src/kmp_cexternal.h =================================================================== --- /dev/null +++ openmp/runtime/src/kmp_cexternal.h @@ -0,0 +1,387 @@ +#include "kmp_os.h" + +#ifdef __cplusplus +extern "C" { +#endif + +KMP_EXTERNAL_INTERFACE +extern omp_allocator_handle_t __kmpc_init_allocator(int gtid, + omp_memspace_handle_t, + int ntraits, + omp_alloctrait_t traits[]); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_destroy_allocator(int gtid, omp_allocator_handle_t al); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_set_default_allocator(int gtid, omp_allocator_handle_t al); +KMP_EXTERNAL_INTERFACE +extern omp_allocator_handle_t __kmpc_get_default_allocator(int gtid); +KMP_EXTERNAL_INTERFACE +extern void *__kmpc_alloc(int gtid, size_t sz, omp_allocator_handle_t al); +KMP_EXTERNAL_INTERFACE +extern void *__kmpc_calloc(int gtid, size_t nmemb, size_t sz, + omp_allocator_handle_t al); +KMP_EXTERNAL_INTERFACE +extern void *__kmpc_realloc(int gtid, void *ptr, size_t sz, + omp_allocator_handle_t al, + omp_allocator_handle_t free_al); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_free(int gtid, void *ptr, omp_allocator_handle_t al); + +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_init_4(ident_t *loc, kmp_int32 gtid, + enum sched_type schedule, kmp_int32 lb, + kmp_int32 ub, kmp_int32 st, kmp_int32 chunk); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_init_4u(ident_t *loc, kmp_int32 gtid, + enum sched_type schedule, kmp_uint32 lb, + kmp_uint32 ub, kmp_int32 st, + kmp_int32 chunk); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_init_8(ident_t *loc, kmp_int32 gtid, + enum sched_type schedule, kmp_int64 lb, + kmp_int64 ub, kmp_int64 st, kmp_int64 chunk); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_init_8u(ident_t *loc, kmp_int32 gtid, + enum sched_type schedule, kmp_uint64 lb, + kmp_uint64 ub, kmp_int64 st, + kmp_int64 chunk); + +KMP_EXTERNAL_INTERFACE +extern int __kmpc_dispatch_next_4(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_int32 *p_lb, + kmp_int32 *p_ub, kmp_int32 *p_st); +KMP_EXTERNAL_INTERFACE +extern int __kmpc_dispatch_next_4u(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_uint32 *p_lb, + kmp_uint32 *p_ub, kmp_int32 *p_st); +KMP_EXTERNAL_INTERFACE +extern int __kmpc_dispatch_next_8(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_int64 *p_lb, + kmp_int64 *p_ub, kmp_int64 *p_st); +KMP_EXTERNAL_INTERFACE +extern int __kmpc_dispatch_next_8u(ident_t *loc, kmp_int32 gtid, + kmp_int32 *p_last, kmp_uint64 *p_lb, + kmp_uint64 *p_ub, kmp_int64 *p_st); + +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_fini_4(ident_t *loc, kmp_int32 gtid); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_fini_8(ident_t *loc, kmp_int32 gtid); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_fini_4u(ident_t *loc, kmp_int32 gtid); +KMP_EXTERNAL_INTERFACE +extern void __kmpc_dispatch_fini_8u(ident_t *loc, kmp_int32 gtid); + +// should never have been exported +KMP_EXTERNAL_INTERFACE +KMP_EXPORT int __kmpc_invoke_task_func(int gtid); + +KMP_EXTERNAL_INTERFACE +extern kmp_event_t *__kmpc_task_allow_completion_event(ident_t *loc_ref, + int gtid, + kmp_task_t *task); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_begin(ident_t *, kmp_int32 flags); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end(ident_t *); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_threadprivate_register_vec(ident_t *, void *data, + kmpc_ctor_vec ctor, + kmpc_cctor_vec cctor, + kmpc_dtor_vec dtor, + size_t vector_length); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_threadprivate_register(ident_t *, void *data, + kmpc_ctor ctor, kmpc_cctor cctor, + kmpc_dtor dtor); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_threadprivate(ident_t *, kmp_int32 global_tid, + void *data, size_t size); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_global_thread_num(ident_t *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_global_num_threads(ident_t *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_bound_thread_num(ident_t *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_ok_to_fork(ident_t *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_fork_call(ident_t *, kmp_int32 nargs, + kmpc_micro microtask, ...); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_serialized_parallel(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_serialized_parallel(ident_t *, kmp_int32 global_tid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_flush(ident_t *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_barrier(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_master(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_master(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_ordered(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_ordered(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_critical(ident_t *, kmp_int32 global_tid, + kmp_critical_name *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_critical(ident_t *, kmp_int32 global_tid, + kmp_critical_name *); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_critical_with_hint(ident_t *, kmp_int32 global_tid, + kmp_critical_name *, uint32_t hint); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_barrier_master(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_barrier_master(ident_t *, kmp_int32 global_tid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_barrier_master_nowait(ident_t *, + kmp_int32 global_tid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_single(ident_t *, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_single(ident_t *, kmp_int32 global_tid); + +KMP_EXPORT void KMPC_FOR_STATIC_INIT(ident_t *loc, kmp_int32 global_tid, + kmp_int32 schedtype, kmp_int32 *plastiter, + kmp_int *plower, kmp_int *pupper, + kmp_int *pstride, kmp_int incr, + kmp_int chunk); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_for_static_fini(ident_t *loc, kmp_int32 global_tid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_copyprivate(ident_t *loc, kmp_int32 global_tid, + size_t cpy_size, void *cpy_data, + void (*cpy_func)(void *, void *), + kmp_int32 didit); + +extern void KMPC_SET_NUM_THREADS(int arg); +extern void KMPC_SET_DYNAMIC(int flag); +extern void KMPC_SET_NESTED(int flag); + +/* OMP 3.0 tasking interface routines */ +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *new_task); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_task_t *__kmpc_omp_task_alloc(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 flags, + size_t sizeof_kmp_task_t, + size_t sizeof_shareds, + kmp_routine_entry_t task_entry); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_task_t *__kmpc_omp_target_task_alloc( + ident_t *loc_ref, kmp_int32 gtid, kmp_int32 flags, size_t sizeof_kmp_task_t, + size_t sizeof_shareds, kmp_routine_entry_t task_entry, kmp_int64 device_id); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_omp_task_begin_if0(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_omp_task_complete_if0(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_omp_task_parts(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *new_task); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_omp_taskwait(ident_t *loc_ref, kmp_int32 gtid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_omp_taskyield(ident_t *loc_ref, kmp_int32 gtid, + int end_part); + +#if TASK_UNUSED +KMP_EXTERNAL_INTERFACE +void __kmpc_omp_task_begin(ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *task); +KMP_EXTERNAL_INTERFACE +void __kmpc_omp_task_complete(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task); +#endif // TASK_UNUSED + +/* ------------------------------------------------------------------------ */ + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_taskgroup(ident_t *loc, int gtid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_taskgroup(ident_t *loc, int gtid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT 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); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT 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); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_cancel(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_cancellationpoint(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 cncl_kind); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_cancel_barrier(ident_t *loc_ref, kmp_int32 gtid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_proxy_task_completed(kmp_int32 gtid, kmp_task_t *ptask); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_proxy_task_completed_ooo(kmp_task_t *ptask); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_taskloop(ident_t *loc, kmp_int32 gtid, kmp_task_t *task, + kmp_int32 if_val, kmp_uint64 *lb, + kmp_uint64 *ub, kmp_int64 st, kmp_int32 nogroup, + kmp_int32 sched, kmp_uint64 grainsize, + void *task_dup); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_task_reduction_init(int gtid, int num_data, void *data); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_taskred_init(int gtid, int num_data, void *data); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_task_reduction_get_th_data(int gtid, void *tg, void *d); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_task_reduction_modifier_init(ident_t *loc, int gtid, + int is_ws, int num, + void *data); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_taskred_modifier_init(ident_t *loc, int gtid, int is_ws, + int num, void *data); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_task_reduction_modifier_fini(ident_t *loc, int gtid, + int is_ws); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_omp_reg_task_with_affinity( + ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 naffins, + kmp_task_affinity_info_t *affin_list); + +/* Lock interface routines (fast versions with gtid passed in) */ +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_init_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_init_nest_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_destroy_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_destroy_nest_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_set_lock(ident_t *loc, kmp_int32 gtid, void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_set_nest_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_unset_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_unset_nest_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, + void **user_lock); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_init_lock_with_hint(ident_t *loc, kmp_int32 gtid, + void **user_lock, uintptr_t hint); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_init_nest_lock_with_hint(ident_t *loc, kmp_int32 gtid, + void **user_lock, + uintptr_t hint); + +/* Interface to fast scalable reduce methods routines */ + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_reduce_nowait( + ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, + void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), + kmp_critical_name *lck); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_reduce_nowait(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *lck); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_reduce( + ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, + void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), + kmp_critical_name *lck); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_end_reduce(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *lck); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_uint64 __kmpc_get_taskid(); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_uint64 __kmpc_get_parent_taskid(); + +// C++ port +// missing 'extern "C"' declarations + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT kmp_int32 __kmpc_in_parallel(ident_t *loc); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_pop_num_threads(ident_t *loc, kmp_int32 global_tid); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_push_num_threads(ident_t *loc, kmp_int32 global_tid, + kmp_int32 num_threads); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_push_proc_bind(ident_t *loc, kmp_int32 global_tid, + int proc_bind); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_push_num_teams(ident_t *loc, kmp_int32 global_tid, + kmp_int32 num_teams, + kmp_int32 num_threads); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, + kmpc_micro microtask, ...); +struct kmp_dim { // loop bounds info casted to kmp_int64 + kmp_int64 lo; // lower + kmp_int64 up; // upper + kmp_int64 st; // stride +}; +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_doacross_init(ident_t *loc, kmp_int32 gtid, + kmp_int32 num_dims, + const struct kmp_dim *dims); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_doacross_wait(ident_t *loc, kmp_int32 gtid, + const kmp_int64 *vec); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_doacross_post(ident_t *loc, kmp_int32 gtid, + const kmp_int64 *vec); +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void __kmpc_doacross_fini(ident_t *loc, kmp_int32 gtid); + +KMP_EXTERNAL_INTERFACE +KMP_EXPORT void *__kmpc_threadprivate_cached(ident_t *loc, kmp_int32 global_tid, + void *data, size_t size, + void ***cache); + +KMP_EXTERNAL_INTERFACE +extern int __kmpc_get_target_offload(); + +KMP_EXTERNAL_INTERFACE +extern int __kmpc_pause_resource(kmp_pause_status_t level); + +#ifdef __cplusplus +} +#endif Index: openmp/runtime/src/kmp_csupport.cpp =================================================================== --- openmp/runtime/src/kmp_csupport.cpp +++ openmp/runtime/src/kmp_csupport.cpp @@ -480,7 +480,7 @@ Leave a serialized parallel construct. */ -void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { +void __kmp_aux_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { kmp_internal_control_t *top; kmp_info_t *this_thr; kmp_team_t *serial_team; @@ -621,6 +621,9 @@ : ompt_state_work_parallel); #endif } +void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { + __kmp_aux_end_serialized_parallel(loc, global_tid); +} /*! @ingroup SYNCHRONIZATION @@ -690,10 +693,9 @@ Execute a barrier. */ -void __kmpc_barrier(ident_t *loc, kmp_int32 global_tid) { +void __kmp_aux_barrier(ident_t *loc, kmp_int32 global_tid) { KMP_COUNT_BLOCK(OMP_BARRIER); KC_TRACE(10, ("__kmpc_barrier: called T#%d\n", global_tid)); - __kmp_assert_valid_gtid(global_tid); if (!TCR_4(__kmp_init_parallel)) __kmp_parallel_initialize(); @@ -732,6 +734,11 @@ #endif } +void __kmpc_barrier(ident_t *loc, kmp_int32 global_tid) { + __kmp_assert_valid_gtid(global_tid); + __kmp_aux_barrier(loc, global_tid); +} + /* The BARRIER for a MASTER section is always explicit */ /*! @ingroup WORK_SHARING @@ -827,7 +834,7 @@ Start execution of an ordered construct. */ -void __kmpc_ordered(ident_t *loc, kmp_int32 gtid) { +void __kmp_aux_ordered(ident_t *loc, kmp_int32 gtid) { int cid = 0; kmp_info_t *th; KMP_DEBUG_ASSERT(__kmp_init_serial); @@ -892,6 +899,9 @@ __kmp_itt_ordered_start(gtid); #endif /* USE_ITT_BUILD */ } +void __kmpc_ordered(ident_t *loc, kmp_int32 gtid) { + __kmp_aux_ordered(loc, gtid); +} /*! @ingroup WORK_SHARING @@ -900,7 +910,7 @@ End execution of an ordered construct. */ -void __kmpc_end_ordered(ident_t *loc, kmp_int32 gtid) { +void __kmp_aux_end_ordered(ident_t *loc, kmp_int32 gtid) { int cid = 0; kmp_info_t *th; @@ -930,6 +940,9 @@ } #endif } +void __kmpc_end_ordered(ident_t *loc, kmp_int32 gtid) { + __kmp_aux_end_ordered(loc, gtid); +} #if KMP_USE_DYNAMIC_LOCK @@ -1135,13 +1148,13 @@ Enter code protected by a `critical` construct. This function blocks until the executing thread can enter the critical section. */ -void __kmpc_critical(ident_t *loc, kmp_int32 global_tid, - kmp_critical_name *crit) { +void __kmp_aux_critical(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit) { #if KMP_USE_DYNAMIC_LOCK #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(global_tid); #endif // OMPT_SUPPORT - __kmpc_critical_with_hint(loc, global_tid, crit, omp_lock_hint_none); + __kmp_aux_critical_with_hint(loc, global_tid, crit, omp_lock_hint_none); #else KMP_COUNT_BLOCK(OMP_CRITICAL); #if OMPT_SUPPORT && OMPT_OPTIONAL @@ -1229,6 +1242,11 @@ #endif // KMP_USE_DYNAMIC_LOCK } +void __kmpc_critical(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit) { + __kmp_aux_critical(loc, global_tid, crit); +} + #if KMP_USE_DYNAMIC_LOCK // Converts the given hint to an internal lock implementation @@ -1360,8 +1378,8 @@ thread can enter the critical section unless the hint suggests use of speculative execution and the hardware supports it. */ -void __kmpc_critical_with_hint(ident_t *loc, kmp_int32 global_tid, - kmp_critical_name *crit, uint32_t hint) { +void __kmp_aux_critical_with_hint(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit, uint32_t hint) { KMP_COUNT_BLOCK(OMP_CRITICAL); kmp_user_lock_p lck; #if OMPT_SUPPORT && OMPT_OPTIONAL @@ -1481,6 +1499,11 @@ KA_TRACE(15, ("__kmpc_critical: done T#%d\n", global_tid)); } // __kmpc_critical_with_hint +void __kmpc_critical_with_hint(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit, uint32_t hint) { + __kmp_aux_critical_with_hint(loc, global_tid, crit, hint); +} + #endif // KMP_USE_DYNAMIC_LOCK /*! @@ -1492,8 +1515,8 @@ Leave a critical section, releasing any lock that was held during its execution. */ -void __kmpc_end_critical(ident_t *loc, kmp_int32 global_tid, - kmp_critical_name *crit) { +void __kmp_aux_end_critical(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit) { kmp_user_lock_p lck; KC_TRACE(10, ("__kmpc_end_critical: called T#%d\n", global_tid)); @@ -1579,6 +1602,11 @@ KA_TRACE(15, ("__kmpc_end_critical: done T#%d\n", global_tid)); } +void __kmpc_end_critical(ident_t *loc, kmp_int32 global_tid, + kmp_critical_name *crit) { + __kmp_aux_end_critical(loc, global_tid, crit); +} + /*! @ingroup SYNCHRONIZATION @param loc source location information @@ -3864,8 +3892,8 @@ Expect compiler send us inclusive bounds, e.g. for(i=2;i<9;i+=2) lo=2, up=8, st=2. */ -void __kmpc_doacross_init(ident_t *loc, int gtid, int num_dims, - const struct kmp_dim *dims) { +void __kmp_aux_doacross_init(ident_t *loc, int gtid, int num_dims, + const struct kmp_dim *dims) { __kmp_assert_valid_gtid(gtid); int j, idx; kmp_int64 last, trace_count; @@ -3984,8 +4012,12 @@ // touch shared buffer on each iteration KA_TRACE(20, ("__kmpc_doacross_init() exit: T#%d\n", gtid)); } +void __kmpc_doacross_init(ident_t *loc, int gtid, int num_dims, + const struct kmp_dim *dims) { + __kmp_aux_doacross_init(loc, gtid, num_dims, dims); +} -void __kmpc_doacross_wait(ident_t *loc, int gtid, const kmp_int64 *vec) { +void __kmp_aux_doacross_wait(ident_t *loc, int gtid, const kmp_int64 *vec) { __kmp_assert_valid_gtid(gtid); kmp_int32 shft, num_dims, i; kmp_uint32 flag; @@ -4096,7 +4128,11 @@ gtid, (iter_number << 5) + shft)); } -void __kmpc_doacross_post(ident_t *loc, int gtid, const kmp_int64 *vec) { +void __kmpc_doacross_wait(ident_t *loc, int gtid, const kmp_int64 *vec) { + __kmp_aux_doacross_wait(loc, gtid, vec); +} + +void __kmp_aux_doacross_post(ident_t *loc, int gtid, const kmp_int64 *vec) { __kmp_assert_valid_gtid(gtid); kmp_int32 shft, num_dims, i; kmp_uint32 flag; @@ -4168,7 +4204,11 @@ (iter_number << 5) + shft)); } -void __kmpc_doacross_fini(ident_t *loc, int gtid) { +void __kmpc_doacross_post(ident_t *loc, int gtid, const kmp_int64 *vec) { + __kmp_aux_doacross_post(loc, gtid, vec); +} + +void __kmp_aux_doacross_fini(ident_t *loc, int gtid) { __kmp_assert_valid_gtid(gtid); kmp_int32 num_done; kmp_info_t *th = __kmp_threads[gtid]; @@ -4202,6 +4242,9 @@ pr_buf->th_doacross_info = NULL; KA_TRACE(20, ("__kmpc_doacross_fini() exit: T#%d\n", gtid)); } +void __kmpc_doacross_fini(ident_t *loc, int gtid) { + __kmp_aux_doacross_fini(loc, gtid); +} /* omp_alloc/omp_calloc/omp_free only defined for C/C++, not for Fortran */ void *omp_alloc(size_t size, omp_allocator_handle_t allocator) { Index: openmp/runtime/src/kmp_dispatch.cpp =================================================================== --- openmp/runtime/src/kmp_dispatch.cpp +++ openmp/runtime/src/kmp_dispatch.cpp @@ -2635,6 +2635,47 @@ __kmp_dispatch_finish_chunk(gtid, loc); } +int __kmp_aux_dispatch_next_4(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last, + kmp_int32 *p_lb, kmp_int32 *p_ub, + kmp_int32 *p_st) { + return __kmp_dispatch_next(loc, gtid, p_last, p_lb, p_ub, p_st +#if OMPT_SUPPORT && OMPT_OPTIONAL + , + OMPT_LOAD_RETURN_ADDRESS(gtid) +#endif + ); +} +int __kmp_aux_dispatch_next_4u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last, + kmp_uint32 *p_lb, kmp_uint32 *p_ub, + kmp_int32 *p_st) { + return __kmp_dispatch_next(loc, gtid, p_last, p_lb, p_ub, p_st +#if OMPT_SUPPORT && OMPT_OPTIONAL + , + OMPT_LOAD_RETURN_ADDRESS(gtid) +#endif + ); +} +int __kmp_aux_dispatch_next_8(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last, + kmp_int64 *p_lb, kmp_int64 *p_ub, + kmp_int64 *p_st) { + return __kmp_dispatch_next(loc, gtid, p_last, p_lb, p_ub, p_st +#if OMPT_SUPPORT && OMPT_OPTIONAL + , + OMPT_LOAD_RETURN_ADDRESS(gtid) +#endif + ); +} +int __kmp_aux_dispatch_next_8u(ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last, + kmp_uint64 *p_lb, kmp_uint64 *p_ub, + kmp_int64 *p_st) { + return __kmp_dispatch_next(loc, gtid, p_last, p_lb, p_ub, p_st +#if OMPT_SUPPORT && OMPT_OPTIONAL + , + OMPT_LOAD_RETURN_ADDRESS(gtid) +#endif + ); +} + #endif /* KMP_GOMP_COMPAT */ /* ------------------------------------------------------------------------ */ Index: openmp/runtime/src/kmp_gsupport.cpp =================================================================== --- openmp/runtime/src/kmp_gsupport.cpp +++ openmp/runtime/src/kmp_gsupport.cpp @@ -105,7 +105,7 @@ } OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_barrier(&loc, gtid); + __kmp_aux_barrier(&loc, gtid); #if OMPT_SUPPORT && OMPT_OPTIONAL if (ompt_enabled.enabled) { ompt_frame->enter_frame = ompt_data_none; @@ -131,7 +131,7 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_critical(&loc, gtid, __kmp_unnamed_critical_addr); + __kmp_aux_critical(&loc, gtid, __kmp_unnamed_critical_addr); } void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_CRITICAL_END)(void) { @@ -141,21 +141,21 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_end_critical(&loc, gtid, __kmp_unnamed_critical_addr); + __kmp_aux_end_critical(&loc, gtid, __kmp_unnamed_critical_addr); } void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_CRITICAL_NAME_START)(void **pptr) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_critical_name_start"); KA_TRACE(20, ("GOMP_critical_name_start: T#%d\n", gtid)); - __kmpc_critical(&loc, gtid, (kmp_critical_name *)pptr); + __kmp_aux_critical(&loc, gtid, (kmp_critical_name *)pptr); } void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_CRITICAL_NAME_END)(void **pptr) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_critical_name_end"); KA_TRACE(20, ("GOMP_critical_name_end: T#%d\n", gtid)); - __kmpc_end_critical(&loc, gtid, (kmp_critical_name *)pptr); + __kmp_aux_end_critical(&loc, gtid, (kmp_critical_name *)pptr); } // The Gnu codegen tries to use locked operations to perform atomic updates @@ -310,7 +310,7 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_ordered(&loc, gtid); + __kmp_aux_ordered(&loc, gtid); } void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_ORDERED_END)(void) { @@ -320,7 +320,7 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_end_ordered(&loc, gtid); + __kmp_aux_end_ordered(&loc, gtid); } // Dispatch macro defs @@ -331,16 +331,16 @@ #if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS #define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4 #define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4 -#define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4 +#define KMP_DISPATCH_NEXT __kmp_aux_dispatch_next_4 #else #define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_8 #define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_8 -#define KMP_DISPATCH_NEXT __kmpc_dispatch_next_8 +#define KMP_DISPATCH_NEXT __kmp_aux_dispatch_next_8 #endif /* KMP_ARCH_X86 */ #define KMP_DISPATCH_INIT_ULL __kmp_aux_dispatch_init_8u #define KMP_DISPATCH_FINI_CHUNK_ULL __kmp_aux_dispatch_fini_chunk_8u -#define KMP_DISPATCH_NEXT_ULL __kmpc_dispatch_next_8u +#define KMP_DISPATCH_NEXT_ULL __kmp_aux_dispatch_next_8u // The parallel construct @@ -642,7 +642,7 @@ #define KMP_DOACROSS_FINI(status, gtid) \ if (!status && __kmp_threads[gtid]->th.th_dispatch->th_doacross_flags) { \ - __kmpc_doacross_fini(NULL, gtid); \ + __kmp_aux_doacross_fini(NULL, gtid); \ } #define LOOP_NEXT(func, fini_code) \ @@ -728,7 +728,7 @@ dims[i].up = counts[i] - 1; \ dims[i].st = 1; \ } \ - __kmpc_doacross_init(&loc, gtid, (int)ncounts, dims); \ + __kmp_aux_doacross_init(&loc, gtid, (int)ncounts, dims); \ lb = 0; \ ub = counts[0]; \ str = 1; \ @@ -775,7 +775,7 @@ dims[i].up = counts[i] - 1; \ dims[i].st = 1; \ } \ - __kmpc_doacross_init(&loc, gtid, (int)ncounts, dims); \ + __kmp_aux_doacross_init(&loc, gtid, (int)ncounts, dims); \ lb = 0; \ ub = counts[0]; \ str = 1; \ @@ -1018,7 +1018,7 @@ dims[i].up = counts[i] - 1; \ dims[i].st = 1; \ } \ - __kmpc_doacross_init(&loc, gtid, (int)ncounts, dims); \ + __kmp_aux_doacross_init(&loc, gtid, (int)ncounts, dims); \ lb = 0; \ ub = counts[0]; \ str = 1; \ @@ -1067,7 +1067,7 @@ dims[i].up = counts[i] - 1; \ dims[i].st = 1; \ } \ - __kmpc_doacross_init(&loc, gtid, (int)ncounts, dims); \ + __kmp_aux_doacross_init(&loc, gtid, (int)ncounts, dims); \ lb = 0; \ ub = counts[0]; \ str = 1; \ @@ -1245,9 +1245,9 @@ kmp_depend_info_t dep_list[ndeps]; for (kmp_int32 i = 0; i < ndeps; i++) dep_list[i] = gomp_depends.get_kmp_depend(i); - __kmpc_omp_task_with_deps(&loc, gtid, task, ndeps, dep_list, 0, NULL); + __kmp_aux_omp_task_with_deps(&loc, gtid, task, ndeps, dep_list, 0, NULL); } else { - __kmpc_omp_task(&loc, gtid, task); + __kmp_aux_omp_task(&loc, gtid, task); } } else { #if OMPT_SUPPORT @@ -1272,12 +1272,26 @@ kmp_depend_info_t dep_list[ndeps]; for (kmp_int32 i = 0; i < ndeps; i++) dep_list[i] = gomp_depends.get_kmp_depend(i); - __kmpc_omp_wait_deps(&loc, gtid, ndeps, dep_list, 0, NULL); + __kmp_aux_omp_wait_deps(&loc, gtid, ndeps, dep_list, 0, NULL); } - __kmpc_omp_task_begin_if0(&loc, gtid, task); +#if OMPT_SUPPORT + if (UNLIKELY(ompt_enabled.enabled)) { + __kmp_omp_task_begin_if0_ompt(&loc, gtid, task, OMPT_GET_FRAME_ADDRESS(1), + OMPT_GET_FRAME_ADDRESS(0), + OMPT_GET_RETURN_ADDRESS(0)); + } else +#endif + __kmp_omp_task_begin_if0_template(&loc, gtid, task, NULL, NULL, + NULL); func(data); - __kmpc_omp_task_complete_if0(&loc, gtid, task); +#if OMPT_SUPPORT + if (UNLIKELY(ompt_enabled.enabled)) { + __kmp_omp_task_complete_if0_ompt(&loc, gtid, task); + return; + } +#endif + __kmp_omp_task_complete_if0_template(&loc, gtid, task); #if OMPT_SUPPORT if (ompt_enabled.enabled) { @@ -1305,7 +1319,13 @@ KA_TRACE(20, ("GOMP_taskwait: T#%d\n", gtid)); - __kmpc_omp_taskwait(&loc, gtid); +#if OMPT_SUPPORT && OMPT_OPTIONAL + if (UNLIKELY(ompt_enabled.enabled)) { + __kmp_omp_taskwait_ompt(&loc, gtid, OMPT_GET_FRAME_ADDRESS(0), + OMPT_GET_RETURN_ADDRESS(0)); + } else +#endif + __kmp_omp_taskwait_template(&loc, gtid, NULL, NULL); KA_TRACE(20, ("GOMP_taskwait exit: T#%d\n", gtid)); } @@ -1563,7 +1583,7 @@ OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_taskgroup(&loc, gtid); + __kmp_aux_taskgroup(&loc, gtid); return; } @@ -1577,7 +1597,7 @@ OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_end_taskgroup(&loc, gtid); + __kmp_aux_end_taskgroup(&loc, gtid); return; } @@ -1607,7 +1627,7 @@ MKLOC(loc, "GOMP_cancellation_point"); KA_TRACE(20, ("GOMP_cancellation_point: T#%d which:%d\n", gtid, which)); kmp_int32 cncl_kind = __kmp_gomp_to_omp_cancellation_kind(which); - return __kmpc_cancellationpoint(&loc, gtid, cncl_kind); + return __kmp_aux_cancellationpoint(&loc, gtid, cncl_kind); } // Return true if cancellation should take place, false otherwise @@ -1619,9 +1639,9 @@ kmp_int32 cncl_kind = __kmp_gomp_to_omp_cancellation_kind(which); if (do_cancel == FALSE) { - return __kmpc_cancellationpoint(&loc, gtid, cncl_kind); + return __kmp_aux_cancellationpoint(&loc, gtid, cncl_kind); } else { - return __kmpc_cancel(&loc, gtid, cncl_kind); + return __kmp_aux_cancel(&loc, gtid, cncl_kind); } } @@ -1774,9 +1794,9 @@ loop_bounds = (T *)task->shareds; loop_bounds[0] = start; loop_bounds[1] = end + (up ? -1 : 1); - __kmpc_taskloop(&loc, gtid, task, if_val, (kmp_uint64 *)&(loop_bounds[0]), - (kmp_uint64 *)&(loop_bounds[1]), (kmp_int64)step, nogroup, - sched, (kmp_uint64)num_tasks, (void *)task_dup); + __kmp_aux_taskloop(&loc, gtid, task, if_val, (kmp_uint64 *)&(loop_bounds[0]), + (kmp_uint64 *)&(loop_bounds[1]), (kmp_int64)step, nogroup, + sched, (kmp_uint64)num_tasks, (void *)task_dup); } // 4 byte version of GOMP_doacross_post @@ -1795,7 +1815,7 @@ for (kmp_int64 i = 0; i < num_dims; ++i) { vec[i] = (kmp_int64)count[i]; } - __kmpc_doacross_post(&loc, gtid, vec); + __kmp_aux_doacross_post(&loc, gtid, vec); __kmp_thread_free(th, vec); } @@ -1805,7 +1825,7 @@ template <> void __kmp_GOMP_doacross_post(long *count) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_doacross_post"); - __kmpc_doacross_post(&loc, gtid, RCAST(kmp_int64 *, count)); + __kmp_aux_doacross_post(&loc, gtid, RCAST(kmp_int64 *, count)); } template void __kmp_GOMP_doacross_wait(T first, va_list args) { @@ -1820,7 +1840,7 @@ T item = va_arg(args, T); vec[i] = (kmp_int64)item; } - __kmpc_doacross_wait(&loc, gtid, vec); + __kmp_aux_doacross_wait(&loc, gtid, vec); __kmp_thread_free(th, vec); return; } @@ -1862,7 +1882,7 @@ unsigned long long *count) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_doacross_ull_post"); - __kmpc_doacross_post(&loc, gtid, RCAST(kmp_int64 *, count)); + __kmp_aux_doacross_post(&loc, gtid, RCAST(kmp_int64 *, count)); } void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_DOACROSS_ULL_WAIT)( @@ -1904,7 +1924,7 @@ #if OMPT_SUPPORT OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_omp_wait_deps(&loc, gtid, ndeps, dep_list, 0, NULL); + __kmp_aux_omp_wait_deps(&loc, gtid, ndeps, dep_list, 0, NULL); KA_TRACE(20, ("GOMP_taskwait_depend exit: T#%d\n", gtid)); } Index: openmp/runtime/src/kmp_os.h =================================================================== --- openmp/runtime/src/kmp_os.h +++ openmp/runtime/src/kmp_os.h @@ -354,6 +354,23 @@ #define KMP_ATTRIBUTE_TARGET_RTM /* Nothing */ #endif +#if __cplusplus > 201402L && __has_cpp_attribute(deprecated) +#define KMP_EXTERNAL_INTERFACE \ + [[deprecated("Internal use of external __kmpc_ compiler interface is " \ + "deprecated, use __kmp_aux_ function instead.")]] +#elif __cplusplus > 201402L && __has_cpp_attribute(clang::deprecated) +#define KMP_EXTERNAL_INTERFACE \ + [[deprecated("Internal use of external __kmpc_ compiler interface is " \ + "deprecated, use __kmp_aux_ function instead.")]] +#elif __has_attribute(deprecated) || __GNUC__ >= 7 +#define KMP_EXTERNAL_INTERFACE \ + __attribute__( \ + (deprecated("Internal use of external __kmpc_ compiler interface is " \ + "deprecated, use __kmp_aux_ function instead."))) +#else +#define KMP_EXTERNAL_INTERFACE +#endif + // Define attribute that indicates a function does not return #if __cplusplus >= 201103L #define KMP_NORETURN [[noreturn]] Index: openmp/runtime/src/kmp_runtime.cpp =================================================================== --- openmp/runtime/src/kmp_runtime.cpp +++ openmp/runtime/src/kmp_runtime.cpp @@ -1512,7 +1512,7 @@ // Increment our nested depth levels, but not increase the serialization if (parent_team == master_th->th.th_serial_team) { // AC: we are in serialized parallel - __kmpc_serialized_parallel(loc, gtid); + __kmp_serialized_parallel(loc, gtid); KMP_DEBUG_ASSERT(parent_team->t.t_serialized > 1); if (call_context == fork_context_gnu) { @@ -1742,7 +1742,7 @@ KA_TRACE(20, ("__kmp_fork_call: T#%d serializing parallel region\n", gtid)); - __kmpc_serialized_parallel(loc, gtid); + __kmp_serialized_parallel(loc, gtid); if (call_context == fork_context_intel) { /* TODO this sucks, use the compiler itself to pass args! :) */ @@ -2349,7 +2349,7 @@ team->t.t_serialized++; } } - __kmpc_end_serialized_parallel(loc, gtid); + __kmp_aux_end_serialized_parallel(loc, gtid); #if OMPT_SUPPORT if (ompt_enabled.enabled) { Index: openmp/runtime/src/kmp_taskdeps.cpp =================================================================== --- openmp/runtime/src/kmp_taskdeps.cpp +++ openmp/runtime/src/kmp_taskdeps.cpp @@ -505,11 +505,11 @@ Schedule a non-thread-switchable task with dependences for execution */ -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) { +kmp_int32 __kmp_aux_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) { kmp_taskdata_t *new_taskdata = KMP_TASK_TO_TASKDATA(new_task); KA_TRACE(10, ("__kmpc_omp_task_with_deps(enter): T#%d loc=%p task=%p\n", gtid, @@ -637,6 +637,15 @@ return ret; } +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) { + return __kmp_aux_omp_task_with_deps(loc_ref, gtid, new_task, ndeps, dep_list, + ndeps_noalias, noalias_dep_list); +} + #if OMPT_SUPPORT void __ompt_taskwait_dep_finish(kmp_taskdata_t *current_task, ompt_data_t *taskwait_task_data) { @@ -665,9 +674,10 @@ Blocks the current task until all specifies dependencies have been fulfilled. */ -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 __kmp_aux_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) { KA_TRACE(10, ("__kmpc_omp_wait_deps(enter): T#%d loc=%p\n", gtid, loc_ref)); if (ndeps == 0 && ndeps_noalias == 0) { @@ -800,3 +810,10 @@ KA_TRACE(10, ("__kmpc_omp_wait_deps(exit): T#%d finished waiting : loc=%p\n", gtid, loc_ref)); } + +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) { + return __kmp_aux_omp_wait_deps(loc_ref, gtid, ndeps, dep_list, ndeps_noalias, + noalias_dep_list); +} Index: openmp/runtime/src/kmp_tasking.cpp =================================================================== --- openmp/runtime/src/kmp_tasking.cpp +++ openmp/runtime/src/kmp_tasking.cpp @@ -595,10 +595,11 @@ #endif template -static void __kmpc_omp_task_begin_if0_template(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task, - void *frame_address, - void *return_address) { +void __kmp_omp_task_begin_if0_template(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task, + void *enter_frame_address, + void *exit_frame_address, + void *return_address) { kmp_taskdata_t *taskdata = KMP_TASK_TO_TASKDATA(task); kmp_taskdata_t *current_task = __kmp_threads[gtid]->th.th_current_task; @@ -622,12 +623,14 @@ #if OMPT_SUPPORT if (ompt) { - if (current_task->ompt_task_info.frame.enter_frame.ptr == NULL) { - current_task->ompt_task_info.frame.enter_frame.ptr = - taskdata->ompt_task_info.frame.exit_frame.ptr = frame_address; - current_task->ompt_task_info.frame.enter_frame_flags = - taskdata->ompt_task_info.frame.exit_frame_flags = ompt_frame_application | ompt_frame_framepointer; - } + current_task->ompt_task_info.frame.enter_frame.ptr = enter_frame_address; + taskdata->ompt_task_info.frame.exit_frame.ptr = exit_frame_address; + current_task->ompt_task_info.frame.enter_frame_flags = + ompt_frame_application | ompt_frame_framepointer; + taskdata->ompt_task_info.frame.exit_frame_flags = + ((exit_frame_address == enter_frame_address) ? ompt_frame_application + : ompt_frame_runtime) | + ompt_frame_framepointer; if (ompt_enabled.ompt_callback_task_create) { ompt_task_info_t *parent_info = &(current_task->ompt_task_info); ompt_callbacks.ompt_callback(ompt_callback_task_create)( @@ -646,12 +649,13 @@ #if OMPT_SUPPORT OMPT_NOINLINE -static void __kmpc_omp_task_begin_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task, - void *frame_address, - void *return_address) { - __kmpc_omp_task_begin_if0_template(loc_ref, gtid, task, frame_address, - return_address); +void __kmp_omp_task_begin_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task, void *enter_frame_address, + void *exit_frame_address, + void *return_address) { + __kmp_omp_task_begin_if0_template(loc_ref, gtid, task, + enter_frame_address, + exit_frame_address, return_address); } #endif // OMPT_SUPPORT @@ -666,13 +670,14 @@ #if OMPT_SUPPORT if (UNLIKELY(ompt_enabled.enabled)) { OMPT_STORE_RETURN_ADDRESS(gtid); - __kmpc_omp_task_begin_if0_ompt(loc_ref, gtid, task, - OMPT_GET_FRAME_ADDRESS(1), - OMPT_LOAD_RETURN_ADDRESS(gtid)); + __kmp_omp_task_begin_if0_ompt( + loc_ref, gtid, task, OMPT_GET_FRAME_ADDRESS(1), + OMPT_GET_FRAME_ADDRESS(1), OMPT_LOAD_RETURN_ADDRESS(gtid)); return; } #endif - __kmpc_omp_task_begin_if0_template(loc_ref, gtid, task, NULL, NULL); + __kmp_omp_task_begin_if0_template(loc_ref, gtid, task, NULL, NULL, + NULL); } #ifdef TASK_UNUSED @@ -968,9 +973,8 @@ } template -static void __kmpc_omp_task_complete_if0_template(ident_t *loc_ref, - kmp_int32 gtid, - kmp_task_t *task) { +void __kmp_omp_task_complete_if0_template(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task) { KA_TRACE(10, ("__kmpc_omp_task_complete_if0(enter): T#%d loc=%p task=%p\n", gtid, loc_ref, KMP_TASK_TO_TASKDATA(task))); __kmp_assert_valid_gtid(gtid); @@ -994,9 +998,9 @@ #if OMPT_SUPPORT OMPT_NOINLINE -void __kmpc_omp_task_complete_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *task) { - __kmpc_omp_task_complete_if0_template(loc_ref, gtid, task); +void __kmp_omp_task_complete_if0_ompt(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *task) { + __kmp_omp_task_complete_if0_template(loc_ref, gtid, task); } #endif // OMPT_SUPPORT @@ -1009,11 +1013,11 @@ kmp_task_t *task) { #if OMPT_SUPPORT if (UNLIKELY(ompt_enabled.enabled)) { - __kmpc_omp_task_complete_if0_ompt(loc_ref, gtid, task); + __kmp_omp_task_complete_if0_ompt(loc_ref, gtid, task); return; } #endif - __kmpc_omp_task_complete_if0_template(loc_ref, gtid, task); + __kmp_omp_task_complete_if0_template(loc_ref, gtid, task); } #ifdef TASK_UNUSED @@ -1695,8 +1699,8 @@ // be resumed later. // TASK_CURRENT_QUEUED (1) if suspended and queued the current task to be // resumed later. -kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid, - kmp_task_t *new_task) { +kmp_int32 __kmp_aux_omp_task(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *new_task) { kmp_int32 res; KMP_SET_THREAD_STATE_BLOCK(EXPLICIT_TASK); @@ -1748,6 +1752,10 @@ #endif return res; } +kmp_int32 __kmpc_omp_task(ident_t *loc_ref, kmp_int32 gtid, + kmp_task_t *new_task) { + return __kmp_aux_omp_task(loc_ref, gtid, new_task); +} // __kmp_omp_taskloop_task: Wrapper around __kmp_omp_task to schedule // a taskloop task with the correct OMPT return address @@ -1805,9 +1813,9 @@ } template -static kmp_int32 __kmpc_omp_taskwait_template(ident_t *loc_ref, kmp_int32 gtid, - void *frame_address, - void *return_address) { +kmp_int32 __kmp_omp_taskwait_template(ident_t *loc_ref, kmp_int32 gtid, + void *frame_address, + void *return_address) { kmp_taskdata_t *taskdata; kmp_info_t *thread; int thread_finished = FALSE; @@ -1913,11 +1921,10 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_NOINLINE -static kmp_int32 __kmpc_omp_taskwait_ompt(ident_t *loc_ref, kmp_int32 gtid, - void *frame_address, - void *return_address) { - return __kmpc_omp_taskwait_template(loc_ref, gtid, frame_address, - return_address); +kmp_int32 __kmp_omp_taskwait_ompt(ident_t *loc_ref, kmp_int32 gtid, + void *frame_address, void *return_address) { + return __kmp_omp_taskwait_template(loc_ref, gtid, frame_address, + return_address); } #endif // OMPT_SUPPORT && OMPT_OPTIONAL @@ -1927,11 +1934,11 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL if (UNLIKELY(ompt_enabled.enabled)) { OMPT_STORE_RETURN_ADDRESS(gtid); - return __kmpc_omp_taskwait_ompt(loc_ref, gtid, OMPT_GET_FRAME_ADDRESS(0), - OMPT_LOAD_RETURN_ADDRESS(gtid)); + return __kmp_omp_taskwait_ompt(loc_ref, gtid, OMPT_GET_FRAME_ADDRESS(0), + OMPT_GET_RETURN_ADDRESS(0)); } #endif - return __kmpc_omp_taskwait_template(loc_ref, gtid, NULL, NULL); + return __kmp_omp_taskwait_template(loc_ref, gtid, NULL, NULL); } // __kmpc_omp_taskyield: switch to a different task @@ -2326,7 +2333,7 @@ __kmp_assert_valid_gtid(gtid); kmp_info_t *thr = __kmp_threads[gtid]; kmp_int32 nth = thr->th.th_team_nproc; - __kmpc_taskgroup(loc, gtid); // form new taskgroup first + __kmp_aux_taskgroup(loc, gtid); // form new taskgroup first if (nth == 1) { KA_TRACE(10, ("__kmpc_reduction_modifier_init: T#%d, tg %p, exiting nth=1\n", @@ -2414,11 +2421,11 @@ Finalize task reduction for a parallel or worksharing. */ void __kmpc_task_reduction_modifier_fini(ident_t *loc, int gtid, int is_ws) { - __kmpc_end_taskgroup(loc, gtid); + __kmp_aux_end_taskgroup(loc, gtid); } // __kmpc_taskgroup: Start a new taskgroup -void __kmpc_taskgroup(ident_t *loc, int gtid) { +void __kmp_aux_taskgroup(ident_t *loc, int gtid) { __kmp_assert_valid_gtid(gtid); kmp_info_t *thread = __kmp_threads[gtid]; kmp_taskdata_t *taskdata = thread->th.th_current_task; @@ -2448,10 +2455,13 @@ } #endif } +void __kmpc_taskgroup(ident_t *loc, int gtid) { + __kmp_aux_taskgroup(loc, gtid); +} // __kmpc_end_taskgroup: Wait until all tasks generated by the current task // and its descendants are complete -void __kmpc_end_taskgroup(ident_t *loc, int gtid) { +void __kmp_aux_end_taskgroup(ident_t *loc, int gtid) { __kmp_assert_valid_gtid(gtid); kmp_info_t *thread = __kmp_threads[gtid]; kmp_taskdata_t *taskdata = thread->th.th_current_task; @@ -2592,6 +2602,9 @@ } #endif } +void __kmpc_end_taskgroup(ident_t *loc, int gtid) { + __kmp_aux_end_taskgroup(loc, gtid); +} // __kmp_remove_my_task: remove a task from my own deque static kmp_task_t *__kmp_remove_my_task(kmp_info_t *thread, kmp_int32 gtid, @@ -4452,9 +4465,10 @@ Execute the taskloop construct. */ -void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t *task, int if_val, - kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int nogroup, - int sched, kmp_uint64 grainsize, void *task_dup) { +void __kmp_aux_taskloop(ident_t *loc, int gtid, kmp_task_t *task, int if_val, + kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, + int nogroup, int sched, kmp_uint64 grainsize, + void *task_dup) { kmp_taskdata_t *taskdata = KMP_TASK_TO_TASKDATA(task); KMP_DEBUG_ASSERT(task != NULL); __kmp_assert_valid_gtid(gtid); @@ -4462,7 +4476,7 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_taskgroup(loc, gtid); + __kmp_aux_taskgroup(loc, gtid); } // ========================================================================= @@ -4599,7 +4613,13 @@ #if OMPT_SUPPORT && OMPT_OPTIONAL OMPT_STORE_RETURN_ADDRESS(gtid); #endif - __kmpc_end_taskgroup(loc, gtid); + __kmp_aux_end_taskgroup(loc, gtid); } KA_TRACE(20, ("__kmpc_taskloop(exit): T#%d\n", gtid)); } +void __kmpc_taskloop(ident_t *loc, int gtid, kmp_task_t *task, int if_val, + kmp_uint64 *lb, kmp_uint64 *ub, kmp_int64 st, int nogroup, + int sched, kmp_uint64 grainsize, void *task_dup) { + __kmp_aux_taskloop(loc, gtid, task, if_val, lb, ub, st, nogroup, sched, + grainsize, task_dup); +}