aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShahab Vahedi <shahab.vahedi@amd.com>2025-02-12 15:58:15 +0100
committerShahab Vahedi <shahab.vahedi@amd.com>2025-02-21 18:53:17 +0100
commit4d44cba2f7a05d082876b2ec730f7f763095f306 (patch)
treeca3fdf73ef0ef9686f8a456087c14be2cb8573ad
parent2b0a62b17f9f66e9bb08a7dc69a5c636c1f618c4 (diff)
downloadfsf-binutils-gdb-4d44cba2f7a05d082876b2ec730f7f763095f306.zip
fsf-binutils-gdb-4d44cba2f7a05d082876b2ec730f7f763095f306.tar.gz
fsf-binutils-gdb-4d44cba2f7a05d082876b2ec730f7f763095f306.tar.bz2
gdb/testsuite/rocm.exp: Use system GPU(s) to detect features
gdb/testsuite/rocm.exp: Use system GPU(s) to detect features Background ---------- This patch revisits the purpose of hcc_amdgpu_targets{} in order to address the separation of concerns between: - GPU targets passed to the compiler. This kind of target is passed as an argument to flags like "--offload-arch=...", "--targets=...", etc. - GPU targets as in available GPU devices on the system. This is crucial for finding which capabilities are available, and therefore which tests should be executed or skipped. Code change ----------- - A new "find_amdgpu_devices{}" procedure is added. It is responsible for listing the GPU devices that are available on the system. - "hcc_amdgpu_targets{}" is rewritten to use the newly added "find_amdgpu_devices{}" when there's no environment variable (HCC_AMDGPU_TARGET) set. - The output of "hcc_amdgpu_targets{}" is now only used in places that set the target for the building toolchains. - The output of "find_amdgpu_devices{}" is used anywhere that needs to evaluate the GPU features. Approved-By: Lancelot Six <lancelot.six@amd.com> (amdgpu) Change-Id: Ib11021dbe674aa40192737ede78284a1bc531513
-rw-r--r--gdb/testsuite/lib/rocm.exp110
1 files changed, 74 insertions, 36 deletions
diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
index b2db0d5..f358758 100644
--- a/gdb/testsuite/lib/rocm.exp
+++ b/gdb/testsuite/lib/rocm.exp
@@ -15,48 +15,83 @@
#
# Support library for testing ROCm (AMD GPU) GDB features.
-# Get the list of gpu targets to compile for.
-#
-# If HCC_AMDGPU_TARGET is set in the environment, use it. Otherwise,
-# try reading it from the system using the rocm_agent_enumerator
-# utility.
+# ROCM_PATH is used by hipcc as well.
+if {[info exists ::env(ROCM_PATH)]} {
+ set rocm_path $::env(ROCM_PATH)
+} else {
+ set rocm_path "/opt/rocm"
+}
-proc hcc_amdgpu_targets {} {
- # Look for HCC_AMDGPU_TARGET (same env var hipcc uses). If
- # that fails, try using rocm_agent_enumerator (again, same as
- # hipcc does).
- if {[info exists ::env(HCC_AMDGPU_TARGET)]} {
- return [split $::env(HCC_AMDGPU_TARGET) ","]
+# Act as a drop-in replacement for "remote_exec host"
+# that logs the failures.
+
+proc log_host_exec { cmd } {
+ set result [remote_exec host "$cmd"]
+ set exit_status [lindex $result 0]
+ if {$exit_status != 0} {
+ # -1 indicates that $cmd could not be executed at all.
+ if {$exit_status == -1} {
+ verbose -log "Cannot execute $cmd."
+ } else {
+ verbose -log "$cmd returned an error."
+ }
}
- set rocm_agent_enumerator "rocm_agent_enumerator"
+ return $result
+}
- # If available, use ROCM_PATH to locate rocm_agent_enumerator.
- if { [info exists ::env(ROCM_PATH)] } {
- set rocm_agent_enumerator \
- "$::env(ROCM_PATH)/bin/rocm_agent_enumerator"
+# Detect available AMDGPU devices.
+#
+# Return a list of GPU devices that do exist on the system.
+# The list will be empty when there's no GPU or the execution
+# of rocm_agent_enumerator does not succeed. It is up to the
+# caller of this procedure that what should happen when an empty
+# list is returned.
+
+gdb_caching_proc find_amdgpu_devices {} {
+ global rocm_path
+ set hip_gpu_devices [list]
+ set enumerator "rocm_agent_enumerator"
+ set targets ""
+
+ # Try the PATH first
+ set result [log_host_exec "$enumerator"]
+ if {[lindex $result 0] == 0} {
+ set targets [lindex $result 1]
+ } else {
+ # Now try the ROCM_PATH
+ set result [log_host_exec "$rocm_path/bin/$enumerator"]
+ if {[lindex $result 0] == 0} {
+ set targets [lindex $result 1]
+ }
}
- # If we fail to locate the rocm_agent_enumerator, just return an empty
- # list of targets and let the caller decide if this should be an error.
- if { [which $rocm_agent_enumerator] == 0 } {
- return [list]
+ if {$targets != ""} {
+ foreach dev $targets {
+ # Ignore the 'gfx000' device which identifies the host.
+ if {$dev != "gfx000"} {
+ lappend hip_gpu_devices $dev
+ }
+ }
}
- set result [remote_exec host $rocm_agent_enumerator]
- if { [lindex $result 0] != 0 } {
- error "rocm_agent_enumerator failed"
- }
+ return $hip_gpu_devices
+}
- set targets [list]
- foreach target [lindex $result 1] {
- # Ignore gfx000 which is the host CPU.
- if { $target ne "gfx000" } {
- lappend targets $target
- }
+# Get the list of GPU targets to compile for.
+#
+# If HCC_AMDGPU_TARGET is set in the environment, use it.
+# Otherwise, consider the devices available on the system.
+
+proc hcc_amdgpu_targets {} {
+ # First, look for HCC_AMDGPU_TARGET (same env var hipcc uses).
+ if {[info exists ::env(HCC_AMDGPU_TARGET)]} {
+ # We don't verify the contents of HCC_AMDGPU_TARGET.
+ # That's the toolchain's job.
+ return [split $::env(HCC_AMDGPU_TARGET) ","]
}
- return $targets
+ return [find_amdgpu_devices]
}
gdb_caching_proc allow_hipcc_tests {} {
@@ -77,12 +112,15 @@ gdb_caching_proc allow_hipcc_tests {} {
return {0 "amd-dbgapi not supported"}
}
- # Check we have a working hipcc compiler available.
- set targets [hcc_amdgpu_targets]
- if { [llength $targets] == 0} {
+ # Check if there's any GPU device to run the tests on.
+ set devices [find_amdgpu_devices]
+ if {[llength $devices] == 0} {
return {0 "no suitable amdgpu targets found"}
}
+ # Check we have a working hipcc compiler available.
+ # TARGETS won't be empty, because there's at least one GPU device.
+ set targets [hcc_amdgpu_targets]
set flags [list hip additional_flags=--offload-arch=[join $targets ","]]
if {![gdb_simple_compile hipprobe {
#include <hip/hip_runtime.h>
@@ -126,7 +164,7 @@ proc hip_devices_support_debug_multi_process {} {
set unsupported_targets \
{gfx900 gfx906 gfx908 gfx1010 gfx1011 gfx1012 gfx1030 gfx1031 gfx1032}
- set targets [hcc_amdgpu_targets]
+ set targets [find_amdgpu_devices]
if { [llength $targets] == 0 } {
return 0
}
@@ -145,7 +183,7 @@ proc hip_devices_support_precise_memory {} {
set unsupported_targets \
{gfx900 gfx906 gfx908 gfx1010 gfx1011 gfx1012 gfx1030 gfx1031 gfx1032}
- set targets [hcc_amdgpu_targets]
+ set targets [find_amdgpu_devices]
if { [llength $targets] == 0 } {
return 0
}