diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2018-03-20 21:18:17 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2018-03-20 21:18:17 +0000 |
commit | 78f977fcd16e18908a6e32a5da30256d377fbffb (patch) | |
tree | d28eae18be113c6e064f48bcb414590df75c780b | |
parent | 572bfa562ab3f3c5b98e02ba52ad887b4270a89e (diff) | |
download | bcm5719-llvm-78f977fcd16e18908a6e32a5da30256d377fbffb.tar.gz bcm5719-llvm-78f977fcd16e18908a6e32a5da30256d377fbffb.zip |
Read OMP_TARGET_OFFLOAD and provide API to access ICV
Added settings code to read OMP_TARGET_OFFLOAD environment variable. Added
target-offload-var ICV as __kmp_target_offload, set via OMP_TARGET_OFFLOAD,
if available, otherwise defaulting to DEFAULT. Valid values for the ICV are
specified as enum values {0,1,2} for disabled, default, and mandatory. An
internal API access function __kmpc_get_target_offload is provided.
Patch by Terry Wilmarth
Differential Revision: https://reviews.llvm.org/D44577
llvm-svn: 328046
-rw-r--r-- | openmp/runtime/src/dllexports | 1 | ||||
-rw-r--r-- | openmp/runtime/src/kmp.h | 12 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_csupport.cpp | 4 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_global.cpp | 3 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_settings.cpp | 44 |
5 files changed, 64 insertions, 0 deletions
diff --git a/openmp/runtime/src/dllexports b/openmp/runtime/src/dllexports index 32dec094bd3..4fc48f40766 100644 --- a/openmp/runtime/src/dllexports +++ b/openmp/runtime/src/dllexports @@ -403,6 +403,7 @@ kmpc_set_disp_num_buffers 267 %ifdef OMP_45 __kmpc_task_reduction_init 268 __kmpc_task_reduction_get_th_data 269 + __kmpc_get_target_offload 271 %endif %endif diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h index c7e2965119d..2ca8500165e 100644 --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -3813,6 +3813,18 @@ KMP_EXPORT void KMPC_CONVENTION kmpc_set_library(int); KMP_EXPORT void KMPC_CONVENTION kmpc_set_defaults(char const *); KMP_EXPORT void KMPC_CONVENTION kmpc_set_disp_num_buffers(int); +#if OMP_50_ENABLED +enum kmp_target_offload_kind { + tgt_disabled = 0, + tgt_default = 1, + tgt_mandatory = 2 +}; +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(); +#endif + #ifdef __cplusplus } #endif diff --git a/openmp/runtime/src/kmp_csupport.cpp b/openmp/runtime/src/kmp_csupport.cpp index 702b65076e1..dbf2f995a78 100644 --- a/openmp/runtime/src/kmp_csupport.cpp +++ b/openmp/runtime/src/kmp_csupport.cpp @@ -4065,4 +4065,8 @@ void __kmpc_doacross_fini(ident_t *loc, int gtid) { } #endif +#if OMP_50_ENABLED +int __kmpc_get_target_offload(void) { return __kmp_target_offload; } +#endif // OMP_50_ENABLED + // end of file // diff --git a/openmp/runtime/src/kmp_global.cpp b/openmp/runtime/src/kmp_global.cpp index ab14ddb1889..3ba0ec9fafe 100644 --- a/openmp/runtime/src/kmp_global.cpp +++ b/openmp/runtime/src/kmp_global.cpp @@ -502,4 +502,7 @@ int _You_must_link_with_Intel_OpenMP_library = 1; int _You_must_link_with_Microsoft_OpenMP_library = 1; #endif +#if OMP_50_ENABLED +kmp_target_offload_kind_t __kmp_target_offload = tgt_default; +#endif // end of file // diff --git a/openmp/runtime/src/kmp_settings.cpp b/openmp/runtime/src/kmp_settings.cpp index 0a05e7c6b75..ee3923cad83 100644 --- a/openmp/runtime/src/kmp_settings.cpp +++ b/openmp/runtime/src/kmp_settings.cpp @@ -1179,6 +1179,46 @@ static void __kmp_stg_print_default_device(kmp_str_buf_t *buffer, } // __kmp_stg_print_default_device #endif +#if OMP_50_ENABLED +// ----------------------------------------------------------------------------- +// OpenMP 5.0: OMP_TARGET_OFFLOAD +static void __kmp_stg_parse_target_offload(char const *name, char const *value, + void *data) { + const char *next = value; + const char *scan = next; + + __kmp_target_offload = tgt_default; + SKIP_WS(next); + if (*next == '\0') + return; + scan = next; + if (__kmp_match_str("MANDATORY", scan, &next)) { + __kmp_target_offload = tgt_mandatory; + } else if (__kmp_match_str("DISABLED", scan, &next)) { + __kmp_target_offload = tgt_disabled; + } else if (__kmp_match_str("DEFAULT", scan, &next)) { + __kmp_target_offload = tgt_default; + } else { + KMP_WARNING(SyntaxErrorUsing, name, "DEFAULT"); + } + +} // __kmp_stg_parse_target_offload + +static void __kmp_stg_print_target_offload(kmp_str_buf_t *buffer, + char const *name, void *data) { + const char *value = NULL; + if (__kmp_target_offload == tgt_default) + value = "DEFAULT"; + else if (__kmp_target_offload == tgt_mandatory) + value = "MANDATORY"; + else if (__kmp_target_offload == tgt_disabled) + value = "DISABLED"; + if (value) { + __kmp_str_buf_print(buffer, " %s=%s\n", name, value); + } +} // __kmp_stg_print_target_offload +#endif + #if OMP_45_ENABLED // ----------------------------------------------------------------------------- // OpenMP 4.5: OMP_MAX_TASK_PRIORITY @@ -4443,6 +4483,10 @@ static kmp_setting_t __kmp_stg_table[] = { {"OMP_DEFAULT_DEVICE", __kmp_stg_parse_default_device, __kmp_stg_print_default_device, NULL, 0, 0}, #endif +#if OMP_50_ENABLED + {"OMP_TARGET_OFFLOAD", __kmp_stg_parse_target_offload, + __kmp_stg_print_target_offload, NULL, 0, 0}, +#endif #if OMP_45_ENABLED {"OMP_MAX_TASK_PRIORITY", __kmp_stg_parse_max_task_priority, __kmp_stg_print_max_task_priority, NULL, 0, 0}, |