[Bug target/104758] New: [nvptx] sm_30 support
vries at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Mar 2 11:54:15 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104758
Bug ID: 104758
Summary: [nvptx] sm_30 support
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
I.
Let's start out with some history.
gcc-5, gcc-6, gcc-7, gcc-8:
only sm_30 support
gcc-9, gcc-10:
sm_30 + sm_35 support, default: sm_30
gcc-11:
sm_30 + sm_35 support, default: sm_35
II.
The default was moved from sm_30 to sm_35 (PR97348), because recent CUDA
dropped support for sm_30, which inhibited the build (when build with CUDA bin
in the path).
That left the possibility open to build some program still for sm_30, but it
might include library code that would be build for sm_35, so building a pure
sm_30 exec was no longer guaranteed.
And if we build a program for sm_30, but also get sm_35 code, and try to
execute on an sm_30 board, we run into trouble.
Well, unless one would rebuild gcc with the default set back to sm_30, without
the CUDA in the path.
Something that might address this without requiring a gcc rebuild would be to
add a sm_30 multilib dimension:
...
diff --git a/gcc/config/nvptx/t-nvptx b/gcc/config/nvptx/t-nvptx
index f17fc9c19aac..a726a4ae7419 100644
--- a/gcc/config/nvptx/t-nvptx
+++ b/gcc/config/nvptx/t-nvptx
@@ -30,4 +30,4 @@ s-nvptx-gen-opt: $(srcdir)/config/nvptx/nvptx-sm.def
tmp-nvptx-gen.opt $(srcdir)/config/nvptx/nvptx-gen.opt
$(STAMP) s-nvptx-gen-opt
-MULTILIB_OPTIONS = mgomp
+MULTILIB_OPTIONS = mgomp misa=sm_30
...
But that brings back the same problem that we tried to avoid by changing the
default: it no longer builds with recent CUDA.
With f.i. sm_30 triggering -Wa,--no-verify, we could work around the CUDA
problem:
...
diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h
index 4ab412bc7d8e..3ca22a595d20 100644
--- a/gcc/config/nvptx/nvptx.h
+++ b/gcc/config/nvptx/nvptx.h
@@ -32,7 +32,7 @@
/* Default needs to be in sync with default for misa in nvptx.opt.
We add a default here to work around a hard-coded sm_30 default in
nvptx-as. */
-#define ASM_SPEC "%{misa=*:-m %*; :-m sm_35}"
+#define ASM_SPEC "%{misa=*:-m %*; :-m sm_35}%{misa=sm_30:--no-verify}"
#define TARGET_CPU_CPP_BUILTINS() nvptx_cpu_cpp_builtins ()
...
We could do something similar by making nvptx-as.c detect the "SM version
specified by .target is higher than default SM version assumed" problem and not
error out, perhaps issue a warning, or deal with this at nvptx-tools configure
time, similar to how that is done for ptxas unavailability.
Likewise, we could deal with this at gcc configure time.
An alternative for:
...
MULTILIB_OPTIONS = mgomp misa=sm_30
...
could be:
...
MULTILIB_EXTRA_OPTS = misa=sm_30
...
In other words, we keep default sm_35, but the default multilib arch is set
back to sm_30.
III.
For the ptx isa version, we had:
gcc-5, gcc-6, gcc-7, gcc-8, gcc-9, gcc-10, gcc-11:
3.1 support
gcc-12:
3.1, 6.0, 6.3, 7.0 support, default: picked based on sm_xx, with minimum of 6.0
IV.
So, even with:
...
MULTILIB_EXTRA_OPTS = misa=sm_30
...
we have in libgcc:
...
.version 6.0
.target sm_30
...
which means we're excluding older drivers that used to work with .version 3.1.
We can fix that using:
...
MULTILIB_EXTRA_OPTS = misa=sm_30 mptx=3.1
...
More information about the Gcc-bugs
mailing list