nvptx: Support '--with-multilib-list'

No change in behavior unless specifying it.

	gcc/
	* config.gcc: nvptx: Support '--with-multilib-list'.
	* config/nvptx/gen-multilib-matches.sh: Adjust.
	* configure.ac: Likewise.
	* configure: Regenerate.
	* doc/install.texi: Update.
	* doc/invoke.texi: Align.
	* config/nvptx/gen-multilib-matches-tests: Extend.
This commit is contained in:
Thomas Schwinge 2024-09-27 17:44:16 +02:00
parent 2b707b41b1
commit 86b3a7532d
7 changed files with 243 additions and 36 deletions

View file

@ -5595,21 +5595,70 @@ case "${target}" in
;;
nvptx-*)
supported_defaults=arch
TM_MULTILIB_CONFIG=$with_arch
#TODO 'sm_[...]' list per 'nvptx-sm.def'.
case $with_arch in
sm_30 )
# OK; default.
;;
sm_35 | sm_53 | sm_70 | sm_75 | sm_80 )
# OK, but we'd like 'sm_30', too.
TM_MULTILIB_CONFIG="$TM_MULTILIB_CONFIG sm_30"
nvptx_multilibs_default=sm_30
case "x${with_multilib_list}" in
x | xno)
nvptx_multilibs=
;;
xdefault | xyes)
nvptx_multilibs=default
;;
*)
nvptx_multilibs=$with_multilib_list
;;
esac
nvptx_multilibs=`echo $nvptx_multilibs | sed -e 's/,/ /g'`
# Expand 'default'.
nvptx_multilibs_expanded=
for nvptx_multilib in $nvptx_multilibs; do
case $nvptx_multilib in
default )
nvptx_multilibs_expanded="$nvptx_multilibs_expanded $nvptx_multilibs_default"
;;
* )
echo "Unknown arch used in --with-arch=$with_arch" 1>&2
nvptx_multilibs_expanded="$nvptx_multilibs_expanded $nvptx_multilib"
;;
esac
done
# The '--with-arch=[...]' one comes first.
nvptx_multilibs=$with_arch$nvptx_multilibs_expanded
# Filter out any duplicates.
nvptx_multilibs_filtered=
for nvptx_multilib in $nvptx_multilibs; do
case " $nvptx_multilibs_filtered " in
*" $nvptx_multilib "* )
:
;;
* )
nvptx_multilibs_filtered="$nvptx_multilibs_filtered $nvptx_multilib"
;;
esac
done
nvptx_multilibs=$nvptx_multilibs_filtered
# Verify, and build 'TM_MULTILIB_CONFIG'.
TM_MULTILIB_CONFIG=
for nvptx_multilib in $nvptx_multilibs; do
case $nvptx_multilib in
#TODO 'sm_[...]' list per 'nvptx-sm.def'.
sm_30 | sm_35 \
| sm_53 \
| sm_70 | sm_75 \
| sm_80 )
TM_MULTILIB_CONFIG="$TM_MULTILIB_CONFIG $nvptx_multilib"
;;
$with_arch )
echo "Unknown arch used in --with-arch=$nvptx_multilib" 1>&2
exit 1
;;
esac
* )
echo "Unknown arch used in --with-multilib-list: $nvptx_multilib" 1>&2
exit 1
;;
esac
done
TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^ //'`
;;
powerpc*-*-* | rs6000-*-*)

View file

