https://gcc.gnu.org/g:76d6e2cc4294be9b54f4af9165aaac9a0d26dfa9
commit 76d6e2cc4294be9b54f4af9165aaac9a0d26dfa9 Author: supers1ngular <[email protected]> Date: Thu Sep 10 11:04:35 2026 -0700 libgomp: Revert "libgomp: Runtime USM" This reverts commit 7ad97ed9a70d18f518a2623af3113178fa6f8d79. libgomp/ChangeLog: * env.c (enum gomp_runtime_usm_t): Revert. (parse_rt_usm): Ditto. (initialize_env): Ditto. * libgomp-plugin.h (GOMP_OFFLOAD_CAP_AUTO_USM): Ditto. (GOMP_OFFLOAD_get_dev_caps): Ditto. * libgomp.h (enum gomp_device_num): Ditto. (enum gomp_runtime_usm_t): Ditto. (struct gomp_device_descr): Ditto. * libgomp.texi: Ditto. * plugin/plugin-gcn.c (get_memory_region): Ditto. (process_reverse_offload): Ditto. (gcn_exec): Ditto. (is_apu_with_xnack): Ditto. (GCN_DEVICE): Ditto. (GOMP_OFFLOAD_get_dev_caps): Ditto. * plugin/plugin-nvptx.c (GOMP_OFFLOAD_get_dev_caps): Ditto. * target.c (gomp_init_device): Ditto. (gomp_load_plugin_for_device): Ditto. (gomp_target_init): Ditto. Diff: --- libgomp/env.c | 71 +------------------------------------------ libgomp/libgomp-plugin.h | 2 -- libgomp/libgomp.h | 13 ++------ libgomp/libgomp.texi | 20 ------------ libgomp/plugin/plugin-gcn.c | 56 +++------------------------------- libgomp/plugin/plugin-nvptx.c | 19 ------------ libgomp/target.c | 29 +++--------------- 7 files changed, 11 insertions(+), 199 deletions(-) diff --git a/libgomp/env.c b/libgomp/env.c index 3e5f557c5a29..07de99b48977 100644 --- a/libgomp/env.c +++ b/libgomp/env.c @@ -121,8 +121,6 @@ int gomp_teams_thread_limit_var; bool gomp_display_affinity_var; char *gomp_affinity_format_var = "level %L thread %i affinity %A"; size_t gomp_affinity_format_len; -enum gomp_runtime_usm_t gomp_runtime_usm_var - = GOMP_RUNTIME_USM_DISABLED; char *goacc_device_type; int goacc_device_num; int goacc_default_dims[GOMP_DIM_MAX]; @@ -1059,53 +1057,6 @@ parse_spincount (const char *name, unsigned long long *pvalue) return false; } -static bool -parse_rt_usm (const char *name, enum gomp_runtime_usm_t *val) -{ - char *env, *end; - env = getenv (name); - if (env == NULL) - return false; - end = env; - while (isspace ((unsigned char) *env)) - ++env; - if (*env == '\0') - { - gomp_error ("Invalid value for environment variable %s", name); - return false; - } - enum gomp_runtime_usm_t store_state = GOMP_RUNTIME_USM_DISABLED; - if (strncasecmp (env, "disabled", 8) == 0) - { - store_state = GOMP_RUNTIME_USM_DISABLED; - end += 8; - } - else if (strncasecmp (env, "auto", 4) == 0) - { - store_state = GOMP_RUNTIME_USM_AUTO; - end += 4; - } - else if (strncasecmp (env, "enabled", 7) == 0) - { - store_state = GOMP_RUNTIME_USM_ENABLED; - end += 7; - } - else - { - gomp_error ("Invalid value for environment variable %s", name); - return false; - } - while (isspace ((unsigned char) *end)) - ++end; - if (*end != '\0') - { - gomp_error ("Invalid value for environment variable %s", name); - return false; - } - *val = store_state; - return true; -} - /* Parse a boolean value for environment variable NAME and store the result in VALUE. Return true if one was present and it was successfully parsed. */ @@ -2024,21 +1975,8 @@ omp_display_env (int verbose) fprintf (stderr, " [host] GOMP_SPINCOUNT = '%lu'\n", (unsigned long) gomp_spin_count_var); #endif - fputs (" [device] GOMP_RUNTIME_USM = '", stderr); - switch (gomp_runtime_usm_var) - { - case GOMP_RUNTIME_USM_DISABLED: - fputs ("DISABLED", stderr); - break; - case GOMP_RUNTIME_USM_AUTO: - fputs ("AUTO", stderr); - break; - case GOMP_RUNTIME_USM_ENABLED: - fputs ("ENABLED", stderr); - break; - } - fputs ("'\n", stderr); } + fputs ("OPENMP DISPLAY ENVIRONMENT END\n", stderr); } ialias (omp_display_env) @@ -2518,13 +2456,6 @@ initialize_env (void) if (gomp_throttled_spin_count_var > gomp_spin_count_var) gomp_throttled_spin_count_var = gomp_spin_count_var; - /* If we fail, we currently default to 'disabled', both here and on - initialization of 'gomp_runtime_usm_var'. Eventually, it may - bear consideration if we wish to rather default to 'auto' - but - until then, we do not wish to surprise. */ - if (!parse_rt_usm ("GOMP_RUNTIME_USM", &gomp_runtime_usm_var)) - gomp_runtime_usm_var = GOMP_RUNTIME_USM_DISABLED; - /* Not strictly environment related, but ordering constructors is tricky. */ pthread_attr_init (&gomp_thread_attr); diff --git a/libgomp/libgomp-plugin.h b/libgomp/libgomp-plugin.h index 051666617874..5c770c80202e 100644 --- a/libgomp/libgomp-plugin.h +++ b/libgomp/libgomp-plugin.h @@ -50,7 +50,6 @@ extern "C" { #define GOMP_OFFLOAD_CAP_NATIVE_EXEC (1 << 1) #define GOMP_OFFLOAD_CAP_OPENMP_400 (1 << 2) #define GOMP_OFFLOAD_CAP_OPENACC_200 (1 << 3) -#define GOMP_OFFLOAD_CAP_AUTO_USM (1 << 4) /* Type of offload target device. Keep in sync with include/gomp-constants.h. */ enum offload_target_type @@ -165,7 +164,6 @@ extern int GOMP_OFFLOAD_supported_teams_dim (int, int); extern int GOMP_OFFLOAD_supported_threads_dim (int, int); extern unsigned int GOMP_OFFLOAD_get_caps (void); -extern unsigned int GOMP_OFFLOAD_get_dev_caps (int); extern int GOMP_OFFLOAD_get_type (void); extern int GOMP_OFFLOAD_get_num_devices (unsigned int); extern bool GOMP_OFFLOAD_init_device (int); diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h index 9f13f9e32c2a..af771be090e1 100644 --- a/libgomp/libgomp.h +++ b/libgomp/libgomp.h @@ -494,7 +494,7 @@ enum gomp_device_num section 2.3.1. Those described as having one copy per task are stored within the structure; those described as having one copy for the whole program are (naturally) global variables. */ - + struct gomp_task_icv { unsigned long nthreads_var; @@ -590,13 +590,6 @@ enum gomp_target_offload_t GOMP_TARGET_OFFLOAD_DISABLED }; -enum gomp_runtime_usm_t -{ - GOMP_RUNTIME_USM_DISABLED, - GOMP_RUNTIME_USM_AUTO, - GOMP_RUNTIME_USM_ENABLED -}; - #define gomp_supported_active_levels UCHAR_MAX extern struct gomp_task_icv gomp_global_icv; @@ -627,7 +620,6 @@ extern const size_t gomp_omp_allocator_data_size; extern const struct gomp_default_icv gomp_default_icv_values; extern struct gomp_icv_list *gomp_initial_icv_list; extern struct gomp_offload_icv_list *gomp_offload_icv_list; -extern enum gomp_runtime_usm_t gomp_runtime_usm_var; extern int goacc_device_num; extern char *goacc_device_type; extern int goacc_default_dims[GOMP_DIM_MAX]; @@ -1404,7 +1396,7 @@ typedef struct acc_dispatch_t __typeof (GOMP_OFFLOAD_openacc_create_thread_data) *create_thread_data_func; __typeof (GOMP_OFFLOAD_openacc_destroy_thread_data) *destroy_thread_data_func; - + struct { /* Once created and put into the "active" list, asyncqueues are then never destructed and removed from the "active" list, other than if the TODO @@ -1477,7 +1469,6 @@ struct gomp_device_descr __typeof (GOMP_OFFLOAD_supported_teams_dim) *supported_teams_dim_func; __typeof (GOMP_OFFLOAD_supported_threads_dim) *supported_threads_dim_func; __typeof (GOMP_OFFLOAD_get_caps) *get_caps_func; - __typeof (GOMP_OFFLOAD_get_dev_caps) *get_dev_caps_func; __typeof (GOMP_OFFLOAD_get_type) *get_type_func; __typeof (GOMP_OFFLOAD_get_num_devices) *get_num_devices_func; __typeof (GOMP_OFFLOAD_init_device) *init_device_func; diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index 526c1ea3ab9b..e12d4488a5ab 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -4569,7 +4569,6 @@ variable is not set. * OMP_WAIT_POLICY:: How waiting threads are handled * GOMP_CPU_AFFINITY:: Bind threads to specific CPUs * GOMP_DEBUG:: Enable debugging output -* GOMP_RUNTIME_USM:: Control runtime enabling of Unified Shared Memory * GOMP_STACKSIZE:: Set default thread stack size * GOMP_SPINCOUNT:: Set the busy-wait spin count * GOMP_RTEMS_THREAD_POOLS:: Set the RTEMS specific thread pools @@ -5200,25 +5199,6 @@ This is currently not specified in more detail, and subject to change. -@node GOMP_RUNTIME_USM -@section @env{GOMP_RUNTIME_USM} -- Control runtime enabling of Unified Shared Memory -@cindex Environment Variable -@table @asis -@item @emph{Description}: -Control the behavior of automatic Unified Shared Memory (USM) in the runtime. -The default is @code{disabled}, meaning that Unified Shared Memory will -only be used if specified by the @code{requires} clause. The variable -may also be set to @code{auto}, in which the runtime will decide whether -or not to use USM based on safety and performance considerations. More -specifically, it will only utilize USM if it detects XNACK support and -an APU. Lastly, one can set the variable to @code{enabled}, which will -unconditionally trust the device's self-report. This can potentially -cause instability, as some devices report capabilities that they may not -actually have. -@end table - - - @node GOMP_STACKSIZE @section @env{GOMP_STACKSIZE} -- Set default thread stack size @cindex Environment Variable diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c index adf1691eca1d..2a532b1141dc 100644 --- a/libgomp/plugin/plugin-gcn.c +++ b/libgomp/plugin/plugin-gcn.c @@ -1747,7 +1747,7 @@ get_memory_region (hsa_region_t region, hsa_region_t *retval, } /* Callback of hsa_agent_iterate_regions. - + Selects a kernargs memory region. */ static hsa_status_t @@ -2239,7 +2239,7 @@ process_reverse_offload (uint64_t fn, uint64_t mapnum, uint64_t hostaddrs, We print all entries from the last item printed to the next entry without a "written" flag. If the "final" flag is set then it'll continue right to the end. - + The print buffer is circular, but the from and to locations don't wrap when the buffer does, so the output limit is UINT_MAX. The target blocks on output when the buffer is full. */ @@ -3648,6 +3648,7 @@ gcn_exec (struct kernel_info *kernel, struct gomp_offload_session *session, /* }}} */ /* {{{ Generic Plugin API */ +#if 0 /* TODO: Use to enable self-mapping/USM automatically. */ /* FIXME: The auto-self-map feature depends on still mapping 'declare target' variables, even if ignoring all other mappings. Cf. PR 115279. */ @@ -3700,37 +3701,7 @@ is_integrated_apu (struct agent_info *agent, bool check_xnack) } return is_apu; } - -static bool -is_apu_with_xnack (struct agent_info *agent) -{ - /* We do not care for non-APU targets, at the moment. - If this ever changes, we can just elide the below check. - - Another point is that we are assuming the gfx902 does not - incur performance penalties, as it reports USM and XNACK+. - If it is later shown that enabling USM by default on this - platform incurs performance issues, then we need to add - an additional carveout here. */ - if (!is_integrated_apu (agent, false)) - return false; - enum { - HSACO_ATTR_UNSUPPORTED, - HSACO_ATTR_OFF, - HSACO_ATTR_ON, - HSACO_ATTR_ANY, - HSACO_ATTR_DEFAULT - }; - - switch (agent->device_isa) - { -#define GCN_DEVICE(name, NAME, ELF, ISA, XNACK, ...) \ - case ELF: return (XNACK == HSACO_ATTR_ANY); -#include "../../gcc/config/gcn/gcn-devices.def" - default: return false; - } - return false; -} +#endif /* Return the name of the accelerator, which is "gcn". */ @@ -3840,25 +3811,6 @@ GOMP_OFFLOAD_get_caps (void) | GOMP_OFFLOAD_CAP_OPENACC_200; } - - -unsigned int -GOMP_OFFLOAD_get_dev_caps (int ord) -{ - struct agent_info *agent = get_agent_info (ord); - bool claims_usm_p = 0; - unsigned int flags = GOMP_OFFLOAD_CAP_OPENMP_400 - | GOMP_OFFLOAD_CAP_OPENACC_200; - hsa_system_info_t type = HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT; - hsa_status_t status = hsa_fns.hsa_system_get_info_fn (type, &claims_usm_p); - if (status != HSA_STATUS_SUCCESS) - GOMP_PLUGIN_error ("Could not fetch SVM_ACCESSIBLE_BY_DEFAULT"); - if (claims_usm_p) - flags |= GOMP_OFFLOAD_CAP_SHARED_MEM; - if (claims_usm_p && is_apu_with_xnack (agent)) - flags |= GOMP_OFFLOAD_CAP_AUTO_USM; - return flags; -} /* Identify as GCN accelerator. */ int diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c index 7e5e044eb74f..0be45c51d35c 100644 --- a/libgomp/plugin/plugin-nvptx.c +++ b/libgomp/plugin/plugin-nvptx.c @@ -1434,25 +1434,6 @@ GOMP_OFFLOAD_get_caps (void) return GOMP_OFFLOAD_CAP_OPENACC_200 | GOMP_OFFLOAD_CAP_OPENMP_400; } -/* We duplicate functionality here for consistency, as this function - in plugin-gcn.c is for runtime USM. The gcn function determines - the case for auto-usm as well, however, here we only concern - ourselves for the enabled and disabled case. */ - -unsigned int -GOMP_OFFLOAD_get_dev_caps (int ord) -{ - unsigned int flags = GOMP_OFFLOAD_CAP_OPENACC_200 - | GOMP_OFFLOAD_CAP_OPENMP_400; - int pi = 0; - CUresult r; - r = CUDA_CALL_NOCHECK (cuDeviceGetAttribute, &pi, - CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING, ord); - if (r == CUDA_SUCCESS && pi) - flags |= GOMP_OFFLOAD_CAP_SHARED_MEM; - return flags; -} - int GOMP_OFFLOAD_get_type (void) { diff --git a/libgomp/target.c b/libgomp/target.c index 859e2de18471..c3d395103b46 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -3359,24 +3359,6 @@ gomp_init_device (struct gomp_device_descr *devicep) gomp_fatal ("device initialization failed"); } - /* Now that we have initialized the device, we can evaluate auto USM. - If the user has explicitly requested USM, we can just skip the check. */ - if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)) - { - devicep->capabilities = devicep->get_dev_caps_func (devicep->target_id); - if ((gomp_runtime_usm_var == GOMP_RUNTIME_USM_AUTO) - && !(devicep->capabilities & GOMP_OFFLOAD_CAP_AUTO_USM)) - devicep->capabilities &= ~GOMP_OFFLOAD_CAP_SHARED_MEM; - if (gomp_runtime_usm_var == GOMP_RUNTIME_USM_DISABLED) - devicep->capabilities &= ~GOMP_OFFLOAD_CAP_SHARED_MEM; - } - /* Peel off the GOMP_OFFLOAD_CAP_AUTO_USM, if it was set by the plugin, as - we no longer need it. */ - devicep->capabilities &= ~GOMP_OFFLOAD_CAP_AUTO_USM; - /* We can now set the requires mask based on the capabilities. - This makes it so the runtime treats it as if the user requested USM. */ - if (devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) - omp_requires_mask |= GOMP_REQUIRES_UNIFIED_SHARED_MEMORY; /* Load to device all images registered by the moment. */ for (i = 0; i < num_offload_images; i++) { @@ -3390,7 +3372,6 @@ gomp_init_device (struct gomp_device_descr *devicep) /* Initialize OpenACC asynchronous queues. */ goacc_init_asyncqueues (devicep); - gomp_debug (0, "capabilities: %d\n", devicep->capabilities); devicep->state = GOMP_DEVICE_INITIALIZED; } @@ -6747,7 +6728,6 @@ gomp_load_plugin_for_device (struct gomp_device_descr *device, DLSYM_OPT (supported_threads_dim, supported_threads_dim); DLSYM_OPT (supported_teams_dim, supported_teams_dim); DLSYM (get_caps); - DLSYM (get_dev_caps); DLSYM (get_type); DLSYM (get_num_devices); DLSYM (init_device); @@ -6773,8 +6753,7 @@ gomp_load_plugin_for_device (struct gomp_device_descr *device, DLSYM (get_interop_str); DLSYM (get_interop_type_desc); } - /* Returns offloading capabilities, but does not say anything about - auto USM yet. */ + device->capabilities = device->get_caps_func (); device->session.size = 0; if (device->capabilities & GOMP_OFFLOAD_CAP_OPENMP_400) @@ -6942,10 +6921,10 @@ gomp_target_init (void) { /* Augment DEVICES and NUM_DEVICES. */ - /* If USM has been requested, set the capability. */ + /* If USM has been requested and is supported by all devices + of this type, set the capability accordingly. */ if (omp_requires_mask - & (GOMP_REQUIRES_UNIFIED_SHARED_MEMORY - | GOMP_REQUIRES_SELF_MAPS)) + & (GOMP_REQUIRES_UNIFIED_SHARED_MEMORY | GOMP_REQUIRES_SELF_MAPS)) current_device.capabilities |= GOMP_OFFLOAD_CAP_SHARED_MEM; devs = realloc (devs, (num_devs + new_num_devs)
