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

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

Commit Message

Thomas Schwinge July 13, 2016, 10:37 a.m. UTC
Hi!

As discussed before, "offloading compilation is slow; I suppose because
of having to invoke several tools (LTO streaming -> mkoffload -> offload
compilers, assemblers, linkers -> combine the resulting images; but I
have not done a detailed analysis on that)".  For this reason it is
beneficial (that is, it is measurable in libgomp testing wall time) to
limit offload compilation to the one (in the OpenACC case) offload target
that we're actually going to test (that is, execute).  Another reason is
that -foffload=-fdump-tree-[...] produces clashes (that is,
unpredicatable outcome) in the file names of offload compilations' dump
files' names.  Here is a patch to implement that, to specify
-foffload=[...] during libgomp OpenACC testing.  As that has been
challenged before:

| [...] 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.

OK for trunk?

commit 5fdb515826769ebb36bc5c49a3ffac4d17a8a589
Author: Thomas Schwinge <thomas@codesourcery.com>
Date:   Wed Jul 13 11:37:16 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: Enumerate both offload plugins and offload
    	targets.
    	(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 July 20, 2016, 11:52 a.m. UTC | #1
Hi!

Ping.

On Wed, 13 Jul 2016 12:37:07 +0200, I wrote:
> As discussed before, "offloading compilation is slow; I suppose because
> of having to invoke several tools (LTO streaming -> mkoffload -> offload
> compilers, assemblers, linkers -> combine the resulting images; but I
> have not done a detailed analysis on that)".  For this reason it is
> beneficial (that is, it is measurable in libgomp testing wall time) to
> limit offload compilation to the one (in the OpenACC case) offload target
> that we're actually going to test (that is, execute).  Another reason is
> that -foffload=-fdump-tree-[...] produces clashes (that is,
> unpredicatable outcome) in the file names of offload compilations' dump
> files' names.  Here is a patch to implement that, to specify
> -foffload=[...] during libgomp OpenACC testing.  As that has been
> challenged before:
> 
> | [...] 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.
> 
> OK for trunk?
> 
> commit 5fdb515826769ebb36bc5c49a3ffac4d17a8a589
> Author: Thomas Schwinge <thomas@codesourcery.com>
> Date:   Wed Jul 13 11:37:16 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: Enumerate both offload plugins and offload
>     	targets.
>     	(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
> index 88c8517..33be8c7 100644
> --- libgomp/Makefile.in
> +++ libgomp/Makefile.in
> @@ -380,6 +380,7 @@ mkdir_p = @mkdir_p@
>  multi_basedir = @multi_basedir@
>  offload_additional_lib_paths = @offload_additional_lib_paths@
>  offload_additional_options = @offload_additional_options@
> +offload_plugins = @offload_plugins@
>  offload_targets = @offload_targets@
>  oldincludedir = @oldincludedir@
>  pdfdir = @pdfdir@
> diff --git libgomp/config.h.in libgomp/config.h.in
> index 226ac53..28f7b2d 100644
> --- libgomp/config.h.in
> +++ libgomp/config.h.in
> @@ -98,8 +98,8 @@
>     */
>  #undef LT_OBJDIR
>  
> -/* Define to offload targets, separated by commas. */
> -#undef OFFLOAD_TARGETS
> +/* Define to offload plugins, separated by commas. */
> +#undef OFFLOAD_PLUGINS
>  
>  /* Name of package */
>  #undef PACKAGE
> diff --git libgomp/configure libgomp/configure
> index 8d03eb6..4baab20 100755
> --- libgomp/configure
> +++ libgomp/configure
> @@ -633,6 +633,8 @@ PLUGIN_NVPTX_FALSE
>  PLUGIN_NVPTX_TRUE
>  offload_additional_lib_paths
>  offload_additional_options
> +offload_targets
> +offload_plugins
>  PLUGIN_HSA_LIBS
>  PLUGIN_HSA_LDFLAGS
>  PLUGIN_HSA_CPPFLAGS
> @@ -646,7 +648,6 @@ PLUGIN_NVPTX_CPPFLAGS
>  PLUGIN_NVPTX
>  CUDA_DRIVER_LIB
>  CUDA_DRIVER_INCLUDE
> -offload_targets
>  libtool_VERSION
>  ac_ct_FC
>  FCFLAGS
> @@ -11145,7 +11146,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 11148 "configure"
> +#line 11149 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -11251,7 +11252,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 11254 "configure"
> +#line 11255 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -15140,8 +15141,6 @@ esac
>  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  # <http://www.gnu.org/licenses/>.
>  
> -offload_targets=
> -
>  plugin_support=yes
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5
>  $as_echo_n "checking for dlsym in -ldl... " >&6; }
> @@ -15320,7 +15319,13 @@ 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=
> +
> +
>  offload_additional_options=
>  offload_additional_lib_paths=
>  
> @@ -15329,13 +15334,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
> @@ -15373,7 +15378,7 @@ rm -f core conftest.err conftest.$ac_objext \
>  	    ;;
>  	esac
>  	;;
> -      hsa*)
> +      hsa)
>  	case "${target}" in
>  	  x86_64-*-*)
>  	    case " ${CC} ${CFLAGS} " in
> @@ -15381,7 +15386,7 @@ rm -f core conftest.err conftest.$ac_objext \
>  	        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"
> @@ -15414,7 +15419,7 @@ rm -f core conftest.err conftest.$ac_objext \
>  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
>  	        LIBS=$PLUGIN_HSA_save_LIBS
>  	        case $PLUGIN_HSA in
> -	          hsa*)
> +		  hsa)
>  	            HSA_PLUGIN=0
>  	            as_fn_error "HSA run-time package required for HSA support" "$LINENO" 5
>  	            ;;
> @@ -15431,16 +15436,19 @@ rm -f core conftest.err conftest.$ac_objext \
>  	as_fn_error "unknown offload target specified" "$LINENO" 5
>  	;;
>      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
> @@ -15454,7 +15462,7 @@ rm -f core conftest.err conftest.$ac_objext \
>  fi
>  
>  cat >>confdefs.h <<_ACEOF
> -#define OFFLOAD_TARGETS "$offload_targets"
> +#define OFFLOAD_PLUGINS "$offload_plugins"
>  _ACEOF
>  
>   if test $PLUGIN_NVPTX = 1; then
> 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 48b9ab8..2b7e627 100644
> --- libgomp/target.c
> +++ libgomp/target.c
> @@ -2474,9 +2474,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.  */
> @@ -2493,7 +2493,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
> index 4dbb406..2092dcd 100644
> --- libgomp/testsuite/Makefile.in
> +++ libgomp/testsuite/Makefile.in
> @@ -223,6 +223,7 @@ mkdir_p = @mkdir_p@
>  multi_basedir = @multi_basedir@
>  offload_additional_lib_paths = @offload_additional_lib_paths@
>  offload_additional_options = @offload_additional_options@
> +offload_plugins = @offload_plugins@
>  offload_targets = @offload_targets@
>  oldincludedir = @oldincludedir@
>  pdfdir = @pdfdir@
> 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 July 27, 2016, 4:03 p.m. UTC | #2
Hi!