@ -10,7 +10,7 @@
# 'CMMC': compute "multilib matches" per the current settings, and compare to the expected.
BEGIN '--with-arch=sm_30'
BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30'
SMOID sm_30
SMOIL sm_30
AEMM .=misa?sm_30
@ -21,8 +21,35 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30,sm_80'
SMOID sm_30
SMOIL sm_30 sm_80
AEMM .=misa?sm_30
AEMM .=misa?sm_35
AEMM .=misa?sm_53
AEMM .=misa?sm_70
AEMM .=misa?sm_75
CMMC
BEGIN '--with-arch=sm_35'
BEGIN '--with-arch=sm_30', '--with-multilib-list=sm_30,sm_35,sm_53,sm_70,sm_75,sm_80'
SMOID sm_30
SMOIL sm_30 sm_35 sm_53 sm_70 sm_75 sm_80
AEMM .=misa?sm_30
CMMC
BEGIN '--with-arch=sm_35', '--with-multilib-list=sm_35'
SMOID sm_35
SMOIL sm_35
AEMM .=misa?sm_30
AEMM .=misa?sm_35
AEMM .=misa?sm_53
AEMM .=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_35', '--with-multilib-list=sm_35,sm_30'
SMOID sm_35
SMOIL sm_35 sm_30
AEMM .=misa?sm_35
@ -33,7 +60,7 @@ AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_53'
BEGIN '--with-arch=sm_53', '--with-multilib-list=sm_53,sm_30'
SMOID sm_53
SMOIL sm_53 sm_30
AEMM misa?sm_30=misa?sm_35
@ -43,8 +70,25 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_53', '--with-multilib-list=sm_53,sm_30,sm_35,sm_70,sm_75,sm_80'
SMOID sm_53
SMOIL sm_53 sm_30 sm_35 sm_70 sm_75 sm_80
AEMM .=misa?sm_53
CMMC
BEGIN '--with-arch=sm_70'
BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70'
SMOID sm_70
SMOIL sm_70
AEMM .=misa?sm_30
AEMM .=misa?sm_35
AEMM .=misa?sm_53
AEMM .=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_30'
SMOID sm_70
SMOIL sm_70 sm_30
AEMM misa?sm_30=misa?sm_35
@ -54,8 +98,27 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_53'
SMOID sm_70
SMOIL sm_70 sm_53
AEMM misa?sm_53=misa?sm_30
AEMM misa?sm_53=misa?sm_35
AEMM .=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_75'
BEGIN '--with-arch=sm_70', '--with-multilib-list=sm_70,sm_53,sm_30'
SMOID sm_70
SMOIL sm_70 sm_53 sm_30
AEMM misa?sm_30=misa?sm_35
AEMM .=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_30'
SMOID sm_75
SMOIL sm_75 sm_30
AEMM misa?sm_30=misa?sm_35
@ -65,8 +128,38 @@ AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_53'
SMOID sm_75
SMOIL sm_75 sm_53
AEMM misa?sm_53=misa?sm_30
AEMM misa?sm_53=misa?sm_35
AEMM misa?sm_53=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_80'
BEGIN '--with-arch=sm_75', '--with-multilib-list=sm_75,sm_30,sm_53'
SMOID sm_75
SMOIL sm_75 sm_30 sm_53
AEMM misa?sm_30=misa?sm_35
AEMM misa?sm_53=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80'
SMOID sm_80
SMOIL sm_80
AEMM .=misa?sm_30
AEMM .=misa?sm_35
AEMM .=misa?sm_53
AEMM .=misa?sm_70
AEMM .=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_30'
SMOID sm_80
SMOIL sm_80 sm_30
AEMM misa?sm_30=misa?sm_35
@ -75,3 +168,19 @@ AEMM misa?sm_30=misa?sm_70
AEMM misa?sm_30=misa?sm_75
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_75'
SMOID sm_80
SMOIL sm_80 sm_75
AEMM misa?sm_75=misa?sm_30
AEMM misa?sm_75=misa?sm_35
AEMM misa?sm_75=misa?sm_53
AEMM misa?sm_75=misa?sm_70
AEMM .=misa?sm_80
CMMC
BEGIN '--with-arch=sm_80', '--with-multilib-list=sm_80,sm_30,sm_35,sm_53,sm_70,sm_75'
SMOID sm_80
SMOIL sm_80 sm_30 sm_35 sm_53 sm_70 sm_75
AEMM .=misa?sm_80
CMMC

View file

@ -34,8 +34,17 @@ sms=$(grep ^NVPTX_SM $nvptx_sm_def | sed 's/.*(//;s/,.*//')
# Every variant in 'sms' has to either be remapped to the default variant
# ('.', which is always built), or does get built as non-default variant
# ('misa=sm_SM'; thus not remapped), or has to be remapped to the "next lower"
# variant that does get built.
# ('misa=sm_SM'; thus not remapped), or gets remapped to a suitable variant,
# typically the "next lower" one that does get built. If no "next lower" one
# does get built, then remap to the "lowest" one that does get built. This
# increases chances that the linked code is compatible with more GPU hardware
# (backward compatibility). For example, for GCC built '--with-arch=sm_80',
# '--with-multilib-list=sm_53', only 'sm_53' and 'sm_80' target libraries get
# built. If now requesting a '-march=[...]' where no corresponding or "next
# lower" variant of the target libraries have been built, GCC's default
# behavior is to link in the default variant, 'sm_80'. However, if compiling
# user code with '-march=sm_35', for example, linking in the 'sm_53' variant is
# supposedly more useful in terms of compatibility with GPU hardware.
print_multilib_matches() {
local sms
@ -52,8 +61,18 @@ print_multilib_matches() {
local multilib_matches
multilib_matches=
# Determine the "lowest" variant that does get built.
local sm_next_lower
unset sm_next_lower
sm_next_lower=.
local sm
for sm in $sms; do
if [ x"sm_$sm" = x"$multilib_options_isa_default" ]; then
continue
elif expr " $multilib_options_isa_list " : ".* sm_$sm " > /dev/null; then
sm_next_lower=$sm
break
fi
done
local sm
for sm in $sms; do
@ -64,9 +83,7 @@ print_multilib_matches() {
elif expr " $multilib_options_isa_list " : ".* sm_$sm " > /dev/null; then
sm_map=
else
# Assert here that a "next lower" variant is available; the
# "lowest" variant always does get built.
sm_map=${sm_next_lower?}
sm_map=$sm_next_lower
fi
if [ x"${sm_map?}" = x ]; then

4
gcc/configure vendored
View file

@ -1883,8 +1883,8 @@ Optional Packages:
Root for documentation URLs
--with-changes-root-url=URL
Root for GCC changes URLs
--with-multilib-list select multilibs (AArch64, ARM, AVR, OR1K, RISC-V,
SH and x86-64 only)
--with-multilib-list select multilibs (AArch64, ARM, AVR, nvptx, OR1K,
RISC-V, SH and x86-64 only)
--with-multilib-generator
Multi-libs configuration string (RISC-V only)
--with-zstd=PATH specify prefix directory for installed zstd library.

View file

@ -1218,7 +1218,7 @@ if test "x$enable_offload_defaulted" = xyes; then
fi
AC_ARG_WITH(multilib-list,
[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, ARM, AVR, OR1K, RISC-V, SH and x86-64 only)])],
[AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, ARM, AVR, nvptx, OR1K, RISC-V, SH and x86-64 only)])],
:,
with_multilib_list=default)

