Hi!

When running parallel make check on hosts with large amounts of CPUs (cores
and/or threads), some libgomp tests take a long time to complete.  The
problem is that the libgomp runtime generally by default assumes (unless
omp_set_dynamic which checks /proc/loadavg) that it has the given cpu resources
all for itself, it has code to limit spinning if one process uses more cpus
than available to it, but doesn't track other cpu intensive processes.

So, when running say on 16 core 32 thread make -j32 -k check, some of the
libgomp threads may do a lot of spinning if other cpus are occupied by other
tests.

The following patch attempts to deal with that by noticing when running
make check as parallel (-j or -jN in $(MFLAGS)) and in that case (unless
overridden) will try to use far less spinning by default (increasing
latency, but lowering CPU consumption) and, if the host has more than 8 CPUs
limit tests to 8 CPUs.  It will mean somewhat smaller verification of
libgomp, if there are races or issues that could be reproduced only with
very many threads, on the other side hopefully people will burn less CPU
time when testing.
It will be desirable if people from time to time test
make check-target-libgomp
without any -jN options, that will run it with the old defaults.

So far tested on x86_64-linux with make -j2 check-target-libgomp
and make check-target-libgomp on 16c32t (on an otherwise quiet box
with -j2 it was slightly slower, 648s vs. 618s without -j2), but
haven't yet done full parallel regtest and see if it really helped.

Unfortunately, haven't figured out how to convince automake that I want to
write my own check-am goal, so had to drop dejagnu automake option and
add all the dejagnu stuff manually.

2018-11-23  Jakub Jelinek  <ja...@redhat.com>

        * testsuite/Makefile.am (AUTOMAKE_OPTIONS): Drop dejagnu.
        (RUNTEST): Don't define.
        (RUNTESTDEFAULTFLAGS): Add.
        (check-DEJAGNU, site.exp, distclean-DEJAGNU): New goals.
        (distclean-am): Depend on distclean-DEJAGNU.
        (check-am): If -j% option is present in MFLAGS, export
        GOMP_SPINCOUNT=1000 and, if number of `getconf _NPROCESSORS_ONLN` is
        more than 8, also OMP_NUM_THREADS=8.
        (.PHONY): Add check-DEJAGNU and distclean-DEJAGNU.
        * testsuite/Makefile.in: Regenerated.

--- libgomp/testsuite/Makefile.am.jj    2018-11-01 12:06:00.933664590 +0100
+++ libgomp/testsuite/Makefile.am       2018-11-23 13:31:55.455302410 +0100
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in.
 
-AUTOMAKE_OPTIONS = foreign dejagnu
+AUTOMAKE_OPTIONS = foreign
 
 # May be used by various substitution variables.
 gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