Ping.

On Wed, 20 Jul 2016 13:52:20 +0200, I wrote:
> Ping.
> 
> On Wed, 13 Jul 2016 12:37:07 +0200, I wrote:
> > As discussed before, "offloading compilation is slow; I suppose because
> > of having to invoke several tools (LTO streaming -> mkoffload -> offload
> > compilers, assemblers, linkers -> combine the resulting images; but I
> > have not done a detailed analysis on that)".  For this reason it is
> > beneficial (that is, it is measurable in libgomp testing wall time) to
> > limit offload compilation to the one (in the OpenACC case) offload target
> > that we're actually going to test (that is, execute).  Another reason is
> > that -foffload=-fdump-tree-[...] produces clashes (that is,
> > unpredicatable outcome) in the file names of offload compilations' dump
> > files' names.  Here is a patch to implement that, to specify
> > -foffload=[...] during libgomp OpenACC testing.  As that has been
> > challenged before:
> > 
> > | [...] 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.
> > 
> > OK for trunk?
> > 
> > commit 5fdb515826769ebb36bc5c49a3ffac4d17a8a589
> > Author: Thomas Schwinge <thomas@codesourcery.com>
> > Date:   Wed Jul 13 11:37:16 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: Enumerate both offload plugins and offload
> >     	targets.
> >     	(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
> > index 88c8517..33be8c7 100644
> > --- libgomp/Makefile.in
> > +++ libgomp/Makefile.in
> > @@ -380,6 +380,7 @@ mkdir_p = @mkdir_p@
> >  multi_basedir = @multi_basedir@
> >  offload_additional_lib_paths = @offload_additional_lib_paths@
> >  offload_additional_options = @offload_additional_options@
> > +offload_plugins = @offload_plugins@
> >  offload_targets = @offload_targets@
> >  oldincludedir = @oldincludedir@
> >  pdfdir = @pdfdir@
> > diff --git libgomp/config.h.in libgomp/config.h.in
> > index 226ac53..28f7b2d 100644
> > --- libgomp/config.h.in
> > +++ libgomp/config.h.in
> > @@ -98,8 +98,8 @@
> >     */
> >  #undef LT_OBJDIR
> >  
> > -/* Define to offload targets, separated by commas. */
> > -#undef OFFLOAD_TARGETS
> > +/* Define to offload plugins, separated by commas. */
> > +#undef OFFLOAD_PLUGINS
> >  
> >  /* Name of package */
> >  #undef PACKAGE
> > diff --git libgomp/configure libgomp/configure
> > index 8d03eb6..4baab20 100755
> > --- libgomp/configure
> > +++ libgomp/configure
> > @@ -633,6 +633,8 @@ PLUGIN_NVPTX_FALSE
> >  PLUGIN_NVPTX_TRUE
> >  offload_additional_lib_paths
> >  offload_additional_options
> > +offload_targets
> > +offload_plugins
> >  PLUGIN_HSA_LIBS
> >  PLUGIN_HSA_LDFLAGS
> >  PLUGIN_HSA_CPPFLAGS
> > @@ -646,7 +648,6 @@ PLUGIN_NVPTX_CPPFLAGS
> >  PLUGIN_NVPTX
> >  CUDA_DRIVER_LIB
> >  CUDA_DRIVER_INCLUDE
> > -offload_targets
> >  libtool_VERSION
> >  ac_ct_FC
> >  FCFLAGS
> > @@ -11145,7 +11146,7 @@ else
> >    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> >    lt_status=$lt_dlunknown
> >    cat > conftest.$ac_ext <<_LT_EOF
> > -#line 11148 "configure"
> > +#line 11149 "configure"
> >  #include "confdefs.h"
> >  
> >  #if HAVE_DLFCN_H
> > @@ -11251,7 +11252,7 @@ else
> >    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> >    lt_status=$lt_dlunknown
> >    cat > conftest.$ac_ext <<_LT_EOF
> > -#line 11254 "configure"
> > +#line 11255 "configure"
> >  #include "confdefs.h"
> >  
> >  #if HAVE_DLFCN_H
> > @@ -15140,8 +15141,6 @@ esac
> >  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> >  # <http://www.gnu.org/licenses/>.
> >  
> > -offload_targets=
> > -
> >  plugin_support=yes
> >  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5
> >  $as_echo_n "checking for dlsym in -ldl... " >&6; }
> > @@ -15320,7 +15319,13 @@ 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=
> > +
> > +
> >  offload_additional_options=
> >  offload_additional_lib_paths=
> >  
> > @@ -15329,13 +15334,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
> > @@ -15373,7 +15378,7 @@ rm -f core conftest.err conftest.$ac_objext \
> >  	    ;;
> >  	esac
> >  	;;
> > -      hsa*)
> > +      hsa)
> >  	case "${target}" in
> >  	  x86_64-*-*)
> >  	    case " ${CC} ${CFLAGS} " in
> > @@ -15381,7 +15386,7 @@ rm -f core conftest.err conftest.$ac_objext \
> >  	        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"
> > @@ -15414,7 +15419,7 @@ rm -f core conftest.err conftest.$ac_objext \
> >  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
> >  	        LIBS=$PLUGIN_HSA_save_LIBS
> >  	        case $PLUGIN_HSA in
> > -	          hsa*)
> > +		  hsa)
> >  	            HSA_PLUGIN=0
> >  	            as_fn_error "HSA run-time package required for HSA support" "$LINENO" 5
> >  	            ;;
> > @@ -15431,16 +15436,19 @@ rm -f core conftest.err conftest.$ac_objext \
> >  	as_fn_error "unknown offload target specified" "$LINENO" 5
> >  	;;
> >      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
> > @@ -15454,7 +15462,7 @@ rm -f core conftest.err conftest.$ac_objext \
> >  fi
> >  
> >  cat >>confdefs.h <<_ACEOF
> > -#define OFFLOAD_TARGETS "$offload_targets"
> > +#define OFFLOAD_PLUGINS "$offload_plugins"
> >  _ACEOF
> >  
> >   if test $PLUGIN_NVPTX = 1; then
> > 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 48b9ab8..2b7e627 100644
> > --- libgomp/target.c
> > +++ libgomp/target.c
> > @@ -2474,9 +2474,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.  */
> > @@ -2493,7 +2493,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
> > index 4dbb406..2092dcd 100644
> > --- libgomp/testsuite/Makefile.in
> > +++ libgomp/testsuite/Makefile.in
> > @@ -223,6 +223,7 @@ mkdir_p = @mkdir_p@
> >  multi_basedir = @multi_basedir@
> >  offload_additional_lib_paths = @offload_additional_lib_paths@
> >  offload_additional_options = @offload_additional_options@
> > +offload_plugins = @offload_plugins@
> >  offload_targets = @offload_targets@
> >  oldincludedir = @oldincludedir@
> >  pdfdir = @pdfdir@
> > 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 Aug. 4, 2016, 2:49 p.m. UTC | #3
Hi!

