[gcn][patch] Add -mgpu option and plumb in assembler/linker

Thomas Schwinge thomas@codesourcery.com
Thu Jun 1 08:52:00 GMT 2017


Hi!

Sorry for the late reply.

On Fri, 28 Apr 2017 18:06:39 +0100, Andrew Stubbs <ams@codesourcery.com> wrote:
> 3. Add -mgpu option and corresponding --with-gpu. I've deliberately used 
> "gpu" instead of "cpu" because I want offloading compilers to be able to 
> say "-mcpu=foo -foffload=-mgpu=bar", or even have the host compiler just 
> understand -mgpu and DTRT.

I'm not sure I understand your last statement, or the intentions behind
it.

How would the host compiler (be able to) understand (or, disambiguate)
"-mgpu=[...]" in the (default) case of several offloading targets having
been configured?  I think it holds that "-m[...]" etc. must/can always
only apply to the current target (or "host", in "offloading speak").

And then, I don't have any strong opinion, but I don't see why a new
"-mgpu" option is preferable to using the existing "-march" etc. in
"-foffload=[...]".  For example, you can already now do things like
(exemplary):

    -march=x86_64 -foffload=-march=generic -foffload=nvptx-none=-march=cc_50 -foffload=gcn=-march=carrizo
    ^ target-specific ^ offload-target-specific, unless overridden... ^ ... here... ^ ..., and here

Likewise for the new "--with-gpu=[...]" vs. the existing
"--with-arch=[...]", where again I would, unless there is a specific
reason (that I didn't understand here), default to using the existing
option names instead of introducing new ones.


Grüße
 Thomas


> commit 5058457b0fa07865b366832828e74a53e5bd2964
> Author: Andrew Stubbs <ams@codesourcery.com>
> Date:   Fri Apr 28 14:37:25 2017 +0100
> 
>     Add -mgpu
>     
>     2017-04-28  Andrew Stubbs  <ams@codesourcery.com>
>     
>     	gcc/
>     	* config.gcc (amdgcn): Remove --with-arch and --with-tune.
>     	Add --with-gpu, and set default to "carrizo"
>     	(add_defaults): Add "gpu".
>     	* config/gcn/gcn-opts.h: New file.
>     	* config/gcn/gcn.c (output_file_start): Switch to HSACO version
>     	2 and auto-detection of GPU type (from -mcpu).
>     	(gcn_arch, gcn_tune): Remove.
>     	* config/gcn/gcn.h: Include gcn-opts.h.
>     	(enum processor_type): Move to gcn-opts.h.
>     	(LIBGCC_SPEC, ASM_SPEC, LINK_SPEC): Define.
>     	(gcn_arch, gcn_tune): Remove.
>     	(OPTION_DEFAULT_SPECS): Remove "arch" and "tune"; add "gpu".
>     	* config/gcn/gcn.opt: Include gcn-opts.h.
>     	(gpu_type): New Enum.
>     	(mgpu): New option.
> 
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 4a77b66..b1df533 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -3901,20 +3901,20 @@ case "${target}" in
>  		;;
>  
>  	amdgcn-*-*)
> -		supported_defaults="arch tune"
> +		supported_defaults="gpu"
>  
> -		for which in arch tune; do
> -			eval "val=\$with_$which"
> -			case ${val} in
> -			"" | fiji)
> -				# OK
> -				;;
> -			*)
> -				echo "Unknown cpu used in --with-$which=$val." 1>&2
> -				exit 1
> -				;;
> -			esac
> -		done
> +		case "$with_gpu" in
> +		"")
> +			with_gpu=carrizo
> +			;;
> +		carrizo | fiji)
> +			# OK
> +			;;
> +		*)
> +			echo "Unknown gpu used in --with-gpu=$val." 1>&2
> +			exit 1
> +			;;
> +		esac
>  		;;
>  
>  	hppa*-*-*)
> @@ -4646,7 +4646,7 @@ case ${target} in
>  esac
>  
>  t=
> -all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1 madd4"
> +all_defaults="abi cpu cpu_32 cpu_64 arch arch_32 arch_64 tune tune_32 tune_64 schedule float mode fpu nan fp_32 odd_spreg_32 divide llsc mips-plt synci tls lxc1-sxc1 madd4 gpu"
>  for option in $all_defaults
>  do
>  	eval "val=\$with_"`echo $option | sed s/-/_/g`
> diff --git a/gcc/config/gcn/gcn-opts.h b/gcc/config/gcn/gcn-opts.h
> new file mode 100644
> index 0000000..d0586d6
> --- /dev/null
> +++ b/gcc/config/gcn/gcn-opts.h
> @@ -0,0 +1,27 @@
> +/* Copyright (C) 2016-2017 Free Software Foundation, Inc.
> +
> +   This file is free software; you can redistribute it and/or modify it under
> +   the terms of the GNU General Public License as published by the Free
> +   Software Foundation; either version 3 of the License, or (at your option)
> +   any later version.
> +
> +   This file is distributed in the hope that it will be useful, but WITHOUT
> +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +   for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with GCC; see the file COPYING3.  If not see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef GCN_OPTS_H
> +#define GCN_OPTS_H
> +
> +/* Which processor to generate code or schedule for.  */
> +enum processor_type
> +{
> +  PROCESSOR_CARRIZO,
> +  PROCESSOR_FIJI
> +};
> +
> +#endif
> diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
> index eb6edd8..f378bf8 100644
> --- a/gcc/config/gcn/gcn.c
> +++ b/gcc/config/gcn/gcn.c
> @@ -60,11 +60,6 @@
>  /* This file should be included last.  */
>  #include "target-def.h"
>  
> -/* Which instruction set architecture to use.  */
> -int gcn_arch;
> -/* Which cpu are we tuning for.  */
> -int gcn_tune;
> -
>  static REAL_VALUE_TYPE dconst4, dconst1over2pi;
>  static bool ext_gcn_constants_init = 0;
>  
> @@ -2006,8 +2001,8 @@ static void
>  output_file_start (void)
>  {
>    fprintf (asm_out_file, "\t.hsatext\n");
> -  fprintf (asm_out_file, "\t.hsa_code_object_version 1,0\n");
> -  fprintf (asm_out_file, "\t.hsa_code_object_isa 8,0,1,\"AMD\",\"AMDGPU\"\n");
> +  fprintf (asm_out_file, "\t.hsa_code_object_version 2,0\n");
> +  fprintf (asm_out_file, "\t.hsa_code_object_isa\n");  // Autodetect
>    fprintf (asm_out_file, "\t.section\t.AMDGPU.config\n");
>    fprintf (asm_out_file, "\t.hsatext\n");
>  }
> diff --git a/gcc/config/gcn/gcn.h b/gcc/config/gcn/gcn.h
> index 903022f..a3f9463 100644
> --- a/gcc/config/gcn/gcn.h
> +++ b/gcc/config/gcn/gcn.h
> @@ -14,25 +14,28 @@
>     along with GCC; see the file COPYING3.  If not see
>     <http://www.gnu.org/licenses/>.  */
>  
> +#include "config/gcn/gcn-opts.h"
> +
>  

