public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm
@ 2023-02-07 13:27 Lancelot SIX
  2023-02-07 13:27 ` [PATCH 1/4] gdb: 'show config' shows --with[out]-amd-dbgapi Lancelot SIX
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:27 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Lancelot SIX

Hi,

Tom De Vries reported that the gdb.rocm/simple.exp test (recently introduced
with the AMDGPU support) can fails[1].  I can reproduce this problem
(and variations of it) on systems where GDB is not build with the AMDGPU
support, or which do not have the ROCm stack installed.

This series fixes this test failure by only running the test if:
- GDB is build with AMDGPU support (patch 1 and 3)
- if the hipcc compiler is installed and can compile a simple HIP
  program which offloads a task to an AMDGPU device (patch 4).

Patch 3 is a small refactoring to use "require" in gdb.rocm/*.exp.

All feedbacks are welcome.

Best,
Lancelot.

[1] https://sourceware.org/pipermail/gdb-patches/2023-February/196624.html

Lancelot SIX (4):
  gdb: 'show config' shows --with[out]-amd-dbgapi
  gdb/testsuite: Rename skip_hipcc_tests to allow_hipcc_tests
  gdb/testsuite: require amd-dbgapi support to run rocm tests
  gdb/testsuite: allow_hipcc_tests tests the hipcc compiler

 gdb/config.in                     |  3 ++
 gdb/configure                     |  3 ++
 gdb/configure.ac                  |  1 +
 gdb/testsuite/gdb.rocm/simple.exp |  5 +-
 gdb/testsuite/lib/gdb.exp         |  4 ++
 gdb/testsuite/lib/rocm.exp        | 80 +++++++++++++++++++++++++++++--
 gdb/top.c                         | 10 ++++
 7 files changed, 99 insertions(+), 7 deletions(-)


base-commit: ca2f51c6960d65c2d3adbc4095aa8a9d02759376
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] gdb: 'show config' shows --with[out]-amd-dbgapi
  2023-02-07 13:27 [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm Lancelot SIX
@ 2023-02-07 13:27 ` Lancelot SIX
  2023-02-07 13:28 ` [PATCH 2/4] gdb/testsuite: Rename skip_hipcc_tests to allow_hipcc_tests Lancelot SIX
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:27 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Lancelot SIX

Ensure that the "show configuration" command and the "--configuration"
command line switch shows if GDB was built with the AMDGPU support or
not.

This will be used in a later patch in this series.
---
 gdb/config.in    |  3 +++
 gdb/configure    |  3 +++
 gdb/configure.ac |  1 +
 gdb/top.c        | 10 ++++++++++
 4 files changed, 17 insertions(+)

diff --git a/gdb/config.in b/gdb/config.in
index 7da131ebf04..a6027847444 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -84,6 +84,9 @@
    */
 #undef HAVE_ALLOCA_H
 
+/* Define if amd-dbgapi is being linked in. */
+#undef HAVE_AMD_DBGAPI
+
 /* Define to 1 if you have the `btowc' function. */
 #undef HAVE_BTOWC
 
diff --git a/gdb/configure b/gdb/configure
index 113b7cf8a30..8b2039912e7 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -18252,6 +18252,9 @@ $as_echo "yes" >&6; }
 fi
 
   if test "$has_amd_dbgapi" = "yes"; then
+
+$as_echo "#define HAVE_AMD_DBGAPI 1" >>confdefs.h
+
     TARGET_OBS="$TARGET_OBS amd-dbgapi-target.o"
 
     # If --enable-targets=all was provided, use the list of all files depending
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 7c7bf88b3fb..79eb013ce19 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -275,6 +275,7 @@ if test "$gdb_require_amd_dbgapi" = true \
 		    [has_amd_dbgapi=yes], [has_amd_dbgapi=no])
 
   if test "$has_amd_dbgapi" = "yes"; then
+    AC_DEFINE(HAVE_AMD_DBGAPI, 1, [Define if amd-dbgapi is being linked in.])
     TARGET_OBS="$TARGET_OBS amd-dbgapi-target.o"
 
     # If --enable-targets=all was provided, use the list of all files depending