Ping.

It has now been more than three months (!) that I first submitted this,
without receiving any meaningful review.  (Apart from one initial
"deprecative" comment by Jakub, which I then repeatedly detailed on,
without receiving any further response.)
<https://gcc.gnu.org/ml/gcc-patches/2016-04/msg01787.html>.

I suppose, if I weren't paid for paid for this, I would have run away
long ago, and would have looked for another project to contribute to.
:-(

I'm CCing the GCC Steering Committee here -- not necessarily only because
of this one patch, but generally, I think it's a bad situation that
apparently Jakub (who I acknowledge is always very busy with all kinds of
tasks) has de facto become the single reviewer of
OpenACC/OpenMP/offloading patches.  I'm certainly not going in any way to
disapprove Jakub's help, skills and experience, but I'm more and more
worried about this "bus factor" of one single person
(<https://en.wikipedia.org/wiki/Bus_factor>).

As I'm unable (huh?) to find an email address to reach the GCC Steering
Committee, I'm CCing <gcc@gcc.gnu.org> as suggested on
<https://gcc.gnu.org/steering.html>, and David Edelsohn, who seems to
handle most of the visible communication of the GCC Steering Committee.

When raising a similar concern months ago, an answer as given (by Jakub
himself, if I remember correctly), was that in addition to him, all
Global Reviewers are welcome to review OpenACC/OpenMP/offloading patches.
But that doesn't help if that's then not happening in reality.  (With the
exception of Bernd, who then did review such patches for a while, but
also seems to have stopped with that again.)

To the best of my knowledge, I'm following the procedures correctly
(please tell me if I'm not!), including pinging patches regularly (once a
week, typically).

Help.  I'm just trying to contribute my share for keeping GCC alive and
relevant.  :-)

On Wed, 27 Jul 2016 18:03:32 +0200, I wrote:
> Ping.
> 
> On Wed, 20 Jul 2016 13:52:20 +0200, I wrote:
> > Ping.
> > 
> > On Wed, 13 Jul 2016 12:37:07 +0200, I wrote:
> > > As discussed before, "offloading compilation is slow; I suppose because
> > > of having to invoke several tools (LTO streaming -> mkoffload -> offload
> > > compilers, assemblers, linkers -> combine the resulting images; but I
> > > have not done a detailed analysis on that)".  For this reason it is
> > > beneficial (that is, it is measurable in libgomp testing wall time) to
> > > limit offload compilation to the one (in the OpenACC case) offload target
> > > that we're actually going to test (that is, execute).  Another reason is
> > > that -foffload=-fdump-tree-[...] produces clashes (that is,
> > > unpredicatable outcome) in the file names of offload compilations' dump
> > > files' names.  Here is a patch to implement that, to specify
> > > -foffload=[...] during libgomp OpenACC testing.  As that has been
> > > challenged before:
> > > 
> > > | [...] 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.
> > > 
> > > OK for trunk?
> > > 
> > > commit 5fdb515826769ebb36bc5c49a3ffac4d17a8a589
> > > Author: Thomas Schwinge <thomas@codesourcery.com>
> > > Date:   Wed Jul 13 11:37:16 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: Enumerate both offload plugins and offload
> > >     	targets.
> > >     	(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
> > > index 88c8517..33be8c7 100644
> > > --- libgomp/Makefile.in
> > > +++ libgomp/Makefile.in
> > > @@ -380,6 +380,7 @@ mkdir_p = @mkdir_p@
> > >  multi_basedir = @multi_basedir@
> > >  offload_additional_lib_paths = @offload_additional_lib_paths@
> > >  offload_additional_options = @offload_additional_options@
> > > +offload_plugins = @offload_plugins@
> > >  offload_targets = @offload_targets@
> > >  oldincludedir = @oldincludedir@
> > >  pdfdir = @pdfdir@
> > > diff --git libgomp/config.h.in libgomp/config.h.in
> > > index 226ac53..28f7b2d 100644
> > > --- libgomp/config.h.in
> > > +++ libgomp/config.h.in
> > > @@ -98,8 +98,8 @@
> > >     */
> > >  #undef LT_OBJDIR
> > >  
> > > -/* Define to offload targets, separated by commas. */
> > > -#undef OFFLOAD_TARGETS
> > > +/* Define to offload plugins, separated by commas. */
> > > +#undef OFFLOAD_PLUGINS
> > >  
> > >  /* Name of package */
> > >  #undef PACKAGE
> > > diff --git libgomp/configure libgomp/configure
> > > index 8d03eb6..4baab20 100755
> > > --- libgomp/configure
> > > +++ libgomp/configure
> > > @@ -633,6 +633,8 @@ PLUGIN_NVPTX_FALSE
> > >  PLUGIN_NVPTX_TRUE
> > >  offload_additional_lib_paths
> > >  offload_additional_options
> > > +offload_targets
> > > +offload_plugins
> > >  PLUGIN_HSA_LIBS
> > >  PLUGIN_HSA_LDFLAGS
> > >  PLUGIN_HSA_CPPFLAGS
> > > @@ -646,7 +648,6 @@ PLUGIN_NVPTX_CPPFLAGS
> > >  PLUGIN_NVPTX
> > >  CUDA_DRIVER_LIB
> > >  CUDA_DRIVER_INCLUDE
> > > -offload_targets
> > >  libtool_VERSION
> > >  ac_ct_FC
> > >  FCFLAGS
> > > @@ -11145,7 +11146,7 @@ else
> > >    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> > >    lt_status=$lt_dlunknown
> > >    cat > conftest.$ac_ext <<_LT_EOF
> > > -#line 11148 "configure"
> > > +#line 11149 "configure"
> > >  #include "confdefs.h"
> > >  
> > >  #if HAVE_DLFCN_H
> > > @@ -11251,7 +11252,7 @@ else
> > >    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> > >    lt_status=$lt_dlunknown
> > >    cat > conftest.$ac_ext <<_LT_EOF
> > > -#line 11254 "configure"
> > > +#line 11255 "configure"
> > >  #include "confdefs.h"
> > >  
> > >  #if HAVE_DLFCN_H
> > > @@ -15140,8 +15141,6 @@ esac
> > >  # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> > >  # <http://www.gnu.org/licenses/>.
> > >  
> > > -offload_targets=
> > > -
> > >  plugin_support=yes
> > >  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5
> > >  $as_echo_n "checking for dlsym in -ldl... " >&6; }
> > > @@ -15320,7 +15319,13 @@ 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=
> > > +
> > > +
> > >  offload_additional_options=
> > >  offload_additional_lib_paths=
> > >  
> > > @@ -15329,13 +15334,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
> > > @@ -15373,7 +15378,7 @@ rm -f core conftest.err conftest.$ac_objext \
> > >  	    ;;
> > >  	esac
> > >  	;;
> > > -      hsa*)
> > > +      hsa)
> > >  	case "${target}" in
> > >  	  x86_64-*-*)
> > >  	    case " ${CC} ${CFLAGS} " in
> > > @@ -15381,7 +15386,7 @@ rm -f core conftest.err conftest.$ac_objext \
> > >  	        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"
> > > @@ -15414,7 +15419,7 @@ rm -f core conftest.err conftest.$ac_objext \
> > >  	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
> > >  	        LIBS=$PLUGIN_HSA_save_LIBS
> > >  	        case $PLUGIN_HSA in
> > > -	          hsa*)
> > > +		  hsa)
> > >  	            HSA_PLUGIN=0
> > >  	            as_fn_error "HSA run-time package required for HSA support" "$LINENO" 5
> > >  	            ;;
> > > @@ -15431,16 +15436,19 @@ rm -f core conftest.err conftest.$ac_objext \
> > >  	as_fn_error "unknown offload target specified" "$LINENO" 5
> > >  	;;
> > >      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
> > > @@ -15454,7 +15462,7 @@ rm -f core conftest.err conftest.$ac_objext \
> > >  fi
> > >  
> > >  cat >>confdefs.h <<_ACEOF
> > > -#define OFFLOAD_TARGETS "$offload_targets"
> > > +#define OFFLOAD_PLUGINS "$offload_plugins"
> > >  _ACEOF
> > >  
> > >   if test $PLUGIN_NVPTX = 1; then
> > > 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 48b9ab8..2b7e627 100644
> > > --- libgomp/target.c
> > > +++ libgomp/target.c
> > > @@ -2474,9 +2474,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.  */
> > > @@ -2493,7 +2493,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
> > > index 4dbb406..2092dcd 100644
> > > --- libgomp/testsuite/Makefile.in
> > > +++ libgomp/testsuite/Makefile.in
> > > @@ -223,6 +223,7 @@ mkdir_p = @mkdir_p@
> > >  multi_basedir = @multi_basedir@
> > >  offload_additional_lib_paths = @offload_additional_lib_paths@
> > >  offload_additional_options = @offload_additional_options@
> > > +offload_plugins = @offload_plugins@
> > >  offload_targets = @offload_targets@
> > >  oldincludedir = @oldincludedir@
> > >  pdfdir = @pdfdir@
> > > 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
Bernd Schmidt Aug. 5, 2016, 3:26 p.m. UTC | #4
On 08/04/2016 04:49 PM, Thomas Schwinge wrote:
> Global Reviewers are welcome to review OpenACC/OpenMP/offloading patches.
> But that doesn't help if that's then not happening in reality.  (With the
> exception of Bernd, who then did review such patches for a while, but
> also seems to have stopped with that again.)

