Index: runtime/src/dllexports =================================================================== --- runtime/src/dllexports +++ runtime/src/dllexports @@ -494,9 +494,9 @@ omp_get_cancellation 867 kmp_get_cancellation_status 868 omp_is_initial_device 869 + omp_set_default_device 879 + omp_get_default_device 880 %ifdef stub - omp_set_default_device 879 - omp_get_default_device 880 omp_get_num_devices 881 %endif %endif # OMP_40 Index: runtime/src/kmp.h =================================================================== --- runtime/src/kmp.h +++ runtime/src/kmp.h @@ -1091,6 +1091,8 @@ #define KMP_MAX_ACTIVE_LEVELS_LIMIT INT_MAX +#define KMP_MAX_DEFAULT_DEVICE_LIMIT INT_MAX + #define KMP_MAX_TASK_PRIORITY_LIMIT INT_MAX /* Minimum number of threads before switch to TLS gtid (experimentally determined) */ @@ -2055,6 +2057,9 @@ extern kmp_tasking_mode_t __kmp_tasking_mode; /* determines how/when to execute tasks */ extern kmp_int32 __kmp_task_stealing_constraint; +#if OMP_40_ENABLED + extern kmp_int32 __kmp_default_device; // Set via OMP_DEFAULT_DEVICE if specified, defaults to 0 otherwise +#endif #if OMP_45_ENABLED extern kmp_int32 __kmp_max_task_priority; // Set via OMP_MAX_TASK_PRIORITY if specified, defaults to 0 otherwise #endif @@ -2245,6 +2250,7 @@ kmp_taskgroup_t * td_taskgroup; // Each task keeps pointer to its current taskgroup kmp_dephash_t * td_dephash; // Dependencies for children tasks are tracked from here kmp_depnode_t * td_depnode; // Pointer to graph node if this task has dependencies + kmp_int32 td_default_device; // Default device for task #endif #if OMPT_SUPPORT ompt_task_info_t ompt_task_info; Index: runtime/src/kmp_ftn_entry.h =================================================================== --- runtime/src/kmp_ftn_entry.h +++ runtime/src/kmp_ftn_entry.h @@ -904,7 +904,7 @@ #endif } -#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) +#if KMP_MIC || KMP_OS_DARWIN int FTN_STDCALL FTN_GET_DEFAULT_DEVICE( void ) @@ -917,6 +917,24 @@ { } +#else + +int FTN_STDCALL +xexpand(FTN_GET_DEFAULT_DEVICE)( void ) +{ + return __kmp_entry_thread() -> th.th_current_task -> td_default_device; +} + +void FTN_STDCALL +xexpand(FTN_SET_DEFAULT_DEVICE)( int KMP_DEREF arg ) +{ + __kmp_entry_thread() -> th.th_current_task -> td_default_device = KMP_DEREF arg; +} + +#endif // KMP_MIC || KMP_OS_DARWIN + +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + int FTN_STDCALL FTN_GET_NUM_DEVICES( void ) { @@ -1391,6 +1409,8 @@ xaliasify(FTN_GET_NUM_TEAMS, 40); xaliasify(FTN_GET_TEAM_NUM, 40); xaliasify(FTN_GET_CANCELLATION, 40); +xaliasify(FTN_GET_DEFAULT_DEVICE, 40); +xaliasify(FTN_SET_DEFAULT_DEVICE, 40); xaliasify(FTN_IS_INITIAL_DEVICE, 40); #endif /* OMP_40_ENABLED */ @@ -1456,11 +1476,13 @@ #if OMP_40_ENABLED // OMP_4.0 versioned symbols -xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0"); -xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0"); -xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0"); -xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0"); -xversionify(FTN_IS_INITIAL_DEVICE, 40, "OMP_4.0"); +xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0"); +xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0"); +xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0"); +xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0"); +xversionify(FTN_GET_DEFAULT_DEVICE, 40, "OMP_4.0"); +xversionify(FTN_SET_DEFAULT_DEVICE, 40, "OMP_4.0"); +xversionify(FTN_IS_INITIAL_DEVICE, 40, "OMP_4.0"); #endif /* OMP_40_ENABLED */ #if OMP_45_ENABLED Index: runtime/src/kmp_ftn_os.h =================================================================== --- runtime/src/kmp_ftn_os.h +++ runtime/src/kmp_ftn_os.h @@ -103,10 +103,10 @@ #if OMP_40_ENABLED #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) - #define FTN_GET_DEFAULT_DEVICE omp_get_default_device - #define FTN_SET_DEFAULT_DEVICE omp_set_default_device #define FTN_GET_NUM_DEVICES omp_get_num_devices #endif + #define FTN_GET_DEFAULT_DEVICE omp_get_default_device + #define FTN_SET_DEFAULT_DEVICE omp_set_default_device #define FTN_IS_INITIAL_DEVICE omp_is_initial_device #endif @@ -221,10 +221,10 @@ #if OMP_40_ENABLED #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) - #define FTN_GET_DEFAULT_DEVICE omp_get_default_device_ - #define FTN_SET_DEFAULT_DEVICE omp_set_default_device_ #define FTN_GET_NUM_DEVICES omp_get_num_devices_ #endif + #define FTN_GET_DEFAULT_DEVICE omp_get_default_device_ + #define FTN_SET_DEFAULT_DEVICE omp_set_default_device_ #define FTN_IS_INITIAL_DEVICE omp_is_initial_device_ #endif @@ -340,10 +340,10 @@ #if OMP_40_ENABLED #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) - #define FTN_GET_DEFAULT_DEVICE OMP_GET_DEFAULT_DEVICE - #define FTN_SET_DEFAULT_DEVICE OMP_SET_DEFAULT_DEVICE #define FTN_GET_NUM_DEVICES OMP_GET_NUM_DEVICES #endif + #define FTN_GET_DEFAULT_DEVICE OMP_GET_DEFAULT_DEVICE + #define FTN_SET_DEFAULT_DEVICE OMP_SET_DEFAULT_DEVICE #define FTN_IS_INITIAL_DEVICE OMP_IS_INITIAL_DEVICE #endif @@ -459,10 +459,10 @@ #if OMP_40_ENABLED #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) - #define FTN_GET_DEFAULT_DEVICE OMP_GET_DEFAULT_DEVICE_ - #define FTN_SET_DEFAULT_DEVICE OMP_SET_DEFAULT_DEVICE_ #define FTN_GET_NUM_DEVICES OMP_GET_NUM_DEVICES_ #endif + #define FTN_GET_DEFAULT_DEVICE OMP_GET_DEFAULT_DEVICE_ + #define FTN_SET_DEFAULT_DEVICE OMP_SET_DEFAULT_DEVICE_ #define FTN_IS_INITIAL_DEVICE OMP_IS_INITIAL_DEVICE_ #endif Index: runtime/src/kmp_global.c =================================================================== --- runtime/src/kmp_global.c +++ runtime/src/kmp_global.c @@ -262,6 +262,10 @@ int __kmp_place_core_offset = 0; int __kmp_place_num_threads_per_core = 0; +#if OMP_40_ENABLED +kmp_int32 __kmp_default_device = 0; +#endif + kmp_tasking_mode_t __kmp_tasking_mode = tskm_task_teams; #if OMP_45_ENABLED kmp_int32 __kmp_max_task_priority = 0; Index: runtime/src/kmp_settings.c =================================================================== --- runtime/src/kmp_settings.c +++ runtime/src/kmp_settings.c @@ -1182,6 +1182,19 @@ __kmp_stg_print_int( buffer, name, __kmp_dflt_max_active_levels ); } // __kmp_stg_print_max_active_levels +#if OMP_40_ENABLED +// ------------------------------------------------------------------------------------------------- +// OpenMP 4.0: OMP_DEFAULT_DEVICE +// ------------------------------------------------------------------------------------------------- +static void __kmp_stg_parse_default_device(char const *name, char const *value, void *data) { + __kmp_stg_parse_int(name, value, 0, KMP_MAX_DEFAULT_DEVICE_LIMIT, &__kmp_default_device); +} // __kmp_stg_parse_default_device + +static void __kmp_stg_print_default_device(kmp_str_buf_t *buffer, char const *name, void *data) { + __kmp_stg_print_int(buffer, name, __kmp_default_device); +} // __kmp_stg_print_default_device +#endif + #if OMP_45_ENABLED // ------------------------------------------------------------------------------------------------- // OpenMP 4.5: OMP_MAX_TASK_PRIORITY @@ -4677,6 +4690,9 @@ { "KMP_TASKING", __kmp_stg_parse_tasking, __kmp_stg_print_tasking, NULL, 0, 0 }, { "KMP_TASK_STEALING_CONSTRAINT", __kmp_stg_parse_task_stealing, __kmp_stg_print_task_stealing, NULL, 0, 0 }, { "OMP_MAX_ACTIVE_LEVELS", __kmp_stg_parse_max_active_levels, __kmp_stg_print_max_active_levels, NULL, 0, 0 }, +#if OMP_40_ENABLED + { "OMP_DEFAULT_DEVICE", __kmp_stg_parse_default_device, __kmp_stg_print_default_device, 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 }, #endif Index: runtime/src/kmp_tasking.c =================================================================== --- runtime/src/kmp_tasking.c +++ runtime/src/kmp_tasking.c @@ -861,6 +861,7 @@ #if OMP_40_ENABLED task->td_dephash = NULL; task->td_depnode = NULL; + task->td_default_device = __kmp_default_device; #endif if (set_curr_task) { // only do this initialization the first time a thread is created @@ -1060,6 +1061,7 @@ taskdata->td_taskgroup = parent_task->td_taskgroup; // task inherits the taskgroup from the parent task taskdata->td_dephash = NULL; taskdata->td_depnode = NULL; + taskdata->td_default_device = parent_task->td_default_device; #endif // Only need to keep track of child task counts if team parallel and tasking not serialized or if it is a proxy task