diff mbox

libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test (was: check-target-libgomp wall time, without vs. with offloading)

Message ID 87mvo8zsx8.fsf@hertz.schwinge.homeip.net
State New
Headers show

Commit Message

Thomas Schwinge May 2, 2016, 9:54 a.m. UTC
Hi Jakub!

On Fri, 29 Apr 2016 09:43:41 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> On Thu, Apr 28, 2016 at 12:43:43PM +0200, Thomas Schwinge wrote:
> > commit 3b521f3e35fdb4b320e95b5f6a82b8d89399481a
> > Author: Thomas Schwinge <thomas@codesourcery.com>
> > Date:   Thu Apr 21 11:36:39 2016 +0200
> > 
> >     libgomp: Unconfuse offload plugins vs. offload targets
> 
> I don't like this patch at all, rather than unconfusing stuff it
> makes stuff confusing.  Plugins are just a way to support various
> offloading targets.

Huh; my patch exactly clarifies that the offload_targets variable does
not actually list offload target names, but does list libgomp offload
plugin names...

> Can you please post just a short patch without all those changes
> that does what you want, rather than renaming everything at the same time?

I thought incremental, self-contained patches were easier to review.
Anyway, here's the three patches merged into one:

commit 8060ae3474072eef685381d80f566d1c0942c603
Author: Thomas Schwinge <thomas@codesourcery.com>
Date:   Thu Apr 21 11:36:39 2016 +0200

    libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test
    
    	libgomp/
    	* plugin/configfrag.ac (offload_targets): Actually enumerate
    	offload targets, and add...
    	(offload_plugins): ... this one to enumerate offload plugins.
    	(OFFLOAD_PLUGINS): Renamed from OFFLOAD_TARGETS.
    	* target.c (gomp_target_init): Adjust to that.
    	* testsuite/lib/libgomp.exp: Likewise.
    	(offload_targets_s, offload_targets_s_openacc): Remove variables.
    	(offload_target_to_openacc_device_type): New proc.
    	(check_effective_target_openacc_nvidia_accel_selected)
    	(check_effective_target_openacc_host_selected): Examine
    	$openacc_device_type instead of $offload_target_openacc.
    	* Makefile.in: Regenerate.
    	* config.h.in: Likewise.
    	* configure: Likewise.
    	* testsuite/Makefile.in: Likewise.
    	* testsuite/libgomp.oacc-c++/c++.exp: Cycle through
    	$offload_targets (plus "disable") instead of
    	$offload_targets_s_openacc, and add "-foffload=$offload_target" to
    	tagopt.
    	* testsuite/libgomp.oacc-c/c.exp: Likewise.
    	* testsuite/libgomp.oacc-fortran/fortran.exp: Likewise.
---
 libgomp/Makefile.in                                |  1 +
 libgomp/config.h.in                                |  4 +-
 libgomp/configure                                  | 44 +++++++------
 libgomp/plugin/configfrag.ac                       | 39 +++++++-----
 libgomp/target.c                                   |  8 +--
 libgomp/testsuite/Makefile.in                      |  1 +
 libgomp/testsuite/lib/libgomp.exp                  | 72 ++++++++++------------
 libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 30 +++++----
 libgomp/testsuite/libgomp.oacc-c/c.exp             | 30 +++++----
 libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 22 ++++---
 10 files changed, 142 insertions(+), 109 deletions(-)



Grüße
 Thomas

Comments

Thomas Schwinge May 11, 2016, 1:45 p.m. UTC | #1
Hi!

Ping.