>  /* FIXME */
>  #define TARGET_CPU_CPP_BUILTINS()
>  
> -/* Which processor to generate code or schedule for.  */
> -enum processor_type
> -{
> -  PROCESSOR_CARRIZO,
> -};
> +/* Temporarily disable libgcc until one actually exists.  */
> +#undef  LIBGCC_SPEC
> +#define LIBGCC_SPEC ""
> +
> +/* Use LLVM assembler options.  */
> +#undef ASM_SPEC
> +#define ASM_SPEC "-triple=amdgcn--amdhsa %{mgpu=*:-mcpu=%*} -filetype=obj"
>  
> -extern GTY(()) int gcn_arch;
> -extern GTY(()) int gcn_tune;
> +/* Default to relocatable executables as output.  */
> +#undef LINK_SPEC
> +#define LINK_SPEC "-shared"
>  
>  /* Support for a compile-time default architecture and tuning.  The rules are:
> -   --with-arch is ignored if -march is specified.
> -   --with-tune is ignored if -mtune is specified.  */
> +   --with-gpu is ignored if -mgpu is specified.  */
>  #define OPTION_DEFAULT_SPECS \
> -  {"arch", "%{!march=*:-march=%(VALUE)}" }, \
> -  {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }
> +  {"gpu", "%{!mgpu=*:-mgpu=%(VALUE)}"}
>  
>  /* Default target_flags if no switches specified.  */
>  #ifndef TARGET_DEFAULT
> diff --git a/gcc/config/gcn/gcn.opt b/gcc/config/gcn/gcn.opt
> index 8fc02b7..77f0ef0 100644
> --- a/gcc/config/gcn/gcn.opt
> +++ b/gcc/config/gcn/gcn.opt
> @@ -17,3 +17,20 @@
>  ; You should have received a copy of the GNU General Public License
>  ; along with GCC; see the file COPYING3.  If not see
>  ; <http://www.gnu.org/licenses/>.
> +
> +HeaderInclude
> +config/gcn/gcn-opts.h
> +
> +Enum
> +Name(gpu_type) Type(enum processor_type)
> +GCN GPU type to use:
> +
> +EnumValue
> +Enum(gpu_type) String(carrizo) Value(PROCESSOR_CARRIZO)
> +
> +EnumValue
> +Enum(gpu_type) String(fiji) Value(PROCESSOR_FIJI)
> +
> +mgpu=
> +Target RejectNegative Joined ToLower Enum(gpu_type) Var(gcn_gpu) Init(PROCESSOR_CARRIZO)
> +Specify the name of the target GPU.



More information about the Gcc-patches mailing list