diff --git a/gdb/top.c b/gdb/top.c
index 205eb360ba3..2447ba55bca 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1629,6 +1629,16 @@ This GDB was configured as follows:\n\
 "));
 #endif
 
+#if HAVE_AMD_DBGAPI
+  gdb_printf (stream, _("\
+	     --with-amd-dbgapi\n\
+"));
+#else
+  gdb_printf (stream, _("\
+	     --without-amd-dbapi\n\
+"));
+#endif
+
 #if HAVE_SOURCE_HIGHLIGHT
   gdb_printf (stream, _("\
 	     --enable-source-highlight\n\
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/4] gdb/testsuite: Rename skip_hipcc_tests to allow_hipcc_tests
  2023-02-07 13:27 [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm Lancelot SIX
  2023-02-07 13:27 ` [PATCH 1/4] gdb: 'show config' shows --with[out]-amd-dbgapi Lancelot SIX
@ 2023-02-07 13:28 ` Lancelot SIX
  2023-02-07 13:28 ` [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests Lancelot SIX
  2023-02-07 13:28 ` [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler Lancelot SIX
  3 siblings, 0 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:28 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Lancelot SIX

Rename skip_hipcc_tests to allow_hipcc_tests so it can be used as a
"require" predicate in tests.

Use require in gdb.rocm/simple.exp.
---
 gdb/testsuite/gdb.rocm/simple.exp | 5 +----
 gdb/testsuite/lib/rocm.exp        | 6 +++---
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/gdb/testsuite/gdb.rocm/simple.exp b/gdb/testsuite/gdb.rocm/simple.exp
index f84df71414e..befcc7aaabc 100644
--- a/gdb/testsuite/gdb.rocm/simple.exp
+++ b/gdb/testsuite/gdb.rocm/simple.exp
@@ -20,10 +20,7 @@ load_lib rocm.exp
 
 standard_testfile .cpp
 
-if [skip_hipcc_tests] {
-    verbose "skipping hip test: ${testfile}"
-    return
-}
+require allow_hipcc_tests
 
 if {[build_executable "failed to prepare" $testfile $srcfile {debug hip}]} {
     return
diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
index e22f392deb1..1440ac85d32 100644
--- a/gdb/testsuite/lib/rocm.exp
+++ b/gdb/testsuite/lib/rocm.exp
@@ -15,14 +15,14 @@
 #
 # Support library for testing ROCm (AMD GPU) GDB features.
 
-proc skip_hipcc_tests { } {
+proc allow_hipcc_tests { } {
     # Only the native target supports ROCm debugging.  E.g., when
     # testing against GDBserver, there's no point in running the ROCm
     # tests.
     if {[target_info gdb_protocol] != ""} {
-        return 1
+	return 0
     }
-    return 0
+    return 1
 }
 
 # The lock file used to ensure that only one GDB has access to the GPU
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests
  2023-02-07 13:27 [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm Lancelot SIX
  2023-02-07 13:27 ` [PATCH 1/4] gdb: 'show config' shows --with[out]-amd-dbgapi Lancelot SIX
  2023-02-07 13:28 ` [PATCH 2/4] gdb/testsuite: Rename skip_hipcc_tests to allow_hipcc_tests Lancelot SIX
@ 2023-02-07 13:28 ` Lancelot SIX
  2023-02-07 13:59   ` Simon Marchi
  2023-02-07 13:28 ` [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler Lancelot SIX
  3 siblings, 1 reply; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:28 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Lancelot SIX

Update allow_hipcc_tests to check that GDB has the amd-dbgapi support
built-in.  Without this support, all tests using hipcc and the rocm
stack will fail.
---
 gdb/testsuite/lib/rocm.exp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
index 1440ac85d32..b5b59748c27 100644
--- a/gdb/testsuite/lib/rocm.exp
+++ b/gdb/testsuite/lib/rocm.exp
@@ -22,6 +22,13 @@ proc allow_hipcc_tests { } {
     if {[target_info gdb_protocol] != ""} {
 	return 0
     }
+
+    # Ensure that GDB is built with amd-dbgapi support.
+    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS --configuration"]
+    if { [expr {[string first "--with-amd-dbgapi" $output] == -1}] } {
+	return 0
+    }
+
     return 1
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler
  2023-02-07 13:27 [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm Lancelot SIX
                   ` (2 preceding siblings ...)
  2023-02-07 13:28 ` [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests Lancelot SIX
@ 2023-02-07 13:28 ` Lancelot SIX
  2023-02-07 13:42   ` Lancelot SIX
  2023-02-07 14:12   ` Simon Marchi
  3 siblings, 2 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:28 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Lancelot SIX

Update allow_hipcc_tests so all gdb.rocm tests are skipped if we do not
have a working hipcc compiler available.

To achieve this, adjust gdb_simple_compile to ensure that the hip
program is saved in a ".cpp" file before calling hipcc otherwise
compilation will fail.

One thing to note is that it is possible to have a hipcc installed with
a CUDA backend.  Compiling with this back-end will successfully result
in an application, but GDB cannot debug it (at least for the offload
part). In the context of the gdb.rocm tests, we want to detect such
situation where gdb_simple_compile would give a false positive.

To achieve this, this patch checks that there is at least one AMDGPU
device available and that hipcc can compile for this or those targets.
Detecting the device is done using the rocm_agent_enumerator tool which
is installed with the all ROCm installations (it is used by hipcc to
detect identify targets if this is not specified on the comand line).

This patch also makes the allow_hipcc_tests proc a cached proc.
---
 gdb/testsuite/lib/gdb.exp  |  4 +++
 gdb/testsuite/lib/rocm.exp | 69 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index faa0ac05a9a..6333728f71e 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -4581,6 +4581,10 @@ proc gdb_simple_compile {name code {type object} {compile_flags {}} {object obj}
 	    set ext "go"
 	    break
 	}
+	if { "$flag" eq "hip" } {
+	    set ext "cpp"
+	    break
+	}
     }
     set src [standard_temp_file $name-[pid].$ext]
     set obj [standard_temp_file $name-[pid].$postfix]
diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
index b5b59748c27..06d5b3988b8 100644
--- a/gdb/testsuite/lib/rocm.exp
+++ b/gdb/testsuite/lib/rocm.exp
@@ -15,7 +15,51 @@
 #
 # Support library for testing ROCm (AMD GPU) GDB features.
 
-proc allow_hipcc_tests { } {
+# 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.
+
+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) ","]
+    }
+
+    set rocm_agent_enumerator "rocm_agent_enumerator"
+
+    # 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"
+    }
+
+    # 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]
+    }
+
+    set result [remote_exec host $rocm_agent_enumerator]
+    if { [lindex $result 0] != 0 } {
+	error "rocm_agent_enumerator failed"
+    }
+
+    set targets [list]
+    foreach target [lindex $result 1] {
+	# Ignore gfx000 which is the host CPU.
+	if { $target ne "gfx000" } {
+	    lappend targets $target
+	}
+    }
+
+    return $targets
+}
+
+gdb_caching_proc allow_hipcc_tests {
     # Only the native target supports ROCm debugging.  E.g., when
     # testing against GDBserver, there's no point in running the ROCm
     # tests.
@@ -29,6 +73,29 @@ proc allow_hipcc_tests { } {
 	return 0
     }
 
+    # Check we have a working hipcc compiler available.
+    set targets [hcc_amdgpu_targets]
+    if { [llength $targets] == 0} {
+	return 0
+    }
+
+    set flags [list hip additional_flags=--offload-arch=[join $targets ","]]
+    if {![gdb_simple_compile hipprobe {
+	    #include <hip/hip_runtime.h>
+	    __global__ void
+	    kern () {}
+
+	    int
+	    main ()
+	    {
+		kern<<<1, 1>>> ();
+		hipDeviceSynchronize ();
+		return 0;
+	    }
+	} executable $flags]} {
+	return 0
+    }
+
     return 1
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler
  2023-02-07 13:28 ` [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler Lancelot SIX
@ 2023-02-07 13:42   ` Lancelot SIX
  2023-02-07 14:12   ` Simon Marchi
  1 sibling, 0 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 13:42 UTC (permalink / raw)
  To: gdb-patches; +Cc: lsix, Pedro Alves

Hi,

Some of this patch is based on original work from Pedro in 
https://github.com/ROCm-Developer-Tools/ROCgdb/commit/031a44b9c6ec2c381030a919b837e5dfc255e688. 
  I just realized that I forgot to give credit where due.

I'll add the following tag:
Co-Authored-By: Pedro Alves <pedro@palves.net>

Best,
Laneclot.

On 07/02/2023 13:28, Lancelot SIX wrote:
> Update allow_hipcc_tests so all gdb.rocm tests are skipped if we do not
> have a working hipcc compiler available.
> 
> To achieve this, adjust gdb_simple_compile to ensure that the hip
> program is saved in a ".cpp" file before calling hipcc otherwise
> compilation will fail.
> 
> One thing to note is that it is possible to have a hipcc installed with
> a CUDA backend.  Compiling with this back-end will successfully result
> in an application, but GDB cannot debug it (at least for the offload
> part). In the context of the gdb.rocm tests, we want to detect such
> situation where gdb_simple_compile would give a false positive.
> 
> To achieve this, this patch checks that there is at least one AMDGPU
> device available and that hipcc can compile for this or those targets.
> Detecting the device is done using the rocm_agent_enumerator tool which
> is installed with the all ROCm installations (it is used by hipcc to
> detect identify targets if this is not specified on the comand line).
> 
> This patch also makes the allow_hipcc_tests proc a cached proc.
> ---
>   gdb/testsuite/lib/gdb.exp  |  4 +++
>   gdb/testsuite/lib/rocm.exp | 69 +++++++++++++++++++++++++++++++++++++-
>   2 files changed, 72 insertions(+), 1 deletion(-)
> 
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index faa0ac05a9a..6333728f71e 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -4581,6 +4581,10 @@ proc gdb_simple_compile {name code {type object} {compile_flags {}} {object obj}
>   	    set ext "go"
>   	    break
>   	}
> +	if { "$flag" eq "hip" } {
> +	    set ext "cpp"
> +	    break
> +	}
>       }
>       set src [standard_temp_file $name-[pid].$ext]
>       set obj [standard_temp_file $name-[pid].$postfix]
> diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
> index b5b59748c27..06d5b3988b8 100644
> --- a/gdb/testsuite/lib/rocm.exp
> +++ b/gdb/testsuite/lib/rocm.exp
> @@ -15,7 +15,51 @@
>   #
>   # Support library for testing ROCm (AMD GPU) GDB features.
>   
> -proc allow_hipcc_tests { } {
> +# 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.
> +
> +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) ","]
> +    }
> +
> +    set rocm_agent_enumerator "rocm_agent_enumerator"
> +
> +    # 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"
> +    }
> +
> +    # 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]
> +    }
> +
> +    set result [remote_exec host $rocm_agent_enumerator]
> +    if { [lindex $result 0] != 0 } {
> +	error "rocm_agent_enumerator failed"
> +    }
> +
> +    set targets [list]
> +    foreach target [lindex $result 1] {
> +	# Ignore gfx000 which is the host CPU.
> +	if { $target ne "gfx000" } {
> +	    lappend targets $target
> +	}
> +    }
> +
> +    return $targets
> +}
> +
> +gdb_caching_proc allow_hipcc_tests {
>       # Only the native target supports ROCm debugging.  E.g., when
>       # testing against GDBserver, there's no point in running the ROCm
>       # tests.
> @@ -29,6 +73,29 @@ proc allow_hipcc_tests { } {
>   	return 0
>       }
>   
> +    # Check we have a working hipcc compiler available.
> +    set targets [hcc_amdgpu_targets]
> +    if { [llength $targets] == 0} {
> +	return 0
> +    }
> +
> +    set flags [list hip additional_flags=--offload-arch=[join $targets ","]]
> +    if {![gdb_simple_compile hipprobe {
> +	    #include <hip/hip_runtime.h>
> +	    __global__ void
> +	    kern () {}
> +
> +	    int
> +	    main ()
> +	    {
> +		kern<<<1, 1>>> ();
> +		hipDeviceSynchronize ();
> +		return 0;
> +	    }
> +	} executable $flags]} {
> +	return 0
> +    }
> +
>       return 1
>   }
>   

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests
  2023-02-07 13:28 ` [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests Lancelot SIX
@ 2023-02-07 13:59   ` Simon Marchi
  0 siblings, 0 replies; 9+ messages in thread
From: Simon Marchi @ 2023-02-07 13:59 UTC (permalink / raw)
  To: Lancelot SIX, gdb-patches; +Cc: lsix



On 2/7/23 08:28, Lancelot SIX via Gdb-patches wrote:
> Update allow_hipcc_tests to check that GDB has the amd-dbgapi support
> built-in.  Without this support, all tests using hipcc and the rocm
> stack will fail.
> ---
>  gdb/testsuite/lib/rocm.exp | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
> index 1440ac85d32..b5b59748c27 100644
> --- a/gdb/testsuite/lib/rocm.exp
> +++ b/gdb/testsuite/lib/rocm.exp
> @@ -22,6 +22,13 @@ proc allow_hipcc_tests { } {
>      if {[target_info gdb_protocol] != ""} {
>  	return 0
>      }
> +
> +    # Ensure that GDB is built with amd-dbgapi support.
> +    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS --configuration"]
> +    if { [expr {[string first "--with-amd-dbgapi" $output] == -1}] } {

The expr is unnecessary.  Otherwise, LGTM.

Simon

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler
  2023-02-07 13:28 ` [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler Lancelot SIX
  2023-02-07 13:42   ` Lancelot SIX
@ 2023-02-07 14:12   ` Simon Marchi
  2023-02-07 15:31     ` Lancelot SIX
  1 sibling, 1 reply; 9+ messages in thread
From: Simon Marchi @ 2023-02-07 14:12 UTC (permalink / raw)
  To: Lancelot SIX, gdb-patches; +Cc: lsix



On 2/7/23 08:28, Lancelot SIX via Gdb-patches wrote:
> Update allow_hipcc_tests so all gdb.rocm tests are skipped if we do not
> have a working hipcc compiler available.
> 
> To achieve this, adjust gdb_simple_compile to ensure that the hip
> program is saved in a ".cpp" file before calling hipcc otherwise
> compilation will fail.
> 
> One thing to note is that it is possible to have a hipcc installed with
> a CUDA backend.  Compiling with this back-end will successfully result
> in an application, but GDB cannot debug it (at least for the offload
> part). In the context of the gdb.rocm tests, we want to detect such
> situation where gdb_simple_compile would give a false positive.
> 
> To achieve this, this patch checks that there is at least one AMDGPU
> device available and that hipcc can compile for this or those targets.
> Detecting the device is done using the rocm_agent_enumerator tool which
> is installed with the all ROCm installations (it is used by hipcc to
> detect identify targets if this is not specified on the comand line).
> 
> This patch also makes the allow_hipcc_tests proc a cached proc.
> ---
>  gdb/testsuite/lib/gdb.exp  |  4 +++
>  gdb/testsuite/lib/rocm.exp | 69 +++++++++++++++++++++++++++++++++++++-
>  2 files changed, 72 insertions(+), 1 deletion(-)
> 
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index faa0ac05a9a..6333728f71e 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -4581,6 +4581,10 @@ proc gdb_simple_compile {name code {type object} {compile_flags {}} {object obj}
>  	    set ext "go"
>  	    break
>  	}
> +	if { "$flag" eq "hip" } {
> +	    set ext "cpp"
> +	    break
> +	}
>      }
>      set src [standard_temp_file $name-[pid].$ext]
>      set obj [standard_temp_file $name-[pid].$postfix]
> diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
> index b5b59748c27..06d5b3988b8 100644
> --- a/gdb/testsuite/lib/rocm.exp
> +++ b/gdb/testsuite/lib/rocm.exp
> @@ -15,7 +15,51 @@
>  #
>  # Support library for testing ROCm (AMD GPU) GDB features.
>  
> -proc allow_hipcc_tests { } {
> +# 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.
> +
> +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) ","]
> +    }
> +
> +    set rocm_agent_enumerator "rocm_agent_enumerator"
> +
> +    # 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"
> +    }
> +
> +    # 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]
> +    }
> +
> +    set result [remote_exec host $rocm_agent_enumerator]
> +    if { [lindex $result 0] != 0 } {
> +	error "rocm_agent_enumerator failed"
> +    }
> +
> +    set targets [list]
> +    foreach target [lindex $result 1] {
> +	# Ignore gfx000 which is the host CPU.
> +	if { $target ne "gfx000" } {
> +	    lappend targets $target
> +	}
> +    }
> +
> +    return $targets

I typically don't have ROCM_PATH set, and I don't add /opt/rocm/bin to
my PATH, so rocm_agent_enumerator will not be found by default here.
However, gdb_find_hipcc does fall back on /opt/rocm/bin, so it does find
my hipcc.  I think we should use similar strategies for both cases.  I
don't mind having to set ROCM_PATH or adding /opt/rocm/bin to my PATH if
needed, as long as we're consistent about it.

> +}
> +
> +gdb_caching_proc allow_hipcc_tests {
>      # Only the native target supports ROCm debugging.  E.g., when
>      # testing against GDBserver, there's no point in running the ROCm
>      # tests.
> @@ -29,6 +73,29 @@ proc allow_hipcc_tests { } {
>  	return 0
>      }
>  
> +    # Check we have a working hipcc compiler available.
> +    set targets [hcc_amdgpu_targets]
> +    if { [llength $targets] == 0} {
> +	return 0
> +    }
> +
> +    set flags [list hip additional_flags=--offload-arch=[join $targets ","]]
> +    if {![gdb_simple_compile hipprobe {
> +	    #include <hip/hip_runtime.h>
> +	    __global__ void
> +	    kern () {}
> +
> +	    int
> +	    main ()
> +	    {
> +		kern<<<1, 1>>> ();
> +		hipDeviceSynchronize ();
> +		return 0;
> +	    }
> +	} executable $flags]} {
> +	return 0
> +    }

So, this last part ensures we don't have a "CUDA hipcc false
positive"?  It would be good to put a comment above it to indicate the
precise intent.

Simon

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler
  2023-02-07 14:12   ` Simon Marchi
@ 2023-02-07 15:31     ` Lancelot SIX
  0 siblings, 0 replies; 9+ messages in thread
From: Lancelot SIX @ 2023-02-07 15:31 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches; +Cc: lsix

[-- Attachment #1: Type: text/plain, Size: 7435 bytes --]



On 07/02/2023 14:12, Simon Marchi wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
> 
> 
> On 2/7/23 08:28, Lancelot SIX via Gdb-patches wrote:
>> Update allow_hipcc_tests so all gdb.rocm tests are skipped if we do not
>> have a working hipcc compiler available.
>>
>> To achieve this, adjust gdb_simple_compile to ensure that the hip
>> program is saved in a ".cpp" file before calling hipcc otherwise
>> compilation will fail.
>>
>> One thing to note is that it is possible to have a hipcc installed with
>> a CUDA backend.  Compiling with this back-end will successfully result
>> in an application, but GDB cannot debug it (at least for the offload
>> part). In the context of the gdb.rocm tests, we want to detect such
>> situation where gdb_simple_compile would give a false positive.
>>
>> To achieve this, this patch checks that there is at least one AMDGPU
>> device available and that hipcc can compile for this or those targets.
>> Detecting the device is done using the rocm_agent_enumerator tool which
>> is installed with the all ROCm installations (it is used by hipcc to
>> detect identify targets if this is not specified on the comand line).
>>
>> This patch also makes the allow_hipcc_tests proc a cached proc.
>> ---
>>   gdb/testsuite/lib/gdb.exp  |  4 +++
>>   gdb/testsuite/lib/rocm.exp | 69 +++++++++++++++++++++++++++++++++++++-
>>   2 files changed, 72 insertions(+), 1 deletion(-)
>>
>> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
>> index faa0ac05a9a..6333728f71e 100644
>> --- a/gdb/testsuite/lib/gdb.exp
>> +++ b/gdb/testsuite/lib/gdb.exp
>> @@ -4581,6 +4581,10 @@ proc gdb_simple_compile {name code {type object} {compile_flags {}} {object obj}
>>            set ext "go"
>>            break
>>        }
>> +     if { "$flag" eq "hip" } {
>> +         set ext "cpp"
>> +         break
>> +     }
>>       }
>>       set src [standard_temp_file $name-[pid].$ext]
>>       set obj [standard_temp_file $name-[pid].$postfix]
>> diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp
>> index b5b59748c27..06d5b3988b8 100644
>> --- a/gdb/testsuite/lib/rocm.exp
>> +++ b/gdb/testsuite/lib/rocm.exp
>> @@ -15,7 +15,51 @@
>>   #
>>   # Support library for testing ROCm (AMD GPU) GDB features.
>>
>> -proc allow_hipcc_tests { } {
>> +# 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.
>> +
>> +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) ","]
>> +    }
>> +
>> +    set rocm_agent_enumerator "rocm_agent_enumerator"
>> +
>> +    # 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"
>> +    }
>> +
>> +    # 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]
>> +    }
>> +
>> +    set result [remote_exec host $rocm_agent_enumerator]
>> +    if { [lindex $result 0] != 0 } {
>> +     error "rocm_agent_enumerator failed"
>> +    }
>> +
>> +    set targets [list]
>> +    foreach target [lindex $result 1] {
>> +     # Ignore gfx000 which is the host CPU.
>> +     if { $target ne "gfx000" } {
>> +         lappend targets $target
>> +     }
>> +    }
>> +
>> +    return $targets
> 
> I typically don't have ROCM_PATH set, and I don't add /opt/rocm/bin to
> my PATH, so rocm_agent_enumerator will not be found by default here.
> However, gdb_find_hipcc does fall back on /opt/rocm/bin, so it does find
> my hipcc.  I think we should use similar strategies for both cases.  I
> don't mind having to set ROCM_PATH or adding /opt/rocm/bin to my PATH if
> needed, as long as we're consistent about it.
> 

When installing the pre-built packages, at least on Ubuntu, there should 
be symlinks from /usr/bin to /etc/alternavites to 
/opt/rocm-$VERSION/bin.   I expect that when those tools start to be 
packaged by the various distributions, they will be available in PATH.

As I am not a big fan of the hard-coded /opt/rocm prefix, especially in 
the context of upstream, I would prefer to update gdb_find_hipcc.

Would something like this be OK?  It search for hipcc in dejagnu's 
tool_root_dir, $::env(ROCM_PATH) (if set) and fallbacks to "hipcc" if 
none of the above worked to search in PATH.

 From b8638cafabd36bc9316591da3c8326e10277372a Mon Sep 17 00:00:00 2001
From: Lancelot SIX <lancelot.six@amd.com>
Date: Tue, 7 Feb 2023 15:13:47 +0000
Subject: [PATCH] gdb/testsuite: look for hipcc in env(ROCM_PATH)

If the hipcc compiler cannot be found in dejagnu's tool_root_dir, look
for it in $::env(ROCM_PATH) (if set).  If hipcc is still not found,
fallback to "hipcc" so the compiler will be searched in the PATH.  This
removes the fallback to the hard-coded "/opt/rocm/bin" prefix.

This change is done so ROCM tools are searched in a uniform manner.
---
  gdb/testsuite/lib/future.exp | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp
index 5720d3837d5..2e8315bbfe1 100644
--- a/gdb/testsuite/lib/future.exp
+++ b/gdb/testsuite/lib/future.exp
@@ -125,8 +125,11 @@ proc gdb_find_hipcc {} {
      global tool_root_dir
      if {![is_remote host]} {
  	set hipcc [lookfor_file $tool_root_dir hipcc]
+	if {$hipcc == "" && [info exists ::env(ROCM_PATH)]} {
+	    set hipcc [lookfor_file $::env(ROCM_PATH)/bin hipcc]
+	}
  	if {$hipcc == ""} {
-	    set hipcc [lookfor_file /opt/rocm/bin hipcc]
+	    set hipcc hipcc
  	}
      } else {
  	set hipcc ""
-- 
2.34.1


>> +}
>> +
>> +gdb_caching_proc allow_hipcc_tests {
>>       # Only the native target supports ROCm debugging.  E.g., when
>>       # testing against GDBserver, there's no point in running the ROCm
>>       # tests.
>> @@ -29,6 +73,29 @@ proc allow_hipcc_tests { } {
>>        return 0
>>       }
>>
>> +    # Check we have a working hipcc compiler available.
>> +    set targets [hcc_amdgpu_targets]
>> +    if { [llength $targets] == 0} {
>> +     return 0
>> +    }
>> +
>> +    set flags [list hip additional_flags=--offload-arch=[join $targets ","]]
>> +    if {![gdb_simple_compile hipprobe {
>> +         #include <hip/hip_runtime.h>
>> +         __global__ void
>> +         kern () {}
>> +
>> +         int
>> +         main ()
>> +         {
>> +             kern<<<1, 1>>> ();
>> +             hipDeviceSynchronize ();
>> +             return 0;
>> +         }
>> +     } executable $flags]} {
>> +     return 0
>> +    }
> 
> So, this last part ensures we don't have a "CUDA hipcc false
> positive"?  It would be good to put a comment above it to indicate the
> precise intent.

Yes, if -offload-arch=gfxXX is passed, I expect the cuda backend to 
complain at this is not a valid NVIDIA architecture.  I'll add a comment 
to explain this.

Thanks for the review.
Lancelot.

> 
> Simon

[-- Attachment #2: 0001-gdb-testsuite-look-for-hipcc-in-env-ROCM_PATH.patch --]
[-- Type: text/x-patch, Size: 1242 bytes --]

From b8638cafabd36bc9316591da3c8326e10277372a Mon Sep 17 00:00:00 2001
From: Lancelot SIX <lancelot.six@amd.com>
Date: Tue, 7 Feb 2023 15:13:47 +0000
Subject: [PATCH] gdb/testsuite: look for hipcc in env(ROCM_PATH)

If the hipcc compiler cannot be found in dejagnu's tool_root_dir, look
for it in $::env(ROCM_PATH) (if set).  If hipcc is still not found,
fallback to "hipcc" so the compiler will be searched in the PATH.  This
removes the fallback to the hard-coded "/opt/rocm/bin" prefix.

This change is done so ROCM tools are searched in a uniform manner.
---
 gdb/testsuite/lib/future.exp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp
index 5720d3837d5..2e8315bbfe1 100644
--- a/gdb/testsuite/lib/future.exp
+++ b/gdb/testsuite/lib/future.exp
@@ -125,8 +125,11 @@ proc gdb_find_hipcc {} {
     global tool_root_dir
     if {![is_remote host]} {
 	set hipcc [lookfor_file $tool_root_dir hipcc]
+	if {$hipcc == "" && [info exists ::env(ROCM_PATH)]} {
+	    set hipcc [lookfor_file $::env(ROCM_PATH)/bin hipcc]
+	}
 	if {$hipcc == ""} {
-	    set hipcc [lookfor_file /opt/rocm/bin hipcc]
+	    set hipcc hipcc
 	}
     } else {
 	set hipcc ""
-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-02-07 15:31 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-07 13:27 [PATCH 0/4] Fix gdb.rocm/simple.exp on hosts without ROCm Lancelot SIX
2023-02-07 13:27 ` [PATCH 1/4] gdb: 'show config' shows --with[out]-amd-dbgapi Lancelot SIX
2023-02-07 13:28 ` [PATCH 2/4] gdb/testsuite: Rename skip_hipcc_tests to allow_hipcc_tests Lancelot SIX
2023-02-07 13:28 ` [PATCH 3/4] gdb/testsuite: require amd-dbgapi support to run rocm tests Lancelot SIX
2023-02-07 13:59   ` Simon Marchi
2023-02-07 13:28 ` [PATCH 4/4] gdb/testsuite: allow_hipcc_tests tests the hipcc compiler Lancelot SIX
2023-02-07 13:42   ` Lancelot SIX
2023-02-07 14:12   ` Simon Marchi
2023-02-07 15:31     ` Lancelot SIX

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).