From 224f51d879b5060b5a4f57b2774f6f49a5e8951b Mon Sep 17 00:00:00 2001 From: Hansang Bae Date: Fri, 11 Jun 2021 17:35:28 -0500 Subject: [PATCH] [OpenMP] Add interface for 5.1 scope construct The new interface only marks begin/end of a scope construct for corresponding OMPT events, and we can use existing interfaces for reduction operations. Differential Revision: https://reviews.llvm.org/D108062 --- openmp/runtime/src/dllexports | 2 ++ openmp/runtime/src/kmp.h | 4 ++++ openmp/runtime/src/kmp_csupport.cpp | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/openmp/runtime/src/dllexports b/openmp/runtime/src/dllexports index 4737468..dcaa845 100644 --- a/openmp/runtime/src/dllexports +++ b/openmp/runtime/src/dllexports @@ -393,6 +393,8 @@ kmpc_set_disp_num_buffers 267 __kmpc_error 281 __kmpc_masked 282 __kmpc_end_masked 283 + __kmpc_scope 286 + __kmpc_end_scope 287 %endif # User API entry points that have both lower- and upper- case versions for Fortran. diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h index a815ee8..b120a19 100644 --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -4130,6 +4130,10 @@ typedef enum kmp_severity_t { } kmp_severity_t; extern void __kmpc_error(ident_t *loc, int severity, const char *message); +// Support for scope directive +KMP_EXPORT void __kmpc_scope(ident_t *loc, kmp_int32 gtid, void *reserved); +KMP_EXPORT void __kmpc_end_scope(ident_t *loc, kmp_int32 gtid, void *reserved); + #ifdef __cplusplus } #endif diff --git a/openmp/runtime/src/kmp_csupport.cpp b/openmp/runtime/src/kmp_csupport.cpp index 0b5f899..0d33357 100644 --- a/openmp/runtime/src/kmp_csupport.cpp +++ b/openmp/runtime/src/kmp_csupport.cpp @@ -4392,6 +4392,38 @@ void __kmpc_error(ident_t *loc, int severity, const char *message) { __kmp_str_free(&src_loc); } +// Mark begin of scope directive. +void __kmpc_scope(ident_t *loc, kmp_int32 gtid, void *reserved) { +// reserved is for extension of scope directive and not used. +#if OMPT_SUPPORT && OMPT_OPTIONAL + if (ompt_enabled.enabled && ompt_enabled.ompt_callback_work) { + kmp_team_t *team = __kmp_threads[gtid]->th.th_team; + int tid = __kmp_tid_from_gtid(gtid); + ompt_callbacks.ompt_callback(ompt_callback_work)( + ompt_work_scope, ompt_scope_begin, + &(team->t.ompt_team_info.parallel_data), + &(team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_data), 1, + OMPT_GET_RETURN_ADDRESS(0)); + } +#endif // OMPT_SUPPORT && OMPT_OPTIONAL +} + +// Mark end of scope directive +void __kmpc_end_scope(ident_t *loc, kmp_int32 gtid, void *reserved) { +// reserved is for extension of scope directive and not used. +#if OMPT_SUPPORT && OMPT_OPTIONAL + if (ompt_enabled.enabled && ompt_enabled.ompt_callback_work) { + kmp_team_t *team = __kmp_threads[gtid]->th.th_team; + int tid = __kmp_tid_from_gtid(gtid); + ompt_callbacks.ompt_callback(ompt_callback_work)( + ompt_work_scope, ompt_scope_end, + &(team->t.ompt_team_info.parallel_data), + &(team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_data), 1, + OMPT_GET_RETURN_ADDRESS(0)); + } +#endif // OMPT_SUPPORT && OMPT_OPTIONAL +} + #ifdef KMP_USE_VERSION_SYMBOLS // For GOMP compatibility there are two versions of each omp_* API. // One is the plain C symbol and one is the Fortran symbol with an appended -- 2.7.4