On Mon, 02 May 2016 11:54:27 +0200, I wrote:
> On Fri, 29 Apr 2016 09:43:41 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> > On Thu, Apr 28, 2016 at 12:43:43PM +0200, Thomas Schwinge wrote:
> > > commit 3b521f3e35fdb4b320e95b5f6a82b8d89399481a
> > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > 
> > >     libgomp: Unconfuse offload plugins vs. offload targets
> > 
> > I don't like this patch at all, rather than unconfusing stuff it
> > makes stuff confusing.  Plugins are just a way to support various
> > offloading targets.
> 
> Huh; my patch exactly clarifies that the offload_targets variable does
> not actually list offload target names, but does list libgomp offload
> plugin names...
> 
> > Can you please post just a short patch without all those changes
> > that does what you want, rather than renaming everything at the same time?
> 
> I thought incremental, self-contained patches were easier to review.
> Anyway, here's the three patches merged into one:
> 
> commit 8060ae3474072eef685381d80f566d1c0942c603
> Author: Thomas Schwinge <thomas@codesourcery.com>
> Date:   Thu Apr 21 11:36:39 2016 +0200
> 
>     libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test
>     
>     	libgomp/
>     	* plugin/configfrag.ac (offload_targets): Actually enumerate
>     	offload targets, and add...
>     	(offload_plugins): ... this one to enumerate offload plugins.
>     	(OFFLOAD_PLUGINS): Renamed from OFFLOAD_TARGETS.
>     	* target.c (gomp_target_init): Adjust to that.
>     	* testsuite/lib/libgomp.exp: Likewise.
>     	(offload_targets_s, offload_targets_s_openacc): Remove variables.
>     	(offload_target_to_openacc_device_type): New proc.
>     	(check_effective_target_openacc_nvidia_accel_selected)
>     	(check_effective_target_openacc_host_selected): Examine
>     	$openacc_device_type instead of $offload_target_openacc.
>     	* Makefile.in: Regenerate.
>     	* config.h.in: Likewise.
>     	* configure: Likewise.
>     	* testsuite/Makefile.in: Likewise.
>     	* testsuite/libgomp.oacc-c++/c++.exp: Cycle through
>     	$offload_targets (plus "disable") instead of
>     	$offload_targets_s_openacc, and add "-foffload=$offload_target" to
>     	tagopt.
>     	* testsuite/libgomp.oacc-c/c.exp: Likewise.
>     	* testsuite/libgomp.oacc-fortran/fortran.exp: Likewise.
> ---
>  libgomp/Makefile.in                                |  1 +
>  libgomp/config.h.in                                |  4 +-
>  libgomp/configure                                  | 44 +++++++------
>  libgomp/plugin/configfrag.ac                       | 39 +++++++-----
>  libgomp/target.c                                   |  8 +--
>  libgomp/testsuite/Makefile.in                      |  1 +
>  libgomp/testsuite/lib/libgomp.exp                  | 72 ++++++++++------------
>  libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 30 +++++----
>  libgomp/testsuite/libgomp.oacc-c/c.exp             | 30 +++++----
>  libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 22 ++++---
>  10 files changed, 142 insertions(+), 109 deletions(-)
> 
> diff --git libgomp/Makefile.in libgomp/Makefile.in
> [snipped]
> diff --git libgomp/config.h.in libgomp/config.h.in
> [snipped]
> diff --git libgomp/configure libgomp/configure
> [snipped]
> diff --git libgomp/plugin/configfrag.ac libgomp/plugin/configfrag.ac
> index 88b4156..de0a6f6 100644
> --- libgomp/plugin/configfrag.ac
> +++ libgomp/plugin/configfrag.ac
> @@ -26,8 +26,6 @@
>  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  # <http://www.gnu.org/licenses/>.
>  
> -offload_targets=
> -AC_SUBST(offload_targets)
>  plugin_support=yes
>  AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
>  if test x"$plugin_support" = xyes; then
> @@ -142,7 +140,13 @@ AC_SUBST(PLUGIN_HSA_LIBS)
>  
>  
>  
> -# Get offload targets and path to install tree of offloading compiler.
> +# Parse offload targets, and figure out libgomp plugin, and configure the
> +# corresponding offload compiler.  offload_plugins and offload_targets will be
> +# populated in the same order.
> +offload_plugins=
> +offload_targets=
> +AC_SUBST(offload_plugins)
> +AC_SUBST(offload_targets)
>  offload_additional_options=
>  offload_additional_lib_paths=
>  AC_SUBST(offload_additional_options)
> @@ -151,13 +155,13 @@ if test x"$enable_offload_targets" != x; then
>    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
>      tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
>      tgt=`echo $tgt | sed 's/=.*//'`
> -    tgt_name=
> +    tgt_plugin=
>      case $tgt in
>        *-intelmic-* | *-intelmicemul-*)
> -	tgt_name=intelmic
> +	tgt_plugin=intelmic
>  	;;
>        nvptx*)
> -        tgt_name=nvptx
> +	tgt_plugin=nvptx
>  	PLUGIN_NVPTX=$tgt
>  	PLUGIN_NVPTX_CPPFLAGS=$CUDA_DRIVER_CPPFLAGS
>  	PLUGIN_NVPTX_LDFLAGS=$CUDA_DRIVER_LDFLAGS
> @@ -184,7 +188,7 @@ if test x"$enable_offload_targets" != x; then
>  	    ;;
>  	esac
>  	;;
> -      hsa*)
> +      hsa)
>  	case "${target}" in
>  	  x86_64-*-*)
>  	    case " ${CC} ${CFLAGS} " in
> @@ -192,7 +196,7 @@ if test x"$enable_offload_targets" != x; then
>  	        PLUGIN_HSA=0
>  		;;
>  	      *)
> -	        tgt_name=hsa
> +		tgt_plugin=hsa
>  	        PLUGIN_HSA=$tgt
>  	        PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
>  	        PLUGIN_HSA_LDFLAGS="$HSA_RUNTIME_LDFLAGS $HSA_KMT_LDFLAGS"
> @@ -214,7 +218,7 @@ if test x"$enable_offload_targets" != x; then
>  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
>  	        LIBS=$PLUGIN_HSA_save_LIBS
>  	        case $PLUGIN_HSA in
> -	          hsa*)
> +		  hsa)
>  	            HSA_PLUGIN=0
>  	            AC_MSG_ERROR([HSA run-time package required for HSA support])
>  	            ;;
> @@ -231,16 +235,19 @@ if test x"$enable_offload_targets" != x; then
>  	AC_MSG_ERROR([unknown offload target specified])
>  	;;
>      esac
> -    if test x"$tgt_name" = x; then
> +    if test x"$tgt_plugin" = x; then
>        # Don't configure libgomp for this offloading target if we don't build
>        # the corresponding plugin.
>        continue
> -    elif test x"$offload_targets" = x; then
> -      offload_targets=$tgt_name
> +    elif test x"$offload_plugins" = x; then
> +      offload_plugins=$tgt_plugin
> +      offload_targets=$tgt
>      else
> -      offload_targets=$offload_targets,$tgt_name
> +      offload_plugins=$offload_plugins,$tgt_plugin
> +      offload_targets=$offload_targets,$tgt
>      fi
> -    if test "$tgt_name" = hsa; then
> +    # Configure additional search paths.
> +    if test "$tgt_plugin" = hsa; then
>        # Offloading compilation is all handled by the target compiler.
>        :
>      elif test x"$tgt_dir" != x; then
> @@ -252,8 +259,8 @@ if test x"$enable_offload_targets" != x; then
>      fi
>    done
>  fi
> -AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
> -  [Define to offload targets, separated by commas.])
> +AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
> +  [Define to offload plugins, separated by commas.])
>  AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
>  AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
>    [Define to 1 if the NVIDIA plugin is built, 0 if not.])
> diff --git libgomp/target.c libgomp/target.c
> index e2dd0e0..c12c085 100644
> --- libgomp/target.c
> +++ libgomp/target.c
> @@ -2467,9 +2467,9 @@ gomp_target_fini (void)
>      }
>  }
>  
> -/* This function initializes the runtime needed for offloading.
> -   It parses the list of offload targets and tries to load the plugins for
> -   these targets.  On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> +/* This function initializes the runtime for offloading.
> +   It parses the list of offload plugins, and tries to load these.
> +   On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
>     will be set, and the array DEVICES initialized, containing descriptors for
>     corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows
>     by the others.  */
> @@ -2486,7 +2486,7 @@ gomp_target_init (void)
>    num_devices = 0;
>    devices = NULL;
>  
> -  cur = OFFLOAD_TARGETS;
> +  cur = OFFLOAD_PLUGINS;
>    if (*cur)
>      do
>        {
> diff --git libgomp/testsuite/Makefile.in libgomp/testsuite/Makefile.in
> [snipped]
> diff --git libgomp/testsuite/lib/libgomp.exp libgomp/testsuite/lib/libgomp.exp
> index 1cb4991..4a25421 100644
> --- libgomp/testsuite/lib/libgomp.exp
> +++ libgomp/testsuite/lib/libgomp.exp
> @@ -36,28 +36,6 @@ load_gcc_lib fortran-modules.exp
>  # Try to load a test support file, built during libgomp configuration.
>  load_file libgomp-test-support.exp
>  
> -# Populate offload_targets_s (offloading targets separated by a space), and
> -# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
> -# some of them a little differently).
> -set offload_targets_s [split $offload_targets ","]
> -set offload_targets_s_openacc {}
> -foreach offload_target_openacc $offload_targets_s {
> -    # Translate to OpenACC names, or skip if not yet supported.
> -    switch $offload_target_openacc {
> -	intelmic {
> -	    continue
> -	}
> -	nvptx {
> -	    set offload_target_openacc "nvidia"
> -	}
> -	hsa {
> -	    continue
> -	}
> -    }
> -    lappend offload_targets_s_openacc "$offload_target_openacc"
> -}
> -lappend offload_targets_s_openacc "host"
> -
>  set dg-do-what-default run
>  
>  #
> @@ -135,9 +113,9 @@ proc libgomp_init { args } {
>      set always_ld_library_path ".:${blddir}/.libs"
>  
>      # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
> -    # non-fallback testing for Intel MIC targets
> +    # Intel MIC offloading testing.
>      global offload_targets
> -    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
> +    if { [string match "*,*-intelmic*,*" ",$offload_targets,"] } {
>  	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
>  	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
>  	# libstdc++ is required by liboffloadmic
> @@ -245,8 +223,7 @@ proc libgomp_init { args } {
>      # Disable color diagnostics
>      lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"
>  
> -    # Used for support non-fallback offloading.
> -    # Help GCC to find target mkoffload.
> +    # Help GCC to find offload compilers' mkoffload.
>      global offload_additional_options
>      if { $offload_additional_options != "" } {
>  	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
> @@ -322,6 +299,28 @@ proc libgomp_option_proc { option } {
>      }
>  }
>  
> +# Translate offload target to OpenACC device type.  Return the empty string if
> +# not suitable or not yet supported, and "host" for offload target "disable".
> +proc offload_target_to_openacc_device_type { offload_target } {
> +    switch -glob $offload_target {
> +	disable {
> +	    return "host"
> +	}
> +	hsa {
> +	    return ""
> +	}
> +	*-intelmic* {
> +	    return ""
> +	}
> +	nvptx* {
> +	    return "nvidia"
> +	}
> +	default {
> +	    error "Unknwon offload target: $offload_target"
> +	}
> +    }
> +}
> +
>  # Return 1 if offload device is available.
>  proc check_effective_target_offload_device { } {
>      return [check_runtime_nocache offload_device_available_ {
> @@ -373,29 +372,22 @@ proc check_effective_target_openacc_nvidia_accel_present { } {
>      } "" ]
>  }
>  
> -# Return 1 if at least one nvidia board is present, and the nvidia device type
> -# is selected by default by means of setting the environment variable
> -# ACC_DEVICE_TYPE.
> +# Return 1 if at least one nvidia board is present, and the OpenACC "nvidia"
> +# device type is selected.
>  
>  proc check_effective_target_openacc_nvidia_accel_selected { } {
>      if { ![check_effective_target_openacc_nvidia_accel_present] } {
>  	return 0;
>      }
> -    global offload_target_openacc
> -    if { $offload_target_openacc == "nvidia" } {
> -        return 1;
> -    }
> -    return 0;
> +    global openacc_device_type
> +    return [string match "nvidia" $openacc_device_type]
>  }
>  
> -# Return 1 if the host target is selected for offloaded
> +# Return 1 if the OpenACC "host" device type is selected.
>  
>  proc check_effective_target_openacc_host_selected { } {
> -    global offload_target_openacc
> -    if { $offload_target_openacc == "host" } {
> -        return 1;
> -    }
> -    return 0;
> +    global openacc_device_type
> +    return [string match "host" $openacc_device_type]
>  }
>  
>  # Return 1 if the selected OMP device is actually a HSA device
> diff --git libgomp/testsuite/libgomp.oacc-c++/c++.exp libgomp/testsuite/libgomp.oacc-c++/c++.exp
> index 608b298..befb921 100644
> --- libgomp/testsuite/libgomp.oacc-c++/c++.exp
> +++ libgomp/testsuite/libgomp.oacc-c++/c++.exp
> @@ -70,18 +70,23 @@ if { $lang_test_file_found } {
>  	set libstdcxx_includes ""
>      }
>  
> -    # Test OpenACC with available accelerators.
> -    foreach offload_target_openacc $offload_targets_s_openacc {
> -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> +    # Test with all offload targets, and with offloading disabled.
> +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
>  
> -	switch $offload_target_openacc {
> -	    host {
> +	switch $openacc_device_type {
> +	    "" {
> +		untested "$subdir $offload_target offloading"
> +		continue
> +	    }
> +	    "host" {
>  		set acc_mem_shared 1
>  	    }
> -	    nvidia {
> +	    "nvidia" {
>  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
>  		    # Don't bother; execution testing is going to FAIL.
> -		    untested "$subdir $offload_target_openacc offloading"
> +		    untested "$subdir $offload_target offloading"
>  		    continue
>  		}
>  
> @@ -94,12 +99,15 @@ if { $lang_test_file_found } {
>  		set acc_mem_shared 0
>  	    }
>  	    default {
> -		set acc_mem_shared 0
> +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
>  	    }
>  	}
>  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
>  
> -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> +	# To avoid overhead, by default only build for the offload target that
> +	# we're actually going to test.
> +	set tagopt "$tagopt -foffload=$offload_target"
> +	setenv ACC_DEVICE_TYPE $openacc_device_type
>  
>  	# To get better test coverage for device-specific code that is only
>  	# ever used in offloading configurations, we'd like more thorough
> @@ -108,8 +116,8 @@ if { $lang_test_file_found } {
>  	# -O0 and -O2 only, to avoid testing times exploding too much, under
>  	# the assumption that between -O0 and -O[something] there is the
>  	# biggest difference in the overall structure of the generated code.
> -	switch $offload_target_openacc {
> -	    host {
> +	switch $offload_target {
> +	    "disable" {
>  		set-torture-options [list \
>  					 { -O2 } ]
>  	    }
> diff --git libgomp/testsuite/libgomp.oacc-c/c.exp libgomp/testsuite/libgomp.oacc-c/c.exp
> index b509a10..5355b87 100644
> --- libgomp/testsuite/libgomp.oacc-c/c.exp
> +++ libgomp/testsuite/libgomp.oacc-c/c.exp
> @@ -31,20 +31,25 @@ set ld_library_path $always_ld_library_path
>  append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
>  set_ld_library_path_env_vars
>  
> -# Test OpenACC with available accelerators.
> +# Test with all offload targets, and with offloading disabled.
>  set SAVE_ALWAYS_CFLAGS "$ALWAYS_CFLAGS"
> -foreach offload_target_openacc $offload_targets_s_openacc {
> +foreach offload_target [concat [split $offload_targets ","] "disable"] {
>      set ALWAYS_CFLAGS "$SAVE_ALWAYS_CFLAGS"
> -    set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> +    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> +    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
>  
> -    switch $offload_target_openacc {
> -	host {
> +    switch $openacc_device_type {
> +	"" {
> +	    untested "$subdir $offload_target offloading"
> +	    continue
> +	}
> +	"host" {
>  	    set acc_mem_shared 1
>  	}
> -	nvidia {
> +	"nvidia" {
>  	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
>  		# Don't bother; execution testing is going to FAIL.
> -		untested "$subdir $offload_target_openacc offloading"
> +		untested "$subdir $offload_target offloading"
>  		continue
>  	    }
>  
> @@ -57,12 +62,15 @@ foreach offload_target_openacc $offload_targets_s_openacc {
>  	    set acc_mem_shared 0
>  	}
>  	default {
> -	    set acc_mem_shared 0
> +	    error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
>  	}
>      }
>      set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
>  
> -    setenv ACC_DEVICE_TYPE $offload_target_openacc
> +    # To avoid overhead, by default only build for the offload target that
> +    # we're actually going to test.
> +    set tagopt "$tagopt -foffload=$offload_target"
> +    setenv ACC_DEVICE_TYPE $openacc_device_type
>  
>      # To get better test coverage for device-specific code that is only
>      # ever used in offloading configurations, we'd like more thorough
> @@ -71,8 +79,8 @@ foreach offload_target_openacc $offload_targets_s_openacc {
>      # -O0 and -O2 only, to avoid testing times exploding too much, under
>      # the assumption that between -O0 and -O[something] there is the
>      # biggest difference in the overall structure of the generated code.
> -    switch $offload_target_openacc {
> -	host {
> +    switch $offload_target {
> +	"disable" {
>  	    set-torture-options [list \
>  				     { -O2 } ]
>  	}
> diff --git libgomp/testsuite/libgomp.oacc-fortran/fortran.exp libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> index 2d6b647..8507b67 100644
> --- libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> +++ libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> @@ -65,30 +65,38 @@ if { $lang_test_file_found } {
>      append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
>      set_ld_library_path_env_vars
>  
> -    # Test OpenACC with available accelerators.
> -    foreach offload_target_openacc $offload_targets_s_openacc {
> -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> +    # Test with all offload targets, and with offloading disabled.
> +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
>  
> -	switch $offload_target_openacc {
> +	switch $openacc_device_type {
> +	    "" {
> +		untested "$subdir $offload_target offloading"
> +		continue
> +	    }
>  	    host {
>  		set acc_mem_shared 1
>  	    }
>  	    nvidia {
>  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
>  		    # Don't bother; execution testing is going to FAIL.
> -		    untested "$subdir $offload_target_openacc offloading"
> +		    untested "$subdir $offload_target offloading"
>  		    continue
>  		}
>  
>  		set acc_mem_shared 0
>  	    }
>  	    default {
> -		set acc_mem_shared 0
> +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
>  	    }
>  	}
>  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
>  
> -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> +	# To avoid overhead, by default only build for the offload target that
> +	# we're actually going to test.
> +	set tagopt "$tagopt -foffload=$offload_target"
> +	setenv ACC_DEVICE_TYPE $openacc_device_type
>  
>  	# For Fortran we're doing torture testing, as Fortran has far more tests
>  	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is


Grüße
 Thomas
Thomas Schwinge May 18, 2016, 11:41 a.m. UTC | #2
Hi!

Ping.

On Wed, 11 May 2016 15:45:13 +0200, I wrote:
> Ping.
> 
> On Mon, 02 May 2016 11:54:27 +0200, I wrote:
> > On Fri, 29 Apr 2016 09:43:41 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> > > On Thu, Apr 28, 2016 at 12:43:43PM +0200, Thomas Schwinge wrote:
> > > > commit 3b521f3e35fdb4b320e95b5f6a82b8d89399481a
> > > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > > 
> > > >     libgomp: Unconfuse offload plugins vs. offload targets
> > > 
> > > I don't like this patch at all, rather than unconfusing stuff it
> > > makes stuff confusing.  Plugins are just a way to support various
> > > offloading targets.
> > 
> > Huh; my patch exactly clarifies that the offload_targets variable does
> > not actually list offload target names, but does list libgomp offload
> > plugin names...
> > 
> > > Can you please post just a short patch without all those changes
> > > that does what you want, rather than renaming everything at the same time?
> > 
> > I thought incremental, self-contained patches were easier to review.
> > Anyway, here's the three patches merged into one:
> > 
> > commit 8060ae3474072eef685381d80f566d1c0942c603
> > Author: Thomas Schwinge <thomas@codesourcery.com>
> > Date:   Thu Apr 21 11:36:39 2016 +0200
> > 
> >     libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test
> >     
> >     	libgomp/
> >     	* plugin/configfrag.ac (offload_targets): Actually enumerate
> >     	offload targets, and add...
> >     	(offload_plugins): ... this one to enumerate offload plugins.
> >     	(OFFLOAD_PLUGINS): Renamed from OFFLOAD_TARGETS.
> >     	* target.c (gomp_target_init): Adjust to that.
> >     	* testsuite/lib/libgomp.exp: Likewise.
> >     	(offload_targets_s, offload_targets_s_openacc): Remove variables.
> >     	(offload_target_to_openacc_device_type): New proc.
> >     	(check_effective_target_openacc_nvidia_accel_selected)
> >     	(check_effective_target_openacc_host_selected): Examine
> >     	$openacc_device_type instead of $offload_target_openacc.
> >     	* Makefile.in: Regenerate.
> >     	* config.h.in: Likewise.
> >     	* configure: Likewise.
> >     	* testsuite/Makefile.in: Likewise.
> >     	* testsuite/libgomp.oacc-c++/c++.exp: Cycle through
> >     	$offload_targets (plus "disable") instead of
> >     	$offload_targets_s_openacc, and add "-foffload=$offload_target" to
> >     	tagopt.
> >     	* testsuite/libgomp.oacc-c/c.exp: Likewise.
> >     	* testsuite/libgomp.oacc-fortran/fortran.exp: Likewise.
> > ---
> >  libgomp/Makefile.in                                |  1 +
> >  libgomp/config.h.in                                |  4 +-
> >  libgomp/configure                                  | 44 +++++++------
> >  libgomp/plugin/configfrag.ac                       | 39 +++++++-----
> >  libgomp/target.c                                   |  8 +--
> >  libgomp/testsuite/Makefile.in                      |  1 +
> >  libgomp/testsuite/lib/libgomp.exp                  | 72 ++++++++++------------
> >  libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 30 +++++----
> >  libgomp/testsuite/libgomp.oacc-c/c.exp             | 30 +++++----
> >  libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 22 ++++---
> >  10 files changed, 142 insertions(+), 109 deletions(-)
> > 
> > diff --git libgomp/Makefile.in libgomp/Makefile.in
> > [snipped]
> > diff --git libgomp/config.h.in libgomp/config.h.in
> > [snipped]
> > diff --git libgomp/configure libgomp/configure
> > [snipped]
> > diff --git libgomp/plugin/configfrag.ac libgomp/plugin/configfrag.ac
> > index 88b4156..de0a6f6 100644
> > --- libgomp/plugin/configfrag.ac
> > +++ libgomp/plugin/configfrag.ac
> > @@ -26,8 +26,6 @@
> >  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> >  # <http://www.gnu.org/licenses/>.
> >  
> > -offload_targets=
> > -AC_SUBST(offload_targets)
> >  plugin_support=yes
> >  AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
> >  if test x"$plugin_support" = xyes; then
> > @@ -142,7 +140,13 @@ AC_SUBST(PLUGIN_HSA_LIBS)
> >  
> >  
> >  
> > -# Get offload targets and path to install tree of offloading compiler.
> > +# Parse offload targets, and figure out libgomp plugin, and configure the
> > +# corresponding offload compiler.  offload_plugins and offload_targets will be
> > +# populated in the same order.
> > +offload_plugins=
> > +offload_targets=
> > +AC_SUBST(offload_plugins)
> > +AC_SUBST(offload_targets)
> >  offload_additional_options=
> >  offload_additional_lib_paths=
> >  AC_SUBST(offload_additional_options)
> > @@ -151,13 +155,13 @@ if test x"$enable_offload_targets" != x; then
> >    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
> >      tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
> >      tgt=`echo $tgt | sed 's/=.*//'`
> > -    tgt_name=
> > +    tgt_plugin=
> >      case $tgt in
> >        *-intelmic-* | *-intelmicemul-*)
> > -	tgt_name=intelmic
> > +	tgt_plugin=intelmic
> >  	;;
> >        nvptx*)
> > -        tgt_name=nvptx
> > +	tgt_plugin=nvptx
> >  	PLUGIN_NVPTX=$tgt
> >  	PLUGIN_NVPTX_CPPFLAGS=$CUDA_DRIVER_CPPFLAGS
> >  	PLUGIN_NVPTX_LDFLAGS=$CUDA_DRIVER_LDFLAGS
> > @@ -184,7 +188,7 @@ if test x"$enable_offload_targets" != x; then
> >  	    ;;
> >  	esac
> >  	;;
> > -      hsa*)
> > +      hsa)
> >  	case "${target}" in
> >  	  x86_64-*-*)
> >  	    case " ${CC} ${CFLAGS} " in
> > @@ -192,7 +196,7 @@ if test x"$enable_offload_targets" != x; then
> >  	        PLUGIN_HSA=0
> >  		;;
> >  	      *)
> > -	        tgt_name=hsa
> > +		tgt_plugin=hsa
> >  	        PLUGIN_HSA=$tgt
> >  	        PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
> >  	        PLUGIN_HSA_LDFLAGS="$HSA_RUNTIME_LDFLAGS $HSA_KMT_LDFLAGS"
> > @@ -214,7 +218,7 @@ if test x"$enable_offload_targets" != x; then
> >  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
> >  	        LIBS=$PLUGIN_HSA_save_LIBS
> >  	        case $PLUGIN_HSA in
> > -	          hsa*)
> > +		  hsa)
> >  	            HSA_PLUGIN=0
> >  	            AC_MSG_ERROR([HSA run-time package required for HSA support])
> >  	            ;;
> > @@ -231,16 +235,19 @@ if test x"$enable_offload_targets" != x; then
> >  	AC_MSG_ERROR([unknown offload target specified])
> >  	;;
> >      esac
> > -    if test x"$tgt_name" = x; then
> > +    if test x"$tgt_plugin" = x; then
> >        # Don't configure libgomp for this offloading target if we don't build
> >        # the corresponding plugin.
> >        continue
> > -    elif test x"$offload_targets" = x; then
> > -      offload_targets=$tgt_name
> > +    elif test x"$offload_plugins" = x; then
> > +      offload_plugins=$tgt_plugin
> > +      offload_targets=$tgt
> >      else
> > -      offload_targets=$offload_targets,$tgt_name
> > +      offload_plugins=$offload_plugins,$tgt_plugin
> > +      offload_targets=$offload_targets,$tgt
> >      fi
> > -    if test "$tgt_name" = hsa; then
> > +    # Configure additional search paths.
> > +    if test "$tgt_plugin" = hsa; then
> >        # Offloading compilation is all handled by the target compiler.
> >        :
> >      elif test x"$tgt_dir" != x; then
> > @@ -252,8 +259,8 @@ if test x"$enable_offload_targets" != x; then
> >      fi
> >    done
> >  fi
> > -AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
> > -  [Define to offload targets, separated by commas.])
> > +AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
> > +  [Define to offload plugins, separated by commas.])
> >  AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
> >  AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
> >    [Define to 1 if the NVIDIA plugin is built, 0 if not.])
> > diff --git libgomp/target.c libgomp/target.c
> > index e2dd0e0..c12c085 100644
> > --- libgomp/target.c
> > +++ libgomp/target.c
> > @@ -2467,9 +2467,9 @@ gomp_target_fini (void)
> >      }
> >  }
> >  
> > -/* This function initializes the runtime needed for offloading.
> > -   It parses the list of offload targets and tries to load the plugins for
> > -   these targets.  On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> > +/* This function initializes the runtime for offloading.
> > +   It parses the list of offload plugins, and tries to load these.
> > +   On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> >     will be set, and the array DEVICES initialized, containing descriptors for
> >     corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows
> >     by the others.  */
> > @@ -2486,7 +2486,7 @@ gomp_target_init (void)
> >    num_devices = 0;
> >    devices = NULL;
> >  
> > -  cur = OFFLOAD_TARGETS;
> > +  cur = OFFLOAD_PLUGINS;
> >    if (*cur)
> >      do
> >        {
> > diff --git libgomp/testsuite/Makefile.in libgomp/testsuite/Makefile.in
> > [snipped]
> > diff --git libgomp/testsuite/lib/libgomp.exp libgomp/testsuite/lib/libgomp.exp
> > index 1cb4991..4a25421 100644
> > --- libgomp/testsuite/lib/libgomp.exp
> > +++ libgomp/testsuite/lib/libgomp.exp
> > @@ -36,28 +36,6 @@ load_gcc_lib fortran-modules.exp
> >  # Try to load a test support file, built during libgomp configuration.
> >  load_file libgomp-test-support.exp
> >  
> > -# Populate offload_targets_s (offloading targets separated by a space), and
> > -# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
> > -# some of them a little differently).
> > -set offload_targets_s [split $offload_targets ","]
> > -set offload_targets_s_openacc {}
> > -foreach offload_target_openacc $offload_targets_s {
> > -    # Translate to OpenACC names, or skip if not yet supported.
> > -    switch $offload_target_openacc {
> > -	intelmic {
> > -	    continue
> > -	}
> > -	nvptx {
> > -	    set offload_target_openacc "nvidia"
> > -	}
> > -	hsa {
> > -	    continue
> > -	}
> > -    }
> > -    lappend offload_targets_s_openacc "$offload_target_openacc"
> > -}
> > -lappend offload_targets_s_openacc "host"
> > -
> >  set dg-do-what-default run
> >  
> >  #
> > @@ -135,9 +113,9 @@ proc libgomp_init { args } {
> >      set always_ld_library_path ".:${blddir}/.libs"
> >  
> >      # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
> > -    # non-fallback testing for Intel MIC targets
> > +    # Intel MIC offloading testing.
> >      global offload_targets
> > -    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
> > +    if { [string match "*,*-intelmic*,*" ",$offload_targets,"] } {
> >  	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
> >  	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
> >  	# libstdc++ is required by liboffloadmic
> > @@ -245,8 +223,7 @@ proc libgomp_init { args } {
> >      # Disable color diagnostics
> >      lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"
> >  
> > -    # Used for support non-fallback offloading.
> > -    # Help GCC to find target mkoffload.
> > +    # Help GCC to find offload compilers' mkoffload.
> >      global offload_additional_options
> >      if { $offload_additional_options != "" } {
> >  	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
> > @@ -322,6 +299,28 @@ proc libgomp_option_proc { option } {
> >      }
> >  }
> >  
> > +# Translate offload target to OpenACC device type.  Return the empty string if
> > +# not suitable or not yet supported, and "host" for offload target "disable".
> > +proc offload_target_to_openacc_device_type { offload_target } {
> > +    switch -glob $offload_target {
> > +	disable {
> > +	    return "host"
> > +	}
> > +	hsa {
> > +	    return ""
> > +	}
> > +	*-intelmic* {
> > +	    return ""
> > +	}
> > +	nvptx* {
> > +	    return "nvidia"
> > +	}
> > +	default {
> > +	    error "Unknwon offload target: $offload_target"
> > +	}
> > +    }
> > +}
> > +
> >  # Return 1 if offload device is available.
> >  proc check_effective_target_offload_device { } {
> >      return [check_runtime_nocache offload_device_available_ {
> > @@ -373,29 +372,22 @@ proc check_effective_target_openacc_nvidia_accel_present { } {
> >      } "" ]
> >  }
> >  
> > -# Return 1 if at least one nvidia board is present, and the nvidia device type
> > -# is selected by default by means of setting the environment variable
> > -# ACC_DEVICE_TYPE.
> > +# Return 1 if at least one nvidia board is present, and the OpenACC "nvidia"
> > +# device type is selected.
> >  
> >  proc check_effective_target_openacc_nvidia_accel_selected { } {
> >      if { ![check_effective_target_openacc_nvidia_accel_present] } {
> >  	return 0;
> >      }
> > -    global offload_target_openacc
> > -    if { $offload_target_openacc == "nvidia" } {
> > -        return 1;
> > -    }
> > -    return 0;
> > +    global openacc_device_type
> > +    return [string match "nvidia" $openacc_device_type]
> >  }
> >  
> > -# Return 1 if the host target is selected for offloaded
> > +# Return 1 if the OpenACC "host" device type is selected.
> >  
> >  proc check_effective_target_openacc_host_selected { } {
> > -    global offload_target_openacc
> > -    if { $offload_target_openacc == "host" } {
> > -        return 1;
> > -    }
> > -    return 0;
> > +    global openacc_device_type
> > +    return [string match "host" $openacc_device_type]
> >  }
> >  
> >  # Return 1 if the selected OMP device is actually a HSA device
> > diff --git libgomp/testsuite/libgomp.oacc-c++/c++.exp libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > index 608b298..befb921 100644
> > --- libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > +++ libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > @@ -70,18 +70,23 @@ if { $lang_test_file_found } {
> >  	set libstdcxx_includes ""
> >      }
> >  
> > -    # Test OpenACC with available accelerators.
> > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > +    # Test with all offload targets, and with offloading disabled.
> > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> >  
> > -	switch $offload_target_openacc {
> > -	    host {
> > +	switch $openacc_device_type {
> > +	    "" {
> > +		untested "$subdir $offload_target offloading"
> > +		continue
> > +	    }
> > +	    "host" {
> >  		set acc_mem_shared 1
> >  	    }
> > -	    nvidia {
> > +	    "nvidia" {
> >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> >  		    # Don't bother; execution testing is going to FAIL.
> > -		    untested "$subdir $offload_target_openacc offloading"
> > +		    untested "$subdir $offload_target offloading"
> >  		    continue
> >  		}
> >  
> > @@ -94,12 +99,15 @@ if { $lang_test_file_found } {
> >  		set acc_mem_shared 0
> >  	    }
> >  	    default {
> > -		set acc_mem_shared 0
> > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> >  	    }
> >  	}
> >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> >  
> > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > +	# To avoid overhead, by default only build for the offload target that
> > +	# we're actually going to test.
> > +	set tagopt "$tagopt -foffload=$offload_target"
> > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> >  
> >  	# To get better test coverage for device-specific code that is only
> >  	# ever used in offloading configurations, we'd like more thorough
> > @@ -108,8 +116,8 @@ if { $lang_test_file_found } {
> >  	# -O0 and -O2 only, to avoid testing times exploding too much, under
> >  	# the assumption that between -O0 and -O[something] there is the
> >  	# biggest difference in the overall structure of the generated code.
> > -	switch $offload_target_openacc {
> > -	    host {
> > +	switch $offload_target {
> > +	    "disable" {
> >  		set-torture-options [list \
> >  					 { -O2 } ]
> >  	    }
> > diff --git libgomp/testsuite/libgomp.oacc-c/c.exp libgomp/testsuite/libgomp.oacc-c/c.exp
> > index b509a10..5355b87 100644
> > --- libgomp/testsuite/libgomp.oacc-c/c.exp
> > +++ libgomp/testsuite/libgomp.oacc-c/c.exp
> > @@ -31,20 +31,25 @@ set ld_library_path $always_ld_library_path
> >  append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> >  set_ld_library_path_env_vars
> >  
> > -# Test OpenACC with available accelerators.
> > +# Test with all offload targets, and with offloading disabled.
> >  set SAVE_ALWAYS_CFLAGS "$ALWAYS_CFLAGS"
> > -foreach offload_target_openacc $offload_targets_s_openacc {
> > +foreach offload_target [concat [split $offload_targets ","] "disable"] {
> >      set ALWAYS_CFLAGS "$SAVE_ALWAYS_CFLAGS"
> > -    set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > +    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > +    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> >  
> > -    switch $offload_target_openacc {
> > -	host {
> > +    switch $openacc_device_type {
> > +	"" {
> > +	    untested "$subdir $offload_target offloading"
> > +	    continue
> > +	}
> > +	"host" {
> >  	    set acc_mem_shared 1
> >  	}
> > -	nvidia {
> > +	"nvidia" {
> >  	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
> >  		# Don't bother; execution testing is going to FAIL.
> > -		untested "$subdir $offload_target_openacc offloading"
> > +		untested "$subdir $offload_target offloading"
> >  		continue
> >  	    }
> >  
> > @@ -57,12 +62,15 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> >  	    set acc_mem_shared 0
> >  	}
> >  	default {
> > -	    set acc_mem_shared 0
> > +	    error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> >  	}
> >      }
> >      set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> >  
> > -    setenv ACC_DEVICE_TYPE $offload_target_openacc
> > +    # To avoid overhead, by default only build for the offload target that
> > +    # we're actually going to test.
> > +    set tagopt "$tagopt -foffload=$offload_target"
> > +    setenv ACC_DEVICE_TYPE $openacc_device_type
> >  
> >      # To get better test coverage for device-specific code that is only
> >      # ever used in offloading configurations, we'd like more thorough
> > @@ -71,8 +79,8 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> >      # -O0 and -O2 only, to avoid testing times exploding too much, under
> >      # the assumption that between -O0 and -O[something] there is the
> >      # biggest difference in the overall structure of the generated code.
> > -    switch $offload_target_openacc {
> > -	host {
> > +    switch $offload_target {
> > +	"disable" {
> >  	    set-torture-options [list \
> >  				     { -O2 } ]
> >  	}
> > diff --git libgomp/testsuite/libgomp.oacc-fortran/fortran.exp libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > index 2d6b647..8507b67 100644
> > --- libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > +++ libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > @@ -65,30 +65,38 @@ if { $lang_test_file_found } {
> >      append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> >      set_ld_library_path_env_vars
> >  
> > -    # Test OpenACC with available accelerators.
> > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > +    # Test with all offload targets, and with offloading disabled.
> > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> >  
> > -	switch $offload_target_openacc {
> > +	switch $openacc_device_type {
> > +	    "" {
> > +		untested "$subdir $offload_target offloading"
> > +		continue
> > +	    }
> >  	    host {
> >  		set acc_mem_shared 1
> >  	    }
> >  	    nvidia {
> >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> >  		    # Don't bother; execution testing is going to FAIL.
> > -		    untested "$subdir $offload_target_openacc offloading"
> > +		    untested "$subdir $offload_target offloading"
> >  		    continue
> >  		}
> >  
> >  		set acc_mem_shared 0
> >  	    }
> >  	    default {
> > -		set acc_mem_shared 0
> > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> >  	    }
> >  	}
> >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> >  
> > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > +	# To avoid overhead, by default only build for the offload target that
> > +	# we're actually going to test.
> > +	set tagopt "$tagopt -foffload=$offload_target"
> > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> >  
> >  	# For Fortran we're doing torture testing, as Fortran has far more tests
> >  	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is


Grüße
 Thomas
Thomas Schwinge May 25, 2016, 6:01 a.m. UTC | #3
Hi!

Ping...

On Wed, 18 May 2016 13:41:25 +0200, I wrote:
> Ping.
> 
> On Wed, 11 May 2016 15:45:13 +0200, I wrote:
> > Ping.
> > 
> > On Mon, 02 May 2016 11:54:27 +0200, I wrote:
> > > On Fri, 29 Apr 2016 09:43:41 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> > > > On Thu, Apr 28, 2016 at 12:43:43PM +0200, Thomas Schwinge wrote:
> > > > > commit 3b521f3e35fdb4b320e95b5f6a82b8d89399481a
> > > > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > > > 
> > > > >     libgomp: Unconfuse offload plugins vs. offload targets
> > > > 
> > > > I don't like this patch at all, rather than unconfusing stuff it
> > > > makes stuff confusing.  Plugins are just a way to support various
> > > > offloading targets.
> > > 
> > > Huh; my patch exactly clarifies that the offload_targets variable does
> > > not actually list offload target names, but does list libgomp offload
> > > plugin names...
> > > 
> > > > Can you please post just a short patch without all those changes
> > > > that does what you want, rather than renaming everything at the same time?
> > > 
> > > I thought incremental, self-contained patches were easier to review.
> > > Anyway, here's the three patches merged into one:
> > > 
> > > commit 8060ae3474072eef685381d80f566d1c0942c603
> > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > 
> > >     libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test
> > >     
> > >     	libgomp/
> > >     	* plugin/configfrag.ac (offload_targets): Actually enumerate
> > >     	offload targets, and add...
> > >     	(offload_plugins): ... this one to enumerate offload plugins.
> > >     	(OFFLOAD_PLUGINS): Renamed from OFFLOAD_TARGETS.
> > >     	* target.c (gomp_target_init): Adjust to that.
> > >     	* testsuite/lib/libgomp.exp: Likewise.
> > >     	(offload_targets_s, offload_targets_s_openacc): Remove variables.
> > >     	(offload_target_to_openacc_device_type): New proc.
> > >     	(check_effective_target_openacc_nvidia_accel_selected)
> > >     	(check_effective_target_openacc_host_selected): Examine
> > >     	$openacc_device_type instead of $offload_target_openacc.
> > >     	* Makefile.in: Regenerate.
> > >     	* config.h.in: Likewise.
> > >     	* configure: Likewise.
> > >     	* testsuite/Makefile.in: Likewise.
> > >     	* testsuite/libgomp.oacc-c++/c++.exp: Cycle through
> > >     	$offload_targets (plus "disable") instead of
> > >     	$offload_targets_s_openacc, and add "-foffload=$offload_target" to
> > >     	tagopt.
> > >     	* testsuite/libgomp.oacc-c/c.exp: Likewise.
> > >     	* testsuite/libgomp.oacc-fortran/fortran.exp: Likewise.
> > > ---
> > >  libgomp/Makefile.in                                |  1 +
> > >  libgomp/config.h.in                                |  4 +-
> > >  libgomp/configure                                  | 44 +++++++------
> > >  libgomp/plugin/configfrag.ac                       | 39 +++++++-----
> > >  libgomp/target.c                                   |  8 +--
> > >  libgomp/testsuite/Makefile.in                      |  1 +
> > >  libgomp/testsuite/lib/libgomp.exp                  | 72 ++++++++++------------
> > >  libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 30 +++++----
> > >  libgomp/testsuite/libgomp.oacc-c/c.exp             | 30 +++++----
> > >  libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 22 ++++---
> > >  10 files changed, 142 insertions(+), 109 deletions(-)
> > > 
> > > diff --git libgomp/Makefile.in libgomp/Makefile.in
> > > [snipped]
> > > diff --git libgomp/config.h.in libgomp/config.h.in
> > > [snipped]
> > > diff --git libgomp/configure libgomp/configure
> > > [snipped]
> > > diff --git libgomp/plugin/configfrag.ac libgomp/plugin/configfrag.ac
> > > index 88b4156..de0a6f6 100644
> > > --- libgomp/plugin/configfrag.ac
> > > +++ libgomp/plugin/configfrag.ac
> > > @@ -26,8 +26,6 @@
> > >  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> > >  # <http://www.gnu.org/licenses/>.
> > >  
> > > -offload_targets=
> > > -AC_SUBST(offload_targets)
> > >  plugin_support=yes
> > >  AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
> > >  if test x"$plugin_support" = xyes; then
> > > @@ -142,7 +140,13 @@ AC_SUBST(PLUGIN_HSA_LIBS)
> > >  
> > >  
> > >  
> > > -# Get offload targets and path to install tree of offloading compiler.
> > > +# Parse offload targets, and figure out libgomp plugin, and configure the
> > > +# corresponding offload compiler.  offload_plugins and offload_targets will be
> > > +# populated in the same order.
> > > +offload_plugins=
> > > +offload_targets=
> > > +AC_SUBST(offload_plugins)
> > > +AC_SUBST(offload_targets)
> > >  offload_additional_options=
> > >  offload_additional_lib_paths=
> > >  AC_SUBST(offload_additional_options)
> > > @@ -151,13 +155,13 @@ if test x"$enable_offload_targets" != x; then
> > >    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
> > >      tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
> > >      tgt=`echo $tgt | sed 's/=.*//'`
> > > -    tgt_name=
> > > +    tgt_plugin=
> > >      case $tgt in
> > >        *-intelmic-* | *-intelmicemul-*)
> > > -	tgt_name=intelmic
> > > +	tgt_plugin=intelmic
> > >  	;;
> > >        nvptx*)
> > > -        tgt_name=nvptx
> > > +	tgt_plugin=nvptx
> > >  	PLUGIN_NVPTX=$tgt
> > >  	PLUGIN_NVPTX_CPPFLAGS=$CUDA_DRIVER_CPPFLAGS
> > >  	PLUGIN_NVPTX_LDFLAGS=$CUDA_DRIVER_LDFLAGS
> > > @@ -184,7 +188,7 @@ if test x"$enable_offload_targets" != x; then
> > >  	    ;;
> > >  	esac
> > >  	;;
> > > -      hsa*)
> > > +      hsa)
> > >  	case "${target}" in
> > >  	  x86_64-*-*)
> > >  	    case " ${CC} ${CFLAGS} " in
> > > @@ -192,7 +196,7 @@ if test x"$enable_offload_targets" != x; then
> > >  	        PLUGIN_HSA=0
> > >  		;;
> > >  	      *)
> > > -	        tgt_name=hsa
> > > +		tgt_plugin=hsa
> > >  	        PLUGIN_HSA=$tgt
> > >  	        PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
> > >  	        PLUGIN_HSA_LDFLAGS="$HSA_RUNTIME_LDFLAGS $HSA_KMT_LDFLAGS"
> > > @@ -214,7 +218,7 @@ if test x"$enable_offload_targets" != x; then
> > >  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
> > >  	        LIBS=$PLUGIN_HSA_save_LIBS
> > >  	        case $PLUGIN_HSA in
> > > -	          hsa*)
> > > +		  hsa)
> > >  	            HSA_PLUGIN=0
> > >  	            AC_MSG_ERROR([HSA run-time package required for HSA support])
> > >  	            ;;
> > > @@ -231,16 +235,19 @@ if test x"$enable_offload_targets" != x; then
> > >  	AC_MSG_ERROR([unknown offload target specified])
> > >  	;;
> > >      esac
> > > -    if test x"$tgt_name" = x; then
> > > +    if test x"$tgt_plugin" = x; then
> > >        # Don't configure libgomp for this offloading target if we don't build
> > >        # the corresponding plugin.
> > >        continue
> > > -    elif test x"$offload_targets" = x; then
> > > -      offload_targets=$tgt_name
> > > +    elif test x"$offload_plugins" = x; then
> > > +      offload_plugins=$tgt_plugin
> > > +      offload_targets=$tgt
> > >      else
> > > -      offload_targets=$offload_targets,$tgt_name
> > > +      offload_plugins=$offload_plugins,$tgt_plugin
> > > +      offload_targets=$offload_targets,$tgt
> > >      fi
> > > -    if test "$tgt_name" = hsa; then
> > > +    # Configure additional search paths.
> > > +    if test "$tgt_plugin" = hsa; then
> > >        # Offloading compilation is all handled by the target compiler.
> > >        :
> > >      elif test x"$tgt_dir" != x; then
> > > @@ -252,8 +259,8 @@ if test x"$enable_offload_targets" != x; then
> > >      fi
> > >    done
> > >  fi
> > > -AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
> > > -  [Define to offload targets, separated by commas.])
> > > +AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
> > > +  [Define to offload plugins, separated by commas.])
> > >  AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
> > >  AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
> > >    [Define to 1 if the NVIDIA plugin is built, 0 if not.])
> > > diff --git libgomp/target.c libgomp/target.c
> > > index e2dd0e0..c12c085 100644
> > > --- libgomp/target.c
> > > +++ libgomp/target.c
> > > @@ -2467,9 +2467,9 @@ gomp_target_fini (void)
> > >      }
> > >  }
> > >  
> > > -/* This function initializes the runtime needed for offloading.
> > > -   It parses the list of offload targets and tries to load the plugins for
> > > -   these targets.  On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> > > +/* This function initializes the runtime for offloading.
> > > +   It parses the list of offload plugins, and tries to load these.
> > > +   On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> > >     will be set, and the array DEVICES initialized, containing descriptors for
> > >     corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows
> > >     by the others.  */
> > > @@ -2486,7 +2486,7 @@ gomp_target_init (void)
> > >    num_devices = 0;
> > >    devices = NULL;
> > >  
> > > -  cur = OFFLOAD_TARGETS;
> > > +  cur = OFFLOAD_PLUGINS;
> > >    if (*cur)
> > >      do
> > >        {
> > > diff --git libgomp/testsuite/Makefile.in libgomp/testsuite/Makefile.in
> > > [snipped]
> > > diff --git libgomp/testsuite/lib/libgomp.exp libgomp/testsuite/lib/libgomp.exp
> > > index 1cb4991..4a25421 100644
> > > --- libgomp/testsuite/lib/libgomp.exp
> > > +++ libgomp/testsuite/lib/libgomp.exp
> > > @@ -36,28 +36,6 @@ load_gcc_lib fortran-modules.exp
> > >  # Try to load a test support file, built during libgomp configuration.
> > >  load_file libgomp-test-support.exp
> > >  
> > > -# Populate offload_targets_s (offloading targets separated by a space), and
> > > -# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
> > > -# some of them a little differently).
> > > -set offload_targets_s [split $offload_targets ","]
> > > -set offload_targets_s_openacc {}
> > > -foreach offload_target_openacc $offload_targets_s {
> > > -    # Translate to OpenACC names, or skip if not yet supported.
> > > -    switch $offload_target_openacc {
> > > -	intelmic {
> > > -	    continue
> > > -	}
> > > -	nvptx {
> > > -	    set offload_target_openacc "nvidia"
> > > -	}
> > > -	hsa {
> > > -	    continue
> > > -	}
> > > -    }
> > > -    lappend offload_targets_s_openacc "$offload_target_openacc"
> > > -}
> > > -lappend offload_targets_s_openacc "host"
> > > -
> > >  set dg-do-what-default run
> > >  
> > >  #
> > > @@ -135,9 +113,9 @@ proc libgomp_init { args } {
> > >      set always_ld_library_path ".:${blddir}/.libs"
> > >  
> > >      # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
> > > -    # non-fallback testing for Intel MIC targets
> > > +    # Intel MIC offloading testing.
> > >      global offload_targets
> > > -    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
> > > +    if { [string match "*,*-intelmic*,*" ",$offload_targets,"] } {
> > >  	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
> > >  	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
> > >  	# libstdc++ is required by liboffloadmic
> > > @@ -245,8 +223,7 @@ proc libgomp_init { args } {
> > >      # Disable color diagnostics
> > >      lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"
> > >  
> > > -    # Used for support non-fallback offloading.
> > > -    # Help GCC to find target mkoffload.
> > > +    # Help GCC to find offload compilers' mkoffload.
> > >      global offload_additional_options
> > >      if { $offload_additional_options != "" } {
> > >  	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
> > > @@ -322,6 +299,28 @@ proc libgomp_option_proc { option } {
> > >      }
> > >  }
> > >  
> > > +# Translate offload target to OpenACC device type.  Return the empty string if
> > > +# not suitable or not yet supported, and "host" for offload target "disable".
> > > +proc offload_target_to_openacc_device_type { offload_target } {
> > > +    switch -glob $offload_target {
> > > +	disable {
> > > +	    return "host"
> > > +	}
> > > +	hsa {
> > > +	    return ""
> > > +	}
> > > +	*-intelmic* {
> > > +	    return ""
> > > +	}
> > > +	nvptx* {
> > > +	    return "nvidia"
> > > +	}
> > > +	default {
> > > +	    error "Unknwon offload target: $offload_target"
> > > +	}
> > > +    }
> > > +}
> > > +
> > >  # Return 1 if offload device is available.
> > >  proc check_effective_target_offload_device { } {
> > >      return [check_runtime_nocache offload_device_available_ {
> > > @@ -373,29 +372,22 @@ proc check_effective_target_openacc_nvidia_accel_present { } {
> > >      } "" ]
> > >  }
> > >  
> > > -# Return 1 if at least one nvidia board is present, and the nvidia device type
> > > -# is selected by default by means of setting the environment variable
> > > -# ACC_DEVICE_TYPE.
> > > +# Return 1 if at least one nvidia board is present, and the OpenACC "nvidia"
> > > +# device type is selected.
> > >  
> > >  proc check_effective_target_openacc_nvidia_accel_selected { } {
> > >      if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > >  	return 0;
> > >      }
> > > -    global offload_target_openacc
> > > -    if { $offload_target_openacc == "nvidia" } {
> > > -        return 1;
> > > -    }
> > > -    return 0;
> > > +    global openacc_device_type
> > > +    return [string match "nvidia" $openacc_device_type]
> > >  }
> > >  
> > > -# Return 1 if the host target is selected for offloaded
> > > +# Return 1 if the OpenACC "host" device type is selected.
> > >  
> > >  proc check_effective_target_openacc_host_selected { } {
> > > -    global offload_target_openacc
> > > -    if { $offload_target_openacc == "host" } {
> > > -        return 1;
> > > -    }
> > > -    return 0;
> > > +    global openacc_device_type
> > > +    return [string match "host" $openacc_device_type]
> > >  }
> > >  
> > >  # Return 1 if the selected OMP device is actually a HSA device
> > > diff --git libgomp/testsuite/libgomp.oacc-c++/c++.exp libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > index 608b298..befb921 100644
> > > --- libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > +++ libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > @@ -70,18 +70,23 @@ if { $lang_test_file_found } {
> > >  	set libstdcxx_includes ""
> > >      }
> > >  
> > > -    # Test OpenACC with available accelerators.
> > > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > +    # Test with all offload targets, and with offloading disabled.
> > > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > >  
> > > -	switch $offload_target_openacc {
> > > -	    host {
> > > +	switch $openacc_device_type {
> > > +	    "" {
> > > +		untested "$subdir $offload_target offloading"
> > > +		continue
> > > +	    }
> > > +	    "host" {
> > >  		set acc_mem_shared 1
> > >  	    }
> > > -	    nvidia {
> > > +	    "nvidia" {
> > >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > >  		    # Don't bother; execution testing is going to FAIL.
> > > -		    untested "$subdir $offload_target_openacc offloading"
> > > +		    untested "$subdir $offload_target offloading"
> > >  		    continue
> > >  		}
> > >  
> > > @@ -94,12 +99,15 @@ if { $lang_test_file_found } {
> > >  		set acc_mem_shared 0
> > >  	    }
> > >  	    default {
> > > -		set acc_mem_shared 0
> > > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > >  	    }
> > >  	}
> > >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > >  
> > > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > +	# To avoid overhead, by default only build for the offload target that
> > > +	# we're actually going to test.
> > > +	set tagopt "$tagopt -foffload=$offload_target"
> > > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> > >  
> > >  	# To get better test coverage for device-specific code that is only
> > >  	# ever used in offloading configurations, we'd like more thorough
> > > @@ -108,8 +116,8 @@ if { $lang_test_file_found } {
> > >  	# -O0 and -O2 only, to avoid testing times exploding too much, under
> > >  	# the assumption that between -O0 and -O[something] there is the
> > >  	# biggest difference in the overall structure of the generated code.
> > > -	switch $offload_target_openacc {
> > > -	    host {
> > > +	switch $offload_target {
> > > +	    "disable" {
> > >  		set-torture-options [list \
> > >  					 { -O2 } ]
> > >  	    }
> > > diff --git libgomp/testsuite/libgomp.oacc-c/c.exp libgomp/testsuite/libgomp.oacc-c/c.exp
> > > index b509a10..5355b87 100644
> > > --- libgomp/testsuite/libgomp.oacc-c/c.exp
> > > +++ libgomp/testsuite/libgomp.oacc-c/c.exp
> > > @@ -31,20 +31,25 @@ set ld_library_path $always_ld_library_path
> > >  append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> > >  set_ld_library_path_env_vars
> > >  
> > > -# Test OpenACC with available accelerators.
> > > +# Test with all offload targets, and with offloading disabled.
> > >  set SAVE_ALWAYS_CFLAGS "$ALWAYS_CFLAGS"
> > > -foreach offload_target_openacc $offload_targets_s_openacc {
> > > +foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > >      set ALWAYS_CFLAGS "$SAVE_ALWAYS_CFLAGS"
> > > -    set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > +    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > +    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > >  
> > > -    switch $offload_target_openacc {
> > > -	host {
> > > +    switch $openacc_device_type {
> > > +	"" {
> > > +	    untested "$subdir $offload_target offloading"
> > > +	    continue
> > > +	}
> > > +	"host" {
> > >  	    set acc_mem_shared 1
> > >  	}
> > > -	nvidia {
> > > +	"nvidia" {
> > >  	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > >  		# Don't bother; execution testing is going to FAIL.
> > > -		untested "$subdir $offload_target_openacc offloading"
> > > +		untested "$subdir $offload_target offloading"
> > >  		continue
> > >  	    }
> > >  
> > > @@ -57,12 +62,15 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> > >  	    set acc_mem_shared 0
> > >  	}
> > >  	default {
> > > -	    set acc_mem_shared 0
> > > +	    error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > >  	}
> > >      }
> > >      set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > >  
> > > -    setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > +    # To avoid overhead, by default only build for the offload target that
> > > +    # we're actually going to test.
> > > +    set tagopt "$tagopt -foffload=$offload_target"
> > > +    setenv ACC_DEVICE_TYPE $openacc_device_type
> > >  
> > >      # To get better test coverage for device-specific code that is only
> > >      # ever used in offloading configurations, we'd like more thorough
> > > @@ -71,8 +79,8 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> > >      # -O0 and -O2 only, to avoid testing times exploding too much, under
> > >      # the assumption that between -O0 and -O[something] there is the
> > >      # biggest difference in the overall structure of the generated code.
> > > -    switch $offload_target_openacc {
> > > -	host {
> > > +    switch $offload_target {
> > > +	"disable" {
> > >  	    set-torture-options [list \
> > >  				     { -O2 } ]
> > >  	}
> > > diff --git libgomp/testsuite/libgomp.oacc-fortran/fortran.exp libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > index 2d6b647..8507b67 100644
> > > --- libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > +++ libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > @@ -65,30 +65,38 @@ if { $lang_test_file_found } {
> > >      append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> > >      set_ld_library_path_env_vars
> > >  
> > > -    # Test OpenACC with available accelerators.
> > > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > +    # Test with all offload targets, and with offloading disabled.
> > > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > >  
> > > -	switch $offload_target_openacc {
> > > +	switch $openacc_device_type {
> > > +	    "" {
> > > +		untested "$subdir $offload_target offloading"
> > > +		continue
> > > +	    }
> > >  	    host {
> > >  		set acc_mem_shared 1
> > >  	    }
> > >  	    nvidia {
> > >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > >  		    # Don't bother; execution testing is going to FAIL.
> > > -		    untested "$subdir $offload_target_openacc offloading"
> > > +		    untested "$subdir $offload_target offloading"
> > >  		    continue
> > >  		}
> > >  
> > >  		set acc_mem_shared 0
> > >  	    }
> > >  	    default {
> > > -		set acc_mem_shared 0
> > > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > >  	    }
> > >  	}
> > >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > >  
> > > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > +	# To avoid overhead, by default only build for the offload target that
> > > +	# we're actually going to test.
> > > +	set tagopt "$tagopt -foffload=$offload_target"
> > > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> > >  
> > >  	# For Fortran we're doing torture testing, as Fortran has far more tests
> > >  	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is
> 
> 
> Grüße
>  Thomas
Thomas Schwinge June 29, 2016, 9:18 a.m. UTC | #4
Hi!

Ping...  Now waiting for review for two months.

Quoting my latest commentary from
<http://news.gmane.org/find-root.php?message_id=%3C87oa7br8ej.fsf%40hertz.schwinge.homeip.net%3E>:

| [...] there actually is a difference between offload_plugins and
| offload_targets (for example, "intelmic"
| vs. "x86_64-intelmicemul-linux-gnu"), and I'm using both variables --
| to avoid having to translate the more specific
| "x86_64-intelmicemul-linux-gnu" (which we required in the test harness)
| into the less specific "intelmic" (for plugin loading) in
| libgomp/target.c.  I can do that, so that we can continue to use just a
| single offload_targets variable, but I consider that a less elegant
| solution.


Grüße
 Thomas


On Wed, 25 May 2016 08:01:17 +0200, I wrote:
> Ping...
> 
> On Wed, 18 May 2016 13:41:25 +0200, I wrote:
> > Ping.
> > 
> > On Wed, 11 May 2016 15:45:13 +0200, I wrote:
> > > Ping.
> > > 
> > > On Mon, 02 May 2016 11:54:27 +0200, I wrote:
> > > > On Fri, 29 Apr 2016 09:43:41 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> > > > > On Thu, Apr 28, 2016 at 12:43:43PM +0200, Thomas Schwinge wrote:
> > > > > > commit 3b521f3e35fdb4b320e95b5f6a82b8d89399481a
> > > > > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > > > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > > > > 
> > > > > >     libgomp: Unconfuse offload plugins vs. offload targets
> > > > > 
> > > > > I don't like this patch at all, rather than unconfusing stuff it
> > > > > makes stuff confusing.  Plugins are just a way to support various
> > > > > offloading targets.
> > > > 
> > > > Huh; my patch exactly clarifies that the offload_targets variable does
> > > > not actually list offload target names, but does list libgomp offload
> > > > plugin names...
> > > > 
> > > > > Can you please post just a short patch without all those changes
> > > > > that does what you want, rather than renaming everything at the same time?
> > > > 
> > > > I thought incremental, self-contained patches were easier to review.
> > > > Anyway, here's the three patches merged into one:
> > > > 
> > > > commit 8060ae3474072eef685381d80f566d1c0942c603
> > > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > > Date:   Thu Apr 21 11:36:39 2016 +0200
> > > > 
> > > >     libgomp: In OpenACC testing, cycle though $offload_targets, and by default only build for the offload target that we're actually going to test
> > > >     
> > > >     	libgomp/
> > > >     	* plugin/configfrag.ac (offload_targets): Actually enumerate
> > > >     	offload targets, and add...
> > > >     	(offload_plugins): ... this one to enumerate offload plugins.
> > > >     	(OFFLOAD_PLUGINS): Renamed from OFFLOAD_TARGETS.
> > > >     	* target.c (gomp_target_init): Adjust to that.
> > > >     	* testsuite/lib/libgomp.exp: Likewise.
> > > >     	(offload_targets_s, offload_targets_s_openacc): Remove variables.
> > > >     	(offload_target_to_openacc_device_type): New proc.
> > > >     	(check_effective_target_openacc_nvidia_accel_selected)
> > > >     	(check_effective_target_openacc_host_selected): Examine
> > > >     	$openacc_device_type instead of $offload_target_openacc.
> > > >     	* Makefile.in: Regenerate.
> > > >     	* config.h.in: Likewise.
> > > >     	* configure: Likewise.
> > > >     	* testsuite/Makefile.in: Likewise.
> > > >     	* testsuite/libgomp.oacc-c++/c++.exp: Cycle through
> > > >     	$offload_targets (plus "disable") instead of
> > > >     	$offload_targets_s_openacc, and add "-foffload=$offload_target" to
> > > >     	tagopt.
> > > >     	* testsuite/libgomp.oacc-c/c.exp: Likewise.
> > > >     	* testsuite/libgomp.oacc-fortran/fortran.exp: Likewise.
> > > > ---
> > > >  libgomp/Makefile.in                                |  1 +
> > > >  libgomp/config.h.in                                |  4 +-
> > > >  libgomp/configure                                  | 44 +++++++------
> > > >  libgomp/plugin/configfrag.ac                       | 39 +++++++-----
> > > >  libgomp/target.c                                   |  8 +--
> > > >  libgomp/testsuite/Makefile.in                      |  1 +
> > > >  libgomp/testsuite/lib/libgomp.exp                  | 72 ++++++++++------------
> > > >  libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 30 +++++----
> > > >  libgomp/testsuite/libgomp.oacc-c/c.exp             | 30 +++++----
> > > >  libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 22 ++++---
> > > >  10 files changed, 142 insertions(+), 109 deletions(-)
> > > > 
> > > > diff --git libgomp/Makefile.in libgomp/Makefile.in
> > > > [snipped]
> > > > diff --git libgomp/config.h.in libgomp/config.h.in
> > > > [snipped]
> > > > diff --git libgomp/configure libgomp/configure
> > > > [snipped]
> > > > diff --git libgomp/plugin/configfrag.ac libgomp/plugin/configfrag.ac
> > > > index 88b4156..de0a6f6 100644
> > > > --- libgomp/plugin/configfrag.ac
> > > > +++ libgomp/plugin/configfrag.ac
> > > > @@ -26,8 +26,6 @@
> > > >  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> > > >  # <http://www.gnu.org/licenses/>.
> > > >  
> > > > -offload_targets=
> > > > -AC_SUBST(offload_targets)
> > > >  plugin_support=yes
> > > >  AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
> > > >  if test x"$plugin_support" = xyes; then
> > > > @@ -142,7 +140,13 @@ AC_SUBST(PLUGIN_HSA_LIBS)
> > > >  
> > > >  
> > > >  
> > > > -# Get offload targets and path to install tree of offloading compiler.
> > > > +# Parse offload targets, and figure out libgomp plugin, and configure the
> > > > +# corresponding offload compiler.  offload_plugins and offload_targets will be
> > > > +# populated in the same order.
> > > > +offload_plugins=
> > > > +offload_targets=
> > > > +AC_SUBST(offload_plugins)
> > > > +AC_SUBST(offload_targets)
> > > >  offload_additional_options=
> > > >  offload_additional_lib_paths=
> > > >  AC_SUBST(offload_additional_options)
> > > > @@ -151,13 +155,13 @@ if test x"$enable_offload_targets" != x; then
> > > >    for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
> > > >      tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
> > > >      tgt=`echo $tgt | sed 's/=.*//'`
> > > > -    tgt_name=
> > > > +    tgt_plugin=
> > > >      case $tgt in
> > > >        *-intelmic-* | *-intelmicemul-*)
> > > > -	tgt_name=intelmic
> > > > +	tgt_plugin=intelmic
> > > >  	;;
> > > >        nvptx*)
> > > > -        tgt_name=nvptx
> > > > +	tgt_plugin=nvptx
> > > >  	PLUGIN_NVPTX=$tgt
> > > >  	PLUGIN_NVPTX_CPPFLAGS=$CUDA_DRIVER_CPPFLAGS
> > > >  	PLUGIN_NVPTX_LDFLAGS=$CUDA_DRIVER_LDFLAGS
> > > > @@ -184,7 +188,7 @@ if test x"$enable_offload_targets" != x; then
> > > >  	    ;;
> > > >  	esac
> > > >  	;;
> > > > -      hsa*)
> > > > +      hsa)
> > > >  	case "${target}" in
> > > >  	  x86_64-*-*)
> > > >  	    case " ${CC} ${CFLAGS} " in
> > > > @@ -192,7 +196,7 @@ if test x"$enable_offload_targets" != x; then
> > > >  	        PLUGIN_HSA=0
> > > >  		;;
> > > >  	      *)
> > > > -	        tgt_name=hsa
> > > > +		tgt_plugin=hsa
> > > >  	        PLUGIN_HSA=$tgt
> > > >  	        PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
> > > >  	        PLUGIN_HSA_LDFLAGS="$HSA_RUNTIME_LDFLAGS $HSA_KMT_LDFLAGS"
> > > > @@ -214,7 +218,7 @@ if test x"$enable_offload_targets" != x; then
> > > >  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
> > > >  	        LIBS=$PLUGIN_HSA_save_LIBS
> > > >  	        case $PLUGIN_HSA in
> > > > -	          hsa*)
> > > > +		  hsa)
> > > >  	            HSA_PLUGIN=0
> > > >  	            AC_MSG_ERROR([HSA run-time package required for HSA support])
> > > >  	            ;;
> > > > @@ -231,16 +235,19 @@ if test x"$enable_offload_targets" != x; then
> > > >  	AC_MSG_ERROR([unknown offload target specified])
> > > >  	;;
> > > >      esac
> > > > -    if test x"$tgt_name" = x; then
> > > > +    if test x"$tgt_plugin" = x; then
> > > >        # Don't configure libgomp for this offloading target if we don't build
> > > >        # the corresponding plugin.
> > > >        continue
> > > > -    elif test x"$offload_targets" = x; then
> > > > -      offload_targets=$tgt_name
> > > > +    elif test x"$offload_plugins" = x; then
> > > > +      offload_plugins=$tgt_plugin
> > > > +      offload_targets=$tgt
> > > >      else
> > > > -      offload_targets=$offload_targets,$tgt_name
> > > > +      offload_plugins=$offload_plugins,$tgt_plugin
> > > > +      offload_targets=$offload_targets,$tgt
> > > >      fi
> > > > -    if test "$tgt_name" = hsa; then
> > > > +    # Configure additional search paths.
> > > > +    if test "$tgt_plugin" = hsa; then
> > > >        # Offloading compilation is all handled by the target compiler.
> > > >        :
> > > >      elif test x"$tgt_dir" != x; then
> > > > @@ -252,8 +259,8 @@ if test x"$enable_offload_targets" != x; then
> > > >      fi
> > > >    done
> > > >  fi
> > > > -AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
> > > > -  [Define to offload targets, separated by commas.])
> > > > +AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
> > > > +  [Define to offload plugins, separated by commas.])
> > > >  AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
> > > >  AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
> > > >    [Define to 1 if the NVIDIA plugin is built, 0 if not.])
> > > > diff --git libgomp/target.c libgomp/target.c
> > > > index e2dd0e0..c12c085 100644
> > > > --- libgomp/target.c
> > > > +++ libgomp/target.c
> > > > @@ -2467,9 +2467,9 @@ gomp_target_fini (void)
> > > >      }
> > > >  }
> > > >  
> > > > -/* This function initializes the runtime needed for offloading.
> > > > -   It parses the list of offload targets and tries to load the plugins for
> > > > -   these targets.  On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> > > > +/* This function initializes the runtime for offloading.
> > > > +   It parses the list of offload plugins, and tries to load these.
> > > > +   On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
> > > >     will be set, and the array DEVICES initialized, containing descriptors for
> > > >     corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows
> > > >     by the others.  */
> > > > @@ -2486,7 +2486,7 @@ gomp_target_init (void)
> > > >    num_devices = 0;
> > > >    devices = NULL;
> > > >  
> > > > -  cur = OFFLOAD_TARGETS;
> > > > +  cur = OFFLOAD_PLUGINS;
> > > >    if (*cur)
> > > >      do
> > > >        {
> > > > diff --git libgomp/testsuite/Makefile.in libgomp/testsuite/Makefile.in
> > > > [snipped]
> > > > diff --git libgomp/testsuite/lib/libgomp.exp libgomp/testsuite/lib/libgomp.exp
> > > > index 1cb4991..4a25421 100644
> > > > --- libgomp/testsuite/lib/libgomp.exp
> > > > +++ libgomp/testsuite/lib/libgomp.exp
> > > > @@ -36,28 +36,6 @@ load_gcc_lib fortran-modules.exp
> > > >  # Try to load a test support file, built during libgomp configuration.
> > > >  load_file libgomp-test-support.exp
> > > >  
> > > > -# Populate offload_targets_s (offloading targets separated by a space), and
> > > > -# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
> > > > -# some of them a little differently).
> > > > -set offload_targets_s [split $offload_targets ","]
> > > > -set offload_targets_s_openacc {}
> > > > -foreach offload_target_openacc $offload_targets_s {
> > > > -    # Translate to OpenACC names, or skip if not yet supported.
> > > > -    switch $offload_target_openacc {
> > > > -	intelmic {
> > > > -	    continue
> > > > -	}
> > > > -	nvptx {
> > > > -	    set offload_target_openacc "nvidia"
> > > > -	}
> > > > -	hsa {
> > > > -	    continue
> > > > -	}
> > > > -    }
> > > > -    lappend offload_targets_s_openacc "$offload_target_openacc"
> > > > -}
> > > > -lappend offload_targets_s_openacc "host"
> > > > -
> > > >  set dg-do-what-default run
> > > >  
> > > >  #
> > > > @@ -135,9 +113,9 @@ proc libgomp_init { args } {
> > > >      set always_ld_library_path ".:${blddir}/.libs"
> > > >  
> > > >      # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
> > > > -    # non-fallback testing for Intel MIC targets
> > > > +    # Intel MIC offloading testing.
> > > >      global offload_targets
> > > > -    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
> > > > +    if { [string match "*,*-intelmic*,*" ",$offload_targets,"] } {
> > > >  	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
> > > >  	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
> > > >  	# libstdc++ is required by liboffloadmic
> > > > @@ -245,8 +223,7 @@ proc libgomp_init { args } {
> > > >      # Disable color diagnostics
> > > >      lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"
> > > >  
> > > > -    # Used for support non-fallback offloading.
> > > > -    # Help GCC to find target mkoffload.
> > > > +    # Help GCC to find offload compilers' mkoffload.
> > > >      global offload_additional_options
> > > >      if { $offload_additional_options != "" } {
> > > >  	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
> > > > @@ -322,6 +299,28 @@ proc libgomp_option_proc { option } {
> > > >      }
> > > >  }
> > > >  
> > > > +# Translate offload target to OpenACC device type.  Return the empty string if
> > > > +# not suitable or not yet supported, and "host" for offload target "disable".
> > > > +proc offload_target_to_openacc_device_type { offload_target } {
> > > > +    switch -glob $offload_target {
> > > > +	disable {
> > > > +	    return "host"
> > > > +	}
> > > > +	hsa {
> > > > +	    return ""
> > > > +	}
> > > > +	*-intelmic* {
> > > > +	    return ""
> > > > +	}
> > > > +	nvptx* {
> > > > +	    return "nvidia"
> > > > +	}
> > > > +	default {
> > > > +	    error "Unknwon offload target: $offload_target"
> > > > +	}
> > > > +    }
> > > > +}
> > > > +
> > > >  # Return 1 if offload device is available.
> > > >  proc check_effective_target_offload_device { } {
> > > >      return [check_runtime_nocache offload_device_available_ {
> > > > @@ -373,29 +372,22 @@ proc check_effective_target_openacc_nvidia_accel_present { } {
> > > >      } "" ]
> > > >  }
> > > >  
> > > > -# Return 1 if at least one nvidia board is present, and the nvidia device type
> > > > -# is selected by default by means of setting the environment variable
> > > > -# ACC_DEVICE_TYPE.
> > > > +# Return 1 if at least one nvidia board is present, and the OpenACC "nvidia"
> > > > +# device type is selected.
> > > >  
> > > >  proc check_effective_target_openacc_nvidia_accel_selected { } {
> > > >      if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > > >  	return 0;
> > > >      }
> > > > -    global offload_target_openacc
> > > > -    if { $offload_target_openacc == "nvidia" } {
> > > > -        return 1;
> > > > -    }
> > > > -    return 0;
> > > > +    global openacc_device_type
> > > > +    return [string match "nvidia" $openacc_device_type]
> > > >  }
> > > >  
> > > > -# Return 1 if the host target is selected for offloaded
> > > > +# Return 1 if the OpenACC "host" device type is selected.
> > > >  
> > > >  proc check_effective_target_openacc_host_selected { } {
> > > > -    global offload_target_openacc
> > > > -    if { $offload_target_openacc == "host" } {
> > > > -        return 1;
> > > > -    }
> > > > -    return 0;
> > > > +    global openacc_device_type
> > > > +    return [string match "host" $openacc_device_type]
> > > >  }
> > > >  
> > > >  # Return 1 if the selected OMP device is actually a HSA device
> > > > diff --git libgomp/testsuite/libgomp.oacc-c++/c++.exp libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > > index 608b298..befb921 100644
> > > > --- libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > > +++ libgomp/testsuite/libgomp.oacc-c++/c++.exp
> > > > @@ -70,18 +70,23 @@ if { $lang_test_file_found } {
> > > >  	set libstdcxx_includes ""
> > > >      }
> > > >  
> > > > -    # Test OpenACC with available accelerators.
> > > > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > > > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > > +    # Test with all offload targets, and with offloading disabled.
> > > > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > > > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > > >  
> > > > -	switch $offload_target_openacc {
> > > > -	    host {
> > > > +	switch $openacc_device_type {
> > > > +	    "" {
> > > > +		untested "$subdir $offload_target offloading"
> > > > +		continue
> > > > +	    }
> > > > +	    "host" {
> > > >  		set acc_mem_shared 1
> > > >  	    }
> > > > -	    nvidia {
> > > > +	    "nvidia" {
> > > >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > > >  		    # Don't bother; execution testing is going to FAIL.
> > > > -		    untested "$subdir $offload_target_openacc offloading"
> > > > +		    untested "$subdir $offload_target offloading"
> > > >  		    continue
> > > >  		}
> > > >  
> > > > @@ -94,12 +99,15 @@ if { $lang_test_file_found } {
> > > >  		set acc_mem_shared 0
> > > >  	    }
> > > >  	    default {
> > > > -		set acc_mem_shared 0
> > > > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > > >  	    }
> > > >  	}
> > > >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > > >  
> > > > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > > +	# To avoid overhead, by default only build for the offload target that
> > > > +	# we're actually going to test.
> > > > +	set tagopt "$tagopt -foffload=$offload_target"
> > > > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> > > >  
> > > >  	# To get better test coverage for device-specific code that is only
> > > >  	# ever used in offloading configurations, we'd like more thorough
> > > > @@ -108,8 +116,8 @@ if { $lang_test_file_found } {
> > > >  	# -O0 and -O2 only, to avoid testing times exploding too much, under
> > > >  	# the assumption that between -O0 and -O[something] there is the
> > > >  	# biggest difference in the overall structure of the generated code.
> > > > -	switch $offload_target_openacc {
> > > > -	    host {
> > > > +	switch $offload_target {
> > > > +	    "disable" {
> > > >  		set-torture-options [list \
> > > >  					 { -O2 } ]
> > > >  	    }
> > > > diff --git libgomp/testsuite/libgomp.oacc-c/c.exp libgomp/testsuite/libgomp.oacc-c/c.exp
> > > > index b509a10..5355b87 100644
> > > > --- libgomp/testsuite/libgomp.oacc-c/c.exp
> > > > +++ libgomp/testsuite/libgomp.oacc-c/c.exp
> > > > @@ -31,20 +31,25 @@ set ld_library_path $always_ld_library_path
> > > >  append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> > > >  set_ld_library_path_env_vars
> > > >  
> > > > -# Test OpenACC with available accelerators.
> > > > +# Test with all offload targets, and with offloading disabled.
> > > >  set SAVE_ALWAYS_CFLAGS "$ALWAYS_CFLAGS"
> > > > -foreach offload_target_openacc $offload_targets_s_openacc {
> > > > +foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > > >      set ALWAYS_CFLAGS "$SAVE_ALWAYS_CFLAGS"
> > > > -    set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > > +    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > > +    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > > >  
> > > > -    switch $offload_target_openacc {
> > > > -	host {
> > > > +    switch $openacc_device_type {
> > > > +	"" {
> > > > +	    untested "$subdir $offload_target offloading"
> > > > +	    continue
> > > > +	}
> > > > +	"host" {
> > > >  	    set acc_mem_shared 1
> > > >  	}
> > > > -	nvidia {
> > > > +	"nvidia" {
> > > >  	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > > >  		# Don't bother; execution testing is going to FAIL.
> > > > -		untested "$subdir $offload_target_openacc offloading"
> > > > +		untested "$subdir $offload_target offloading"
> > > >  		continue
> > > >  	    }
> > > >  
> > > > @@ -57,12 +62,15 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> > > >  	    set acc_mem_shared 0
> > > >  	}
> > > >  	default {
> > > > -	    set acc_mem_shared 0
> > > > +	    error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > > >  	}
> > > >      }
> > > >      set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > > >  
> > > > -    setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > > +    # To avoid overhead, by default only build for the offload target that
> > > > +    # we're actually going to test.
> > > > +    set tagopt "$tagopt -foffload=$offload_target"
> > > > +    setenv ACC_DEVICE_TYPE $openacc_device_type
> > > >  
> > > >      # To get better test coverage for device-specific code that is only
> > > >      # ever used in offloading configurations, we'd like more thorough
> > > > @@ -71,8 +79,8 @@ foreach offload_target_openacc $offload_targets_s_openacc {
> > > >      # -O0 and -O2 only, to avoid testing times exploding too much, under
> > > >      # the assumption that between -O0 and -O[something] there is the
> > > >      # biggest difference in the overall structure of the generated code.
> > > > -    switch $offload_target_openacc {
> > > > -	host {
> > > > +    switch $offload_target {
> > > > +	"disable" {
> > > >  	    set-torture-options [list \
> > > >  				     { -O2 } ]
> > > >  	}
> > > > diff --git libgomp/testsuite/libgomp.oacc-fortran/fortran.exp libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > > index 2d6b647..8507b67 100644
> > > > --- libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > > +++ libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
> > > > @@ -65,30 +65,38 @@ if { $lang_test_file_found } {
> > > >      append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
> > > >      set_ld_library_path_env_vars
> > > >  
> > > > -    # Test OpenACC with available accelerators.
> > > > -    foreach offload_target_openacc $offload_targets_s_openacc {
> > > > -	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
> > > > +    # Test with all offload targets, and with offloading disabled.
> > > > +    foreach offload_target [concat [split $offload_targets ","] "disable"] {
> > > > +	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
> > > > +	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
> > > >  
> > > > -	switch $offload_target_openacc {
> > > > +	switch $openacc_device_type {
> > > > +	    "" {
> > > > +		untested "$subdir $offload_target offloading"
> > > > +		continue
> > > > +	    }
> > > >  	    host {
> > > >  		set acc_mem_shared 1
> > > >  	    }
> > > >  	    nvidia {
> > > >  		if { ![check_effective_target_openacc_nvidia_accel_present] } {
> > > >  		    # Don't bother; execution testing is going to FAIL.
> > > > -		    untested "$subdir $offload_target_openacc offloading"
> > > > +		    untested "$subdir $offload_target offloading"
> > > >  		    continue
> > > >  		}
> > > >  
> > > >  		set acc_mem_shared 0
> > > >  	    }
> > > >  	    default {
> > > > -		set acc_mem_shared 0
> > > > +		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
> > > >  	    }
> > > >  	}
> > > >  	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
> > > >  
> > > > -	setenv ACC_DEVICE_TYPE $offload_target_openacc
> > > > +	# To avoid overhead, by default only build for the offload target that
> > > > +	# we're actually going to test.
> > > > +	set tagopt "$tagopt -foffload=$offload_target"
> > > > +	setenv ACC_DEVICE_TYPE $openacc_device_type
> > > >  
> > > >  	# For Fortran we're doing torture testing, as Fortran has far more tests
> > > >  	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is
> > 
> > 
> > Grüße
> >  Thomas
diff mbox

Patch

diff --git libgomp/Makefile.in libgomp/Makefile.in
[snipped]
diff --git libgomp/config.h.in libgomp/config.h.in
[snipped]
diff --git libgomp/configure libgomp/configure
[snipped]
diff --git libgomp/plugin/configfrag.ac libgomp/plugin/configfrag.ac
index 88b4156..de0a6f6 100644
--- libgomp/plugin/configfrag.ac
+++ libgomp/plugin/configfrag.ac
@@ -26,8 +26,6 @@ 
 # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 # <http://www.gnu.org/licenses/>.
 
-offload_targets=
-AC_SUBST(offload_targets)
 plugin_support=yes
 AC_CHECK_LIB(dl, dlsym, , [plugin_support=no])
 if test x"$plugin_support" = xyes; then
@@ -142,7 +140,13 @@  AC_SUBST(PLUGIN_HSA_LIBS)
 
 
 
-# Get offload targets and path to install tree of offloading compiler.
+# Parse offload targets, and figure out libgomp plugin, and configure the
+# corresponding offload compiler.  offload_plugins and offload_targets will be
+# populated in the same order.
+offload_plugins=
+offload_targets=
+AC_SUBST(offload_plugins)
+AC_SUBST(offload_targets)
 offload_additional_options=
 offload_additional_lib_paths=
 AC_SUBST(offload_additional_options)
@@ -151,13 +155,13 @@  if test x"$enable_offload_targets" != x; then
   for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
     tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
     tgt=`echo $tgt | sed 's/=.*//'`
-    tgt_name=
+    tgt_plugin=
     case $tgt in
       *-intelmic-* | *-intelmicemul-*)
-	tgt_name=intelmic
+	tgt_plugin=intelmic
 	;;
       nvptx*)
-        tgt_name=nvptx
+	tgt_plugin=nvptx
 	PLUGIN_NVPTX=$tgt
 	PLUGIN_NVPTX_CPPFLAGS=$CUDA_DRIVER_CPPFLAGS
 	PLUGIN_NVPTX_LDFLAGS=$CUDA_DRIVER_LDFLAGS
@@ -184,7 +188,7 @@  if test x"$enable_offload_targets" != x; then
 	    ;;
 	esac
 	;;
-      hsa*)
+      hsa)
 	case "${target}" in
 	  x86_64-*-*)
 	    case " ${CC} ${CFLAGS} " in
@@ -192,7 +196,7 @@  if test x"$enable_offload_targets" != x; then
 	        PLUGIN_HSA=0
 		;;
 	      *)
-	        tgt_name=hsa
+		tgt_plugin=hsa
 	        PLUGIN_HSA=$tgt
 	        PLUGIN_HSA_CPPFLAGS=$HSA_RUNTIME_CPPFLAGS
 	        PLUGIN_HSA_LDFLAGS="$HSA_RUNTIME_LDFLAGS $HSA_KMT_LDFLAGS"
@@ -214,7 +218,7 @@  if test x"$enable_offload_targets" != x; then
 	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
 	        LIBS=$PLUGIN_HSA_save_LIBS
 	        case $PLUGIN_HSA in
-	          hsa*)
+		  hsa)
 	            HSA_PLUGIN=0
 	            AC_MSG_ERROR([HSA run-time package required for HSA support])
 	            ;;
@@ -231,16 +235,19 @@  if test x"$enable_offload_targets" != x; then
 	AC_MSG_ERROR([unknown offload target specified])
 	;;
     esac
-    if test x"$tgt_name" = x; then
+    if test x"$tgt_plugin" = x; then
       # Don't configure libgomp for this offloading target if we don't build
       # the corresponding plugin.
       continue
-    elif test x"$offload_targets" = x; then
-      offload_targets=$tgt_name
+    elif test x"$offload_plugins" = x; then
+      offload_plugins=$tgt_plugin
+      offload_targets=$tgt
     else
-      offload_targets=$offload_targets,$tgt_name
+      offload_plugins=$offload_plugins,$tgt_plugin
+      offload_targets=$offload_targets,$tgt
     fi
-    if test "$tgt_name" = hsa; then
+    # Configure additional search paths.
+    if test "$tgt_plugin" = hsa; then
       # Offloading compilation is all handled by the target compiler.
       :
     elif test x"$tgt_dir" != x; then
@@ -252,8 +259,8 @@  if test x"$enable_offload_targets" != x; then
     fi
   done
 fi
-AC_DEFINE_UNQUOTED(OFFLOAD_TARGETS, "$offload_targets",
-  [Define to offload targets, separated by commas.])
+AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
+  [Define to offload plugins, separated by commas.])
 AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
 AC_DEFINE_UNQUOTED([PLUGIN_NVPTX], [$PLUGIN_NVPTX],
   [Define to 1 if the NVIDIA plugin is built, 0 if not.])
diff --git libgomp/target.c libgomp/target.c
index e2dd0e0..c12c085 100644
--- libgomp/target.c
+++ libgomp/target.c
@@ -2467,9 +2467,9 @@  gomp_target_fini (void)
     }
 }
 
-/* This function initializes the runtime needed for offloading.
-   It parses the list of offload targets and tries to load the plugins for
-   these targets.  On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
+/* This function initializes the runtime for offloading.
+   It parses the list of offload plugins, and tries to load these.
+   On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP
    will be set, and the array DEVICES initialized, containing descriptors for
    corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows
    by the others.  */
@@ -2486,7 +2486,7 @@  gomp_target_init (void)
   num_devices = 0;
   devices = NULL;
 
-  cur = OFFLOAD_TARGETS;
+  cur = OFFLOAD_PLUGINS;
   if (*cur)
     do
       {
diff --git libgomp/testsuite/Makefile.in libgomp/testsuite/Makefile.in
[snipped]
diff --git libgomp/testsuite/lib/libgomp.exp libgomp/testsuite/lib/libgomp.exp
index 1cb4991..4a25421 100644
--- libgomp/testsuite/lib/libgomp.exp
+++ libgomp/testsuite/lib/libgomp.exp
@@ -36,28 +36,6 @@  load_gcc_lib fortran-modules.exp
 # Try to load a test support file, built during libgomp configuration.
 load_file libgomp-test-support.exp
 
-# Populate offload_targets_s (offloading targets separated by a space), and
-# offload_targets_s_openacc (the same, but with OpenACC names; OpenACC spells
-# some of them a little differently).
-set offload_targets_s [split $offload_targets ","]
-set offload_targets_s_openacc {}
-foreach offload_target_openacc $offload_targets_s {
-    # Translate to OpenACC names, or skip if not yet supported.
-    switch $offload_target_openacc {
-	intelmic {
-	    continue
-	}
-	nvptx {
-	    set offload_target_openacc "nvidia"
-	}
-	hsa {
-	    continue
-	}
-    }
-    lappend offload_targets_s_openacc "$offload_target_openacc"
-}
-lappend offload_targets_s_openacc "host"
-
 set dg-do-what-default run
 
 #
@@ -135,9 +113,9 @@  proc libgomp_init { args } {
     set always_ld_library_path ".:${blddir}/.libs"
 
     # Add liboffloadmic build directory in LD_LIBRARY_PATH to support
-    # non-fallback testing for Intel MIC targets
+    # Intel MIC offloading testing.
     global offload_targets
-    if { [string match "*,intelmic,*" ",$offload_targets,"] } {
+    if { [string match "*,*-intelmic*,*" ",$offload_targets,"] } {
 	append always_ld_library_path ":${blddir}/../liboffloadmic/.libs"
 	append always_ld_library_path ":${blddir}/../liboffloadmic/plugin/.libs"
 	# libstdc++ is required by liboffloadmic
@@ -245,8 +223,7 @@  proc libgomp_init { args } {
     # Disable color diagnostics
     lappend ALWAYS_CFLAGS "additional_flags=-fdiagnostics-color=never"
 
-    # Used for support non-fallback offloading.
-    # Help GCC to find target mkoffload.
+    # Help GCC to find offload compilers' mkoffload.
     global offload_additional_options
     if { $offload_additional_options != "" } {
 	lappend ALWAYS_CFLAGS "additional_flags=${offload_additional_options}"
@@ -322,6 +299,28 @@  proc libgomp_option_proc { option } {
     }
 }
 
+# Translate offload target to OpenACC device type.  Return the empty string if
+# not suitable or not yet supported, and "host" for offload target "disable".
+proc offload_target_to_openacc_device_type { offload_target } {
+    switch -glob $offload_target {
+	disable {
+	    return "host"
+	}
+	hsa {
+	    return ""
+	}
+	*-intelmic* {
+	    return ""
+	}
+	nvptx* {
+	    return "nvidia"
+	}
+	default {
+	    error "Unknwon offload target: $offload_target"
+	}
+    }
+}
+
 # Return 1 if offload device is available.
 proc check_effective_target_offload_device { } {
     return [check_runtime_nocache offload_device_available_ {
@@ -373,29 +372,22 @@  proc check_effective_target_openacc_nvidia_accel_present { } {
     } "" ]
 }
 
-# Return 1 if at least one nvidia board is present, and the nvidia device type
-# is selected by default by means of setting the environment variable
-# ACC_DEVICE_TYPE.
+# Return 1 if at least one nvidia board is present, and the OpenACC "nvidia"
+# device type is selected.
 
 proc check_effective_target_openacc_nvidia_accel_selected { } {
     if { ![check_effective_target_openacc_nvidia_accel_present] } {
 	return 0;
     }
-    global offload_target_openacc
-    if { $offload_target_openacc == "nvidia" } {
-        return 1;
-    }
-    return 0;
+    global openacc_device_type
+    return [string match "nvidia" $openacc_device_type]
 }
 
-# Return 1 if the host target is selected for offloaded
+# Return 1 if the OpenACC "host" device type is selected.
 
 proc check_effective_target_openacc_host_selected { } {
-    global offload_target_openacc
-    if { $offload_target_openacc == "host" } {
-        return 1;
-    }
-    return 0;
+    global openacc_device_type
+    return [string match "host" $openacc_device_type]
 }
 
 # Return 1 if the selected OMP device is actually a HSA device
diff --git libgomp/testsuite/libgomp.oacc-c++/c++.exp libgomp/testsuite/libgomp.oacc-c++/c++.exp
index 608b298..befb921 100644
--- libgomp/testsuite/libgomp.oacc-c++/c++.exp
+++ libgomp/testsuite/libgomp.oacc-c++/c++.exp
@@ -70,18 +70,23 @@  if { $lang_test_file_found } {
 	set libstdcxx_includes ""
     }
 
-    # Test OpenACC with available accelerators.
-    foreach offload_target_openacc $offload_targets_s_openacc {
-	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
+    # Test with all offload targets, and with offloading disabled.
+    foreach offload_target [concat [split $offload_targets ","] "disable"] {
+	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
+	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
 
-	switch $offload_target_openacc {
-	    host {
+	switch $openacc_device_type {
+	    "" {
+		untested "$subdir $offload_target offloading"
+		continue
+	    }
+	    "host" {
 		set acc_mem_shared 1
 	    }
-	    nvidia {
+	    "nvidia" {
 		if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
-		    untested "$subdir $offload_target_openacc offloading"
+		    untested "$subdir $offload_target offloading"
 		    continue
 		}
 
@@ -94,12 +99,15 @@  if { $lang_test_file_found } {
 		set acc_mem_shared 0
 	    }
 	    default {
-		set acc_mem_shared 0
+		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
 	    }
 	}
 	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
 
-	setenv ACC_DEVICE_TYPE $offload_target_openacc
+	# To avoid overhead, by default only build for the offload target that
+	# we're actually going to test.
+	set tagopt "$tagopt -foffload=$offload_target"
+	setenv ACC_DEVICE_TYPE $openacc_device_type
 
 	# To get better test coverage for device-specific code that is only
 	# ever used in offloading configurations, we'd like more thorough
@@ -108,8 +116,8 @@  if { $lang_test_file_found } {
 	# -O0 and -O2 only, to avoid testing times exploding too much, under
 	# the assumption that between -O0 and -O[something] there is the
 	# biggest difference in the overall structure of the generated code.
-	switch $offload_target_openacc {
-	    host {
+	switch $offload_target {
+	    "disable" {
 		set-torture-options [list \
 					 { -O2 } ]
 	    }
diff --git libgomp/testsuite/libgomp.oacc-c/c.exp libgomp/testsuite/libgomp.oacc-c/c.exp
index b509a10..5355b87 100644
--- libgomp/testsuite/libgomp.oacc-c/c.exp
+++ libgomp/testsuite/libgomp.oacc-c/c.exp
@@ -31,20 +31,25 @@  set ld_library_path $always_ld_library_path
 append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
 set_ld_library_path_env_vars
 
-# Test OpenACC with available accelerators.
+# Test with all offload targets, and with offloading disabled.
 set SAVE_ALWAYS_CFLAGS "$ALWAYS_CFLAGS"
-foreach offload_target_openacc $offload_targets_s_openacc {
+foreach offload_target [concat [split $offload_targets ","] "disable"] {
     set ALWAYS_CFLAGS "$SAVE_ALWAYS_CFLAGS"
-    set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
+    set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
+    set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
 
-    switch $offload_target_openacc {
-	host {
+    switch $openacc_device_type {
+	"" {
+	    untested "$subdir $offload_target offloading"
+	    continue
+	}
+	"host" {
 	    set acc_mem_shared 1
 	}
-	nvidia {
+	"nvidia" {
 	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		# Don't bother; execution testing is going to FAIL.
-		untested "$subdir $offload_target_openacc offloading"
+		untested "$subdir $offload_target offloading"
 		continue
 	    }
 
@@ -57,12 +62,15 @@  foreach offload_target_openacc $offload_targets_s_openacc {
 	    set acc_mem_shared 0
 	}
 	default {
-	    set acc_mem_shared 0
+	    error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
 	}
     }
     set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
 
-    setenv ACC_DEVICE_TYPE $offload_target_openacc
+    # To avoid overhead, by default only build for the offload target that
+    # we're actually going to test.
+    set tagopt "$tagopt -foffload=$offload_target"
+    setenv ACC_DEVICE_TYPE $openacc_device_type
 
     # To get better test coverage for device-specific code that is only
     # ever used in offloading configurations, we'd like more thorough
@@ -71,8 +79,8 @@  foreach offload_target_openacc $offload_targets_s_openacc {
     # -O0 and -O2 only, to avoid testing times exploding too much, under
     # the assumption that between -O0 and -O[something] there is the
     # biggest difference in the overall structure of the generated code.
-    switch $offload_target_openacc {
-	host {
+    switch $offload_target {
+	"disable" {
 	    set-torture-options [list \
 				     { -O2 } ]
 	}
diff --git libgomp/testsuite/libgomp.oacc-fortran/fortran.exp libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
index 2d6b647..8507b67 100644
--- libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
+++ libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
@@ -65,30 +65,38 @@  if { $lang_test_file_found } {
     append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
     set_ld_library_path_env_vars
 
-    # Test OpenACC with available accelerators.
-    foreach offload_target_openacc $offload_targets_s_openacc {
-	set tagopt "-DACC_DEVICE_TYPE_$offload_target_openacc=1"
+    # Test with all offload targets, and with offloading disabled.
+    foreach offload_target [concat [split $offload_targets ","] "disable"] {
+	set openacc_device_type [offload_target_to_openacc_device_type $offload_target]
+	set tagopt "-DACC_DEVICE_TYPE_$openacc_device_type=1"
 
-	switch $offload_target_openacc {
+	switch $openacc_device_type {
+	    "" {
+		untested "$subdir $offload_target offloading"
+		continue
+	    }
 	    host {
 		set acc_mem_shared 1
 	    }
 	    nvidia {
 		if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
-		    untested "$subdir $offload_target_openacc offloading"
+		    untested "$subdir $offload_target offloading"
 		    continue
 		}
 
 		set acc_mem_shared 0
 	    }
 	    default {
-		set acc_mem_shared 0
+		error "Unknwon OpenACC device type: $openacc_device_type (offload target: $offload_target)"
 	    }
 	}
 	set tagopt "$tagopt -DACC_MEM_SHARED=$acc_mem_shared"
 
-	setenv ACC_DEVICE_TYPE $offload_target_openacc
+	# To avoid overhead, by default only build for the offload target that
+	# we're actually going to test.
+	set tagopt "$tagopt -foffload=$offload_target"
+	setenv ACC_DEVICE_TYPE $openacc_device_type
 
 	# For Fortran we're doing torture testing, as Fortran has far more tests
 	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is