As for this particular patch, I saw it go by, but there were a number of 
things that stopped me from looking at it which I'll try to explain. The 
one quoted seems to be just a resubmission of one that was posted 
towards the end of this thread:

> <https://gcc.gnu.org/ml/gcc-patches/2016-04/msg01787.html>.

(The resubmission should have contained a pointer to that thread).

That's a submission of three patches. If you follow that thread, you'll 
see that Jakub objected to one of them, asking you to provide a smaller 
one with just the necessary functional changes. In response you posted 
what appears to be just a merge of all three patches together. From my 
point of view, I see no reason to go near it if Jakub has unaddressed 
objections.

It's possible that I've misunderstood something, but that leads me to 
one piece of advice I could give (and I'm repeating myself here): write 
clearer patch introductions. After reading this:

>>> On Wed, 13 Jul 2016 12:37:07 +0200, I wrote:
>>>> As discussed before, "offloading compilation is slow; I suppose because
>>>> of having to invoke several tools (LTO streaming -> mkoffload -> offload
>>>> compilers, assemblers, linkers -> combine the resulting images; but I
>>>> have not done a detailed analysis on that)".  For this reason it is
>>>> beneficial (that is, it is measurable in libgomp testing wall time) to
>>>> limit offload compilation to the one (in the OpenACC case) offload target
>>>> that we're actually going to test (that is, execute).  Another reason is
>>>> that -foffload=-fdump-tree-[...] produces clashes (that is,
>>>> unpredicatable outcome) in the file names of offload compilations' dump
>>>> files' names.  Here is a patch to implement that, to specify
>>>> -foffload=[...] during libgomp OpenACC testing.  As that has been
>>>> challenged before:
>>>>
>>>> | [...] 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.

I'm already somewhat confused about what you want to achieve and how. It 
sounds like you're trying to fix a dejagnu issue but then I look at the 
patch and see lots of libgomp configury changes.

Avoid writing information that is irrelevant to the patch at hand, such 
as most of the first sentence in the block quoted above. Don't quote 
yourself from past discussions, write something new that's specific and 
relevant to someone who's going to try and understand your patch. Try 
not to have three or four parenthetical comments in one sentence.

A better way to write the first paragraph might be:

"When testing libgomp for a compiler that supports more than one offload 
target, we iterate over the targets and run the test for each. That 
currently produces binaries for all offload targets, each time, which is 
wasted effort. Hence, this patch, which sets -foffload=xyz as 
appropriate.  This speeds up the compiler and also avoids name clashes 
between dump files."

That even adds information that was missing from your submission: I had 
to look at the patch to see that we iterate over targets, and that's 
relevant to the question of whether we need the patch or not.

Since the patch does way more, that needs to be adequately explained, 
and your original idea of a multi-part submission was in fact correct. 
You need to somehow deal with the fact that one of them was rejected, 
either using persuasion or reworking the other patches (possibly showing 
that such a reworking would be significantly worse).


Bernd
diff mbox

Patch

diff --git libgomp/Makefile.in libgomp/Makefile.in
index 88c8517..33be8c7 100644
--- libgomp/Makefile.in
+++ libgomp/Makefile.in
@@ -380,6 +380,7 @@  mkdir_p = @mkdir_p@
 multi_basedir = @multi_basedir@
 offload_additional_lib_paths = @offload_additional_lib_paths@
 offload_additional_options = @offload_additional_options@
+offload_plugins = @offload_plugins@
 offload_targets = @offload_targets@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
diff --git libgomp/config.h.in libgomp/config.h.in
index 226ac53..28f7b2d 100644
--- libgomp/config.h.in
+++ libgomp/config.h.in
@@ -98,8 +98,8 @@ 
    */
 #undef LT_OBJDIR
 
-/* Define to offload targets, separated by commas. */
-#undef OFFLOAD_TARGETS
+/* Define to offload plugins, separated by commas. */
+#undef OFFLOAD_PLUGINS
 
 /* Name of package */
 #undef PACKAGE
diff --git libgomp/configure libgomp/configure
index 8d03eb6..4baab20 100755
--- libgomp/configure
+++ libgomp/configure
@@ -633,6 +633,8 @@  PLUGIN_NVPTX_FALSE
 PLUGIN_NVPTX_TRUE
 offload_additional_lib_paths
 offload_additional_options
+offload_targets
+offload_plugins
 PLUGIN_HSA_LIBS
 PLUGIN_HSA_LDFLAGS
 PLUGIN_HSA_CPPFLAGS
@@ -646,7 +648,6 @@  PLUGIN_NVPTX_CPPFLAGS
 PLUGIN_NVPTX
 CUDA_DRIVER_LIB
 CUDA_DRIVER_INCLUDE
-offload_targets
 libtool_VERSION
 ac_ct_FC
 FCFLAGS
@@ -11145,7 +11146,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11148 "configure"
+#line 11149 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11251,7 +11252,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11254 "configure"
+#line 11255 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -15140,8 +15141,6 @@  esac
 # see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 # <http://www.gnu.org/licenses/>.
 
-offload_targets=
-
 plugin_support=yes
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5
 $as_echo_n "checking for dlsym in -ldl... " >&6; }
