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