View file

@ -1275,13 +1275,13 @@ sysv, aix.
@end table
@item --with-multilib-list=@var{list}
@item @anchor{with-multilib-list}--with-multilib-list=@var{list}
@itemx --without-multilib-list
Specify what multilibs to build. @var{list} is a comma separated list of
values, possibly consisting of a single value. Currently only implemented
for aarch64*-*-*, amdgcn*-*-*, arm*-*-*, loongarch*-*-*, riscv*-*-*, sh*-*-*
and x86-64-*-linux*. The accepted values and meaning for each target is given
below.
for aarch64*-*-*, amdgcn*-*-*, arm*-*-*, loongarch*-*-*, nvptx-*, riscv*-*-*,
sh*-*-* and x86-64-*-linux*.
The accepted values and meaning for each target is given below.
@table @code
@item aarch64*-*-*
@ -1407,6 +1407,28 @@ If @var{list} is empty or @code{default}, or if @option{--with-multilib-list}
is not specified, then only the default variant of the libraries are built,
where the default ABI is implied by the configured target triplet.
@item nvptx-*
The target libraries corresponding to the default value of the
@option{-march} option are always built,
@ifnothtml
@pxref{nvptx-x-none,,host/target specific installation notes}.
@end ifnothtml
@ifhtml
see
@uref{specific.html#nvptx-x-none,,host/target specific installation notes}.
@end ifhtml
If @var{list} is empty, @samp{no}, or @option{--without-multilib-list}
is specified, then no additional multilibs are built.
Otherwise, @var{list} is a comma separated list specifying which
multilibs to build.
List items are either @samp{sm_SM}, or @samp{default}, which is a
placeholder specifying a default set of multilibs: @samp{sm_30}.
Any duplicates are filtered out.
If @option{--with-multilib-list} is not specified, then
@option{--with-multilib-list=default} is assumed.
For @samp{sm_30}, @samp{sm_35} target libraries, @option{-mptx-3.1}
sub-variants are additionally built.
@item riscv*-*-*
@var{list} is a single ABI name. The target architecture must be either
@code{rv32gc} or @code{rv64gc}. This will build a single multilib for the
@ -4609,8 +4631,16 @@ corresponding target libraries.
The default is @option{--with-arch=sm_30}.
For example, if @option{--with-arch=sm_70} is specified,
@option{-march=sm_30} and @option{-march=sm_70} target libraries are
built, and code generation defaults to @option{-march=sm_70}.
code generation defaults to @option{-march=sm_70} and
corresponding target libraries are built, in addition to those
mandated by @option{--with-multilib-list}, if any,
@ifnothtml
@pxref{with-multilib-list,,@option{--with-multilib-list}}.
@end ifnothtml
@ifhtml
see
@uref{configure.html#with-multilib-list,,@option{--with-multilib-list}}.
@end ifhtml
@html
<hr />

View file

@ -30044,10 +30044,12 @@ supported.
@opindex march
@item -march=@var{architecture-string}
Generate code for the specified PTX ISA target architecture
(e.g.@: @samp{sm_35}). Valid architecture strings are @samp{sm_30},
@samp{sm_35}, @samp{sm_53}, @samp{sm_70}, @samp{sm_75} and
@samp{sm_80}.
Generate code for the specified PTX ISA target architecture.
Valid architecture strings are
@samp{sm_30}, @samp{sm_35},
@samp{sm_53},
@samp{sm_70}, @samp{sm_75},
and @samp{sm_80}.
The default depends on how the compiler has been configured, see
@option{--with-arch}.