@@ -15320,7 +15319,13 @@  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=
+
+
 offload_additional_options=
 offload_additional_lib_paths=
 
@@ -15329,13 +15334,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
@@ -15373,7 +15378,7 @@  rm -f core conftest.err conftest.$ac_objext \
 	    ;;
 	esac
 	;;
-      hsa*)
+      hsa)
 	case "${target}" in
 	  x86_64-*-*)
 	    case " ${CC} ${CFLAGS} " in
@@ -15381,7 +15386,7 @@  rm -f core conftest.err conftest.$ac_objext \
 	        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"
@@ -15414,7 +15419,7 @@  rm -f core conftest.err conftest.$ac_objext \
 	        LDFLAGS=$PLUGIN_HSA_save_LDFLAGS
 	        LIBS=$PLUGIN_HSA_save_LIBS
 	        case $PLUGIN_HSA in
-	          hsa*)
+		  hsa)
 	            HSA_PLUGIN=0
 	            as_fn_error "HSA run-time package required for HSA support" "$LINENO" 5
 	            ;;
@@ -15431,16 +15436,19 @@  rm -f core conftest.err conftest.$ac_objext \
 	as_fn_error "unknown offload target specified" "$LINENO" 5
 	;;
     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
@@ -15454,7 +15462,7 @@  rm -f core conftest.err conftest.$ac_objext \
 fi
 
 cat >>confdefs.h <<_ACEOF
-#define OFFLOAD_TARGETS "$offload_targets"
+#define OFFLOAD_PLUGINS "$offload_plugins"
 _ACEOF
 
  if test $PLUGIN_NVPTX = 1; then
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 48b9ab8..2b7e627 100644
--- libgomp/target.c
+++ libgomp/target.c
@@ -2474,9 +2474,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.  */
@@ -2493,7 +2493,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
index 4dbb406..2092dcd 100644
--- libgomp/testsuite/Makefile.in
+++ libgomp/testsuite/Makefile.in
@@ -223,6 +223,7 @@  mkdir_p = @mkdir_p@
 multi_basedir = @multi_basedir@
 offload_additional_lib_paths = @offload_additional_lib_paths@
 offload_additional_options = @offload_additional_options@
+offload_plugins = @offload_plugins@
 offload_targets = @offload_targets@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
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