@@ -10,8 +10,7 @@ EXPECT = $(shell if test -f $(top_buildd
 
 _RUNTEST = $(shell if test -f $(top_srcdir)/../dejagnu/runtest; then \
             echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi)
-RUNTEST = $(_RUNTEST) $(AM_RUNTESTFLAGS)
-
+RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
 
 # Instead of directly in ../testsuite/libgomp-test-support.exp.in, the
 # following variables have to be "routed through" this Makefile, for expansion
@@ -24,4 +23,69 @@ libgomp-test-support.exp: libgomp-test-s
          'set offload_additional_lib_paths "$(offload_additional_lib_paths)"'
        mv $@.tmp $@
 
+check-DEJAGNU: site.exp
+       srcdir='$(srcdir)'; export srcdir; \
+       EXPECT=$(EXPECT); export EXPECT; \
+       if $(SHELL) -c "$(_RUNTEST) --version" > /dev/null 2>&1; then \
+         exit_status=0; l='$(PACKAGE)'; for tool in $$l; do \
+           if $(_RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) 
$(RUNTESTFLAGS); \
+           then :; else exit_status=1; fi; \
+         done; \
+       else echo "WARNING: could not find '$(_RUNTEST)'" 1>&2; :;\
+       fi; \
+       exit $$exit_status
+site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
+       @echo 'Making a new site.exp file ...'
+       @echo '## these variables are automatically generated by make ##' 
>site.tmp
+       @echo '# Do not edit here.  If you wish to override these values' 
>>site.tmp
+       @echo '# edit the last section' >>site.tmp
+       @echo 'set srcdir "$(srcdir)"' >>site.tmp
+       @echo "set objdir `pwd`" >>site.tmp
+       @echo 'set build_alias "$(build_alias)"' >>site.tmp
+       @echo 'set build_triplet $(build_triplet)' >>site.tmp
+       @echo 'set host_alias "$(host_alias)"' >>site.tmp
+       @echo 'set host_triplet $(host_triplet)' >>site.tmp
+       @echo 'set target_alias "$(target_alias)"' >>site.tmp
+       @echo 'set target_triplet $(target_triplet)' >>site.tmp
+       @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
+         echo "## Begin content included from file $$f.  Do not modify. ##" \
+          && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
+          && echo "## End content included from file $$f. ##" \
+          || exit 1; \
+        done >> site.tmp
+       @echo "## End of auto-generated content; you can edit from here. ##" >> 
site.tmp
+       @if test -f site.exp; then \
+          sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> 
site.tmp; \
+        fi
+       @-rm -f site.bak
+       @test ! -f site.exp || mv site.exp site.bak
+       @mv site.tmp site.exp
+
+distclean-DEJAGNU:
+       -rm -f site.exp site.bak
+       -l='$(PACKAGE)'; for tool in $$l; do \
+         rm -f $$tool.sum $$tool.log; \
+       done
+distclean-am: distclean-DEJAGNU
+check-am:
+       @if test -n "$(filter -j%, $(MFLAGS))"; then \
+         if test -z "$$GOMP_SPINCOUNT" && test -z "$$OMP_WAIT_POLICY"; then \
+           GOMP_SPINCOUNT=1000; export GOMP_SPINCOUNT; \
+           echo @@@ libgomp wait policy adjusted to GOMP_SPINCOUNT=1000 
because of parallel make check; \
+         fi; \
+         num_cpus=1; \
+         if type -p getconf 2>/dev/null >/dev/null; then \
+           num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`; \
+           case "$$num_cpus" in \
+             '' | 0* | *[!0-9]*) num_cpus=1;; \
+           esac; \
+         fi; \
+         if test $$num_cpus -gt 8 && test -z "$$OMP_NUM_THREADS"; then \
+           OMP_NUM_THREADS=8; export OMP_NUM_THREADS; \
+           echo @@@ libgomp OMP_NUM_THREADS adjusted to 8 because of parallel 
make check and too many CPUs; \
+         fi; \
+       fi; \
+       $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
 all-local: libgomp-test-support.exp
+
+.PHONY: check-DEJAGNU distclean-DEJAGNU
--- libgomp/testsuite/Makefile.in.jj    2018-11-01 12:06:00.933664590 +0100
+++ libgomp/testsuite/Makefile.in       2018-11-23 13:31:59.213239641 +0100
@@ -130,8 +130,6 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-DEJATOOL = $(PACKAGE)
-RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -293,7 +291,7 @@ toolexeclibdir = @toolexeclibdir@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign dejagnu
+AUTOMAKE_OPTIONS = foreign
 
 # May be used by various substitution variables.
 gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER)
@@ -303,7 +301,7 @@ EXPECT = $(shell if test -f $(top_buildd
 _RUNTEST = $(shell if test -f $(top_srcdir)/../dejagnu/runtest; then \
             echo $(top_srcdir)/../dejagnu/runtest; else echo runtest; fi)
 
-RUNTEST = $(_RUNTEST) $(AM_RUNTESTFLAGS)
+RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
 all: all-am
 
 .SUFFIXES:
@@ -350,52 +348,7 @@ ctags CTAGS:
 
 cscope cscopelist:
 
-
-check-DEJAGNU: site.exp
-       srcdir='$(srcdir)'; export srcdir; \
-       EXPECT=$(EXPECT); export EXPECT; \
-       if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \
-         exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
-           if $(RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) 
$(RUNTESTFLAGS); \
-           then :; else exit_status=1; fi; \
-         done; \
-       else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\
-       fi; \
-       exit $$exit_status
-site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
-       @echo 'Making a new site.exp file ...'
-       @echo '## these variables are automatically generated by make ##' 
>site.tmp
-       @echo '# Do not edit here.  If you wish to override these values' 
>>site.tmp
-       @echo '# edit the last section' >>site.tmp
-       @echo 'set srcdir "$(srcdir)"' >>site.tmp
-       @echo "set objdir `pwd`" >>site.tmp
-       @echo 'set build_alias "$(build_alias)"' >>site.tmp
-       @echo 'set build_triplet $(build_triplet)' >>site.tmp
-       @echo 'set host_alias "$(host_alias)"' >>site.tmp
-       @echo 'set host_triplet $(host_triplet)' >>site.tmp
-       @echo 'set target_alias "$(target_alias)"' >>site.tmp
-       @echo 'set target_triplet $(target_triplet)' >>site.tmp
-       @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
-         echo "## Begin content included from file $$f.  Do not modify. ##" \
-          && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
-          && echo "## End content included from file $$f. ##" \
-          || exit 1; \
-        done >> site.tmp
-       @echo "## End of auto-generated content; you can edit from here. ##" >> 
site.tmp
-       @if test -f site.exp; then \
-          sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> 
site.tmp; \
-        fi
-       @-rm -f site.bak
-       @test ! -f site.exp || mv site.exp site.bak
-       @mv site.tmp site.exp
-
-distclean-DEJAGNU:
-       -rm -f site.exp site.bak
-       -l='$(DEJATOOL)'; for tool in $$l; do \
-         rm -f $$tool.sum $$tool.log; \
-       done
 check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
 check: check-am
 all-am: Makefile all-local
 installdirs:
@@ -435,8 +388,6 @@ clean-am: clean-generic clean-libtool mo
 
 distclean: distclean-am
        -rm -f Makefile
-distclean-am: clean-am distclean-DEJAGNU distclean-generic
-
 dvi: dvi-am
 
 dvi-am:
@@ -495,20 +446,19 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: check-am install-am install-strip
+.MAKE: install-am install-strip
 
-.PHONY: all all-am all-local check check-DEJAGNU check-am clean \
-       clean-generic clean-libtool cscopelist-am ctags-am distclean \
-       distclean-DEJAGNU distclean-generic distclean-libtool dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
-       uninstall-am
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool dvi dvi-am html html-am \
+       info info-am install install-am install-data install-data-am \
+       install-dvi install-dvi-am install-exec install-exec-am \
+       install-html install-html-am install-info install-info-am \
+       install-man install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
@@ -524,8 +474,73 @@ libgomp-test-support.exp: libgomp-test-s
          'set offload_additional_lib_paths "$(offload_additional_lib_paths)"'
        mv $@.tmp $@
 
+check-DEJAGNU: site.exp
+       srcdir='$(srcdir)'; export srcdir; \
+       EXPECT=$(EXPECT); export EXPECT; \
+       if $(SHELL) -c "$(_RUNTEST) --version" > /dev/null 2>&1; then \
+         exit_status=0; l='$(PACKAGE)'; for tool in $$l; do \
+           if $(_RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) 
$(RUNTESTFLAGS); \
+           then :; else exit_status=1; fi; \
+         done; \
+       else echo "WARNING: could not find '$(_RUNTEST)'" 1>&2; :;\
+       fi; \
+       exit $$exit_status
+site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
+       @echo 'Making a new site.exp file ...'
+       @echo '## these variables are automatically generated by make ##' 
>site.tmp
+       @echo '# Do not edit here.  If you wish to override these values' 
>>site.tmp
+       @echo '# edit the last section' >>site.tmp
+       @echo 'set srcdir "$(srcdir)"' >>site.tmp
+       @echo "set objdir `pwd`" >>site.tmp
+       @echo 'set build_alias "$(build_alias)"' >>site.tmp
+       @echo 'set build_triplet $(build_triplet)' >>site.tmp
+       @echo 'set host_alias "$(host_alias)"' >>site.tmp
+       @echo 'set host_triplet $(host_triplet)' >>site.tmp
+       @echo 'set target_alias "$(target_alias)"' >>site.tmp
+       @echo 'set target_triplet $(target_triplet)' >>site.tmp
+       @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
+         echo "## Begin content included from file $$f.  Do not modify. ##" \
+          && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
+          && echo "## End content included from file $$f. ##" \
+          || exit 1; \
+        done >> site.tmp
+       @echo "## End of auto-generated content; you can edit from here. ##" >> 
site.tmp
+       @if test -f site.exp; then \
+          sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> 
site.tmp; \
+        fi
+       @-rm -f site.bak
+       @test ! -f site.exp || mv site.exp site.bak
+       @mv site.tmp site.exp
+
+distclean-DEJAGNU:
+       -rm -f site.exp site.bak
+       -l='$(PACKAGE)'; for tool in $$l; do \
+         rm -f $$tool.sum $$tool.log; \
+       done
+distclean-am: distclean-DEJAGNU
+check-am:
+       @if test -n "$(filter -j%, $(MFLAGS))"; then \
+         if test -z "$$GOMP_SPINCOUNT" && test -z "$$OMP_WAIT_POLICY"; then \
+           GOMP_SPINCOUNT=1000; export GOMP_SPINCOUNT; \
+           echo @@@ libgomp wait policy adjusted to GOMP_SPINCOUNT=1000 
because of parallel make check; \
+         fi; \
+         num_cpus=1; \
+         if type -p getconf 2>/dev/null >/dev/null; then \
+           num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`; \
+           case "$$num_cpus" in \
+             '' | 0* | *[!0-9]*) num_cpus=1;; \
+           esac; \
+         fi; \
+         if test $$num_cpus -gt 8 && test -z "$$OMP_NUM_THREADS"; then \
+           OMP_NUM_THREADS=8; export OMP_NUM_THREADS; \
+           echo @@@ libgomp OMP_NUM_THREADS adjusted to 8 because of parallel 
make check and too many CPUs; \
+         fi; \
+       fi; \
+       $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
 all-local: libgomp-test-support.exp
 
+.PHONY: check-DEJAGNU distclean-DEJAGNU
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:

        Jakub

Reply via email to