Skip to content

Commit

Permalink
Improve makefile parallelism ("make -j8" about 25% faster)
Browse files Browse the repository at this point in the history
  • Loading branch information
feeley committed Jun 11, 2020
1 parent 5bd5237 commit ec8d10d
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 57 deletions.
11 changes: 6 additions & 5 deletions INSTALL.txt
Expand Up @@ -66,10 +66,10 @@ The system can then be tested and installed using the following commands:
% sudo make install

On a computer with multiple cores it is normally beneficial to build
the system in parallel by adding a "-j" option to the invocation
of make:
the system in parallel by adding a "-jN" option to the invocation
of make with a suitable value for N (typically the number of cores):

% make -j
% make -j8


3) Recommended "configure" script options
Expand Down Expand Up @@ -125,8 +125,9 @@ by the compiler evolve and vary in computational complexity. Since
the C files are so large, the compile time is very sensitive to the
computational complexity of the optimization algorithms. See the
table at the end of this file for performance information for
different versions of GCC. On a recent multicore computer a "make -j"
typically takes less than 2 minutes.
different versions of GCC. On a recent 8 core computer a "make" takes
about 140 seconds and a "make -j8" takes about 30 seconds (when
starting from a "release" or a distribution .tgz produced by "make dist").

Finally, in order to support installing multiple versions of Gambit,
it is recommended to use these options:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -20,7 +20,7 @@ Quick-install instructions for a typical installation
git clone https://github.com/gambit/gambit.git
cd gambit
./configure # --enable-single-host optional but recommended
make -j # build runtime library, gsi and gsc
make # build runtime library, gsi and gsc (add -j8 if you can)
make modules # compile the builtin modules (optional but recommended)
make check # run self tests (optional but recommended)
make doc # build the documentation
Expand Down
10 changes: 9 additions & 1 deletion bin/makefile.in
@@ -1,6 +1,6 @@
# makefile for Gambit bin directory.

# Copyright (c) 1994-2019 by Marc Feeley, All Rights Reserved.
# Copyright (c) 1994-2020 by Marc Feeley, All Rights Reserved.

herefromroot = bin
rootfromhere = ..
Expand Down Expand Up @@ -110,6 +110,14 @@ all-pre:

all-post: gambvcs@bat@ gambuild-C@bat@ gambuild-js@bat@ gambuild-python@bat@ gambuild-ruby@bat@ gambuild-php@bat@ gambuild-java@bat@ gambuild-x86@bat@ gambuild-x86-64@bat@ gambuild-arm@bat@ gambuild-riscv-32@bat@ gambuild-riscv-64@bat@ gambdoc@bat@ six@exe@ gsi-script@bat@ gsc-script@bat@ six-script@bat@ scheme-srfi-0@bat@ scheme-r5rs@bat@ scheme-r4rs@bat@ scheme-ieee-1178-1990@bat@

phase1: all

phase2:

phase3:

phase4:

gambvcs@bat@: makefile gambvcs.unix gambvcs.bat.windows
rm -f gambvcs@bat@
if test "@bat@" = ""; then \
Expand Down
59 changes: 42 additions & 17 deletions gsc/makefile.in
@@ -1,6 +1,6 @@
# makefile for Gambit compiler.

# Copyright (c) 1994-2019 by Marc Feeley, All Rights Reserved.
# Copyright (c) 1994-2020 by Marc Feeley, All Rights Reserved.

herefromroot = gsc
rootfromhere = ..
Expand Down Expand Up @@ -71,6 +71,12 @@ mandir = @mandir@
.SUFFIXES:
.SUFFIXES: .scm .c @obj@

GAMBIT_GSC_LIB_C = _$(GAMBITGSCLIB).c
GAMBIT_GSC_LIB_O = _$(GAMBITGSCLIB)@obj@

LINKFILE_C = _gsc_.c
LINKFILE_O = _gsc_@obj@

HEADERS_SCM = "_assert\#.scm" "_asm\#.scm" "_x86\#.scm" "_arm\#.scm" "_riscv\#.scm" "_codegen\#.scm"

LIBRARIES_SCM = $(HEADERS_SCM)
Expand Down Expand Up @@ -153,14 +159,23 @@ _source@obj@ _t-cpu-primitives@obj@ _riscv@obj@ _utils@obj@ \
_asm@obj@ _gsclib@obj@ _parms@obj@ _t-c-3@obj@ _codegen@obj@ \
_back@obj@ _env@obj@ _host@obj@ _t-cpu-object-desc@obj@ _t-cpu@obj@ \
_t-cpu-utils@obj@ _assert@obj@
LIBRARY_MODULES_C_IN_COMPILE_ORDER = _t-univ-2.c _t-univ-3.c \
_t-univ-1.c _prims.c _t-univ-4.c _t-c-2.c _front.c \
_ptree1.c _ptree2.c _gvm.c _t-c-1.c _x86.c \
_t-cpu-abstract-machine.c _t-cpu-backend-x86.c \
_t-cpu-backend-arm.c _t-cpu-backend-riscv.c _arm.c \
_source.c _t-cpu-primitives.c _riscv.c _utils.c \
_asm.c _gsclib.c _parms.c _t-c-3.c _codegen.c \
_back.c _env.c _host.c _t-cpu-object-desc.c _t-cpu.c \
_t-cpu-utils.c _assert.c
LIBRARY_OBJECTS = $(LIBRARY_NORMAL_O) \
$(LIBRARY_MODULES_O) _$(GAMBITGSCLIB)@obj@
$(LIBRARY_MODULES_O) $(GAMBIT_GSC_LIB_O)
LIBRARY_OBJECTS_PLUS = $(LIBRARY_NORMAL_O_PLUS) \
$(LIBRARY_MODULES_O_PLUS) +_$(GAMBITGSCLIB)@obj@
$(LIBRARY_MODULES_O_PLUS) +$(GAMBIT_GSC_LIB_O)
LIBRARY_OBJECTS_COMMA = $(LIBRARY_NORMAL_O_COMMA),\
$(LIBRARY_MODULES_O_COMMA),_$(GAMBITGSCLIB)@obj@
$(LIBRARY_MODULES_O_COMMA),$(GAMBIT_GSC_LIB_O)
LIBRARY_OBJECTS_IN_COMPILE_ORDER = $(LIBRARY_MODULES_O_IN_COMPILE_ORDER) \
$(LIBRARY_NORMAL_O_IN_COMPILE_ORDER) _$(GAMBITGSCLIB)@obj@
$(LIBRARY_NORMAL_O_IN_COMPILE_ORDER) $(GAMBIT_GSC_LIB_O)

LIBRARIES = $(LIBRARY)$(LIB_VERSION_SUFFIX)

Expand All @@ -185,13 +200,13 @@ EXECUTABLE_MODULES_O_PLUS = +_gsc@obj@
EXECUTABLE_MODULES_O_COMMA = _gsc@obj@
EXECUTABLE_MODULES_O_IN_COMPILE_ORDER = _gsc@obj@
EXECUTABLE_OBJECTS = $(EXECUTABLE_NORMAL_O) \
$(EXECUTABLE_MODULES_O) _gsc_@obj@
$(EXECUTABLE_MODULES_O) $(LINKFILE_O)
EXECUTABLE_OBJECTS_PLUS = $(EXECUTABLE_NORMAL_O_PLUS) \
$(EXECUTABLE_MODULES_O_PLUS) +_gsc_@obj@
$(EXECUTABLE_MODULES_O_PLUS) +$(LINKFILE_O)
EXECUTABLE_OBJECTS_COMMA = $(EXECUTABLE_NORMAL_O_COMMA),\
$(EXECUTABLE_MODULES_O_COMMA),_gsc_@obj@
$(EXECUTABLE_MODULES_O_COMMA),$(LINKFILE_O)
EXECUTABLE_OBJECTS_IN_COMPILE_ORDER = $(EXECUTABLE_MODULES_O_IN_COMPILE_ORDER) \
$(EXECUTABLE_NORMAL_O_IN_COMPILE_ORDER) _gsc_@obj@
$(EXECUTABLE_NORMAL_O_IN_COMPILE_ORDER) $(LINKFILE_O)

LINK_LIBS = $(LIBRARY) $(rootfromhere)/lib/$(LIB_PREFIX)$(GAMBITLIB)$(LIB_EXTENSION)
LINK_FOR_INSTALL_LIBS = @LINK_FOR_INSTALL_GSC_LIBS@
Expand All @@ -204,11 +219,11 @@ RCFILES = makefile.in fixnum.scm generic.scm igsc.scm $(MODULES_SCM) \
$(LIBRARIES_SCM) _envadt.scm _gvmadt.scm _ptreeadt.scm _sourceadt.scm \
_univadt.scm _cpuadt.scm runtests.scm _t-x86.scm _gscdebug.scm

GENDISTFILES = $(MODULES_C) _$(GAMBITGSCLIB).c _gsc_.c
GENDISTFILES = $(MODULES_C) $(GAMBIT_GSC_LIB_C) $(LINKFILE_C)

DISTFILES = $(RCFILES) $(GENDISTFILES)

INSTFILES_LIB_DATA = _$(GAMBITGSCLIB).c $(LIBRARIES_SCM)
INSTFILES_LIB_DATA = $(GAMBIT_GSC_LIB_C) $(LIBRARIES_SCM)

GAMBITDIR_INCLUDE = $(srcdirpfx)$(rootfromhere)/include
GAMBITDIR_LIB = $(srcdirpfx)$(rootfromhere)/lib
Expand Down Expand Up @@ -238,6 +253,8 @@ BUILD_EXE_INPUT_FILENAMES_PARAM = $(EXECUTABLE_OBJECTS)
BUILD_EXE_LD_OPTIONS_PARAM = $(LIBRARY)

PRELUDE_OPT = -prelude "(\#\#namespace(\"c\#\"))(\#\#include\"$(srcdirpfx)../lib/header.scm\")"
### TODO: replace with this after bootstrap:
#PRELUDE_OPT = -prelude "@RTLIB_COND_EXPAND_FEATURES@(\#\#namespace(\"c\#\"))(\#\#include\"$(srcdirpfx)../lib/header.scm\")"

all:

Expand All @@ -246,27 +263,35 @@ all-pre: $(LIBRARY) $(EXECUTABLE)
all-post:
$(MAKE) deselect-gen-for-commit-post-nonrec

phase1: $(LIBRARY_MODULES_C_IN_COMPILE_ORDER) $(EXECUTABLE_MODULES_C)

phase2: $(LINKFILE_C)

phase3: $(LIBRARY)

phase4: all

$(LIBRARY): $(LIBRARY_OBJECTS_IN_COMPILE_ORDER)
rm -f $(LIBRARY)$(LIB_VERSION_SUFFIX) $(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX) $(LIBRARY)
rm -f "$(LIBRARY)$(LIB_VERSION_SUFFIX)" "$(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX)" "$(LIBRARY)"
@MAKE_LIBRARY@
if test "$(LIB_VERSION_SUFFIX)" != ""; then \
$(LN_S) "$(LIBRARY)$(LIB_VERSION_SUFFIX)" "$(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX)"; \
$(LN_S) "$(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX)" "$(LIBRARY)"; \
fi

_$(GAMBITGSCLIB).c: $(LIBRARY_MODULES_C) $(rootfromhere)/lib/_gambit.c
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l $(srcdirpfx)$(rootfromhere)/lib/_gambit -o $@ -preload $(LIBRARY_MODULES_C)
$(GAMBIT_GSC_LIB_C): $(LIBRARY_MODULES_C_IN_COMPILE_ORDER) $(rootfromhere)/lib/_$(GAMBITLIB).c
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l $(srcdirpfx)$(rootfromhere)/lib/_$(GAMBITLIB) -o $@ -preload $(LIBRARY_MODULES_C)

$(EXECUTABLE): $(EXECUTABLE_OBJECTS_IN_COMPILE_ORDER) $(LINK_LIBS)
@BUILD_EXE@

_gsc_.c: $(EXECUTABLE_MODULES_C) _$(GAMBITGSCLIB).c
$(LINKFILE_C): $(EXECUTABLE_MODULES_C) $(GAMBIT_GSC_LIB_C)
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l _$(GAMBITGSCLIB) -o $@ -preload $(EXECUTABLE_MODULES_C)

_gsc@obj@: _gsc.c
$(LINKFILE_O): $(LINKFILE_C)
@BUILD_OBJ@

_gsc_@obj@: _gsc_.c
_gsc@obj@: _gsc.c
@BUILD_OBJ@

.c@obj@:
Expand Down
55 changes: 37 additions & 18 deletions gsi/makefile.in
@@ -1,6 +1,6 @@
# makefile for Gambit interpreter.

# Copyright (c) 1994-2019 by Marc Feeley, All Rights Reserved.
# Copyright (c) 1994-2020 by Marc Feeley, All Rights Reserved.

herefromroot = gsi
rootfromhere = ..
Expand Down Expand Up @@ -71,7 +71,15 @@ mandir = @mandir@
.SUFFIXES:
.SUFFIXES: .scm .c @obj@

LIBRARIES_SCM =
GAMBIT_GSI_LIB_C = _$(GAMBITGSILIB).c
GAMBIT_GSI_LIB_O = _$(GAMBITGSILIB)@obj@

LINKFILE_C = _gsi_.c
LINKFILE_O = _gsi_@obj@

HEADERS_SCM =

LIBRARIES_SCM = $(HEADERS_SCM)

LIBRARY = $(LIB_PREFIX)$(GAMBITGSILIB)$(LIB_EXTENSION)
LIBRARY_NORMAL_C =
Expand All @@ -89,14 +97,15 @@ LIBRARY_MODULES_O = _gsilib@obj@
LIBRARY_MODULES_O_PLUS = +_gsilib@obj@
LIBRARY_MODULES_O_COMMA = _gsilib@obj@
LIBRARY_MODULES_O_IN_COMPILE_ORDER = _gsilib@obj@
LIBRARY_MODULES_C_IN_COMPILE_ORDER = _gsilib.c
LIBRARY_OBJECTS = $(LIBRARY_NORMAL_O) \
$(LIBRARY_MODULES_O) _$(GAMBITGSILIB)@obj@
$(LIBRARY_MODULES_O) $(GAMBIT_GSI_LIB_O)
LIBRARY_OBJECTS_PLUS = $(LIBRARY_NORMAL_O_PLUS) \
$(LIBRARY_MODULES_O_PLUS) +_$(GAMBITGSILIB)@obj@
$(LIBRARY_MODULES_O_PLUS) +$(GAMBIT_GSI_LIB_O)
LIBRARY_OBJECTS_COMMA = $(LIBRARY_NORMAL_O_COMMA),\
$(LIBRARY_MODULES_O_COMMA),_$(GAMBITGSILIB)@obj@
$(LIBRARY_MODULES_O_COMMA),$(GAMBIT_GSI_LIB_O)
LIBRARY_OBJECTS_IN_COMPILE_ORDER = $(LIBRARY_MODULES_O_IN_COMPILE_ORDER) \
$(LIBRARY_NORMAL_O_IN_COMPILE_ORDER) _$(GAMBITGSILIB)@obj@
$(LIBRARY_NORMAL_O_IN_COMPILE_ORDER) $(GAMBIT_GSI_LIB_O)

LIBRARIES = $(LIBRARY)$(LIB_VERSION_SUFFIX)

Expand All @@ -121,13 +130,13 @@ EXECUTABLE_MODULES_O_PLUS = +_gsi@obj@
EXECUTABLE_MODULES_O_COMMA = _gsi@obj@
EXECUTABLE_MODULES_O_IN_COMPILE_ORDER = _gsi@obj@
EXECUTABLE_OBJECTS = $(EXECUTABLE_NORMAL_O) \
$(EXECUTABLE_MODULES_O) _gsi_@obj@
$(EXECUTABLE_MODULES_O) $(LINKFILE_O)
EXECUTABLE_OBJECTS_PLUS = $(EXECUTABLE_NORMAL_O_PLUS) \
$(EXECUTABLE_MODULES_O_PLUS) +_gsi_@obj@
$(EXECUTABLE_MODULES_O_PLUS) +$(LINKFILE_O)
EXECUTABLE_OBJECTS_COMMA = $(EXECUTABLE_NORMAL_O_COMMA),\
$(EXECUTABLE_MODULES_O_COMMA),_gsi_@obj@
$(EXECUTABLE_MODULES_O_COMMA),$(LINKFILE_O)
EXECUTABLE_OBJECTS_IN_COMPILE_ORDER = $(EXECUTABLE_MODULES_O_IN_COMPILE_ORDER) \
$(EXECUTABLE_NORMAL_O_IN_COMPILE_ORDER) _gsi_@obj@
$(EXECUTABLE_NORMAL_O_IN_COMPILE_ORDER) $(LINKFILE_O)

LINK_LIBS = $(LIBRARY) $(rootfromhere)/lib/$(LIB_PREFIX)$(GAMBITLIB)$(LIB_EXTENSION)
LINK_FOR_INSTALL_LIBS = @LINK_FOR_INSTALL_GSI_LIBS@
Expand All @@ -138,11 +147,11 @@ OBJECTS = $(LIBRARY_OBJECTS) $(EXECUTABLE_OBJECTS)

RCFILES = makefile.in main.scm $(MODULES_SCM)

GENDISTFILES = $(MODULES_C) _$(GAMBITGSILIB).c _gsi_.c
GENDISTFILES = $(MODULES_C) $(GAMBIT_GSI_LIB_C) $(LINKFILE_C)

DISTFILES = $(RCFILES) $(GENDISTFILES)

INSTFILES_LIB_DATA = _$(GAMBITGSILIB).c $(LIBRARIES_SCM)
INSTFILES_LIB_DATA = $(GAMBIT_GSI_LIB_C) $(LIBRARIES_SCM)

GAMBITDIR_INCLUDE = $(srcdirpfx)$(rootfromhere)/include
GAMBITDIR_LIB = $(srcdirpfx)$(rootfromhere)/lib
Expand All @@ -168,6 +177,14 @@ all-pre: $(LIBRARY) $(EXECUTABLE)
all-post:
$(MAKE) deselect-gen-for-commit-post-nonrec

phase1: $(LIBRARY_MODULES_C_IN_COMPILE_ORDER) $(EXECUTABLE_MODULES_C)

phase2: $(LINKFILE_C)

phase3: $(LIBRARY)

phase4: all

$(LIBRARY): $(LIBRARY_OBJECTS_IN_COMPILE_ORDER)
rm -f "$(LIBRARY)$(LIB_VERSION_SUFFIX)" "$(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX)" "$(LIBRARY)"
@MAKE_LIBRARY@
Expand All @@ -176,19 +193,19 @@ $(LIBRARY): $(LIBRARY_OBJECTS_IN_COMPILE_ORDER)
$(LN_S) "$(LIBRARY)$(LIB_MAJOR_VERSION_SUFFIX)" "$(LIBRARY)"; \
fi

_$(GAMBITGSILIB).c: $(LIBRARY_MODULES_C) $(rootfromhere)/lib/_gambit.c
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l $(srcdirpfx)$(rootfromhere)/lib/_gambit -o $@ -preload $(LIBRARY_MODULES_C)
$(GAMBIT_GSI_LIB_C): $(LIBRARY_MODULES_C_IN_COMPILE_ORDER) $(rootfromhere)/lib/_$(GAMBITLIB).c
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l $(srcdirpfx)$(rootfromhere)/lib/_$(GAMBITLIB) -o $@ -preload $(LIBRARY_MODULES_C)

$(EXECUTABLE): $(EXECUTABLE_OBJECTS_IN_COMPILE_ORDER) $(LINK_LIBS)
@BUILD_EXE@

_gsi_.c: $(EXECUTABLE_MODULES_C) _$(GAMBITGSILIB).c
$(LINKFILE_C): $(EXECUTABLE_MODULES_C) $(GAMBIT_GSI_LIB_C)
@SETDLPATHBOOT@ $(rootfromhere)/gsc-boot -:~~bin=$(srcdirpfx)$(rootfromhere)/bin,~~lib=$(srcdirpfx)$(rootfromhere)/lib,~~include=$(srcdirpfx)$(rootfromhere)/include -f @COMPILATION_OPTIONS@ $(PRELUDE_OPT) -warnings -link -l _$(GAMBITGSILIB) -o $@ -preload $(EXECUTABLE_MODULES_C)

_gsi@obj@: _gsi.c
@BUILD_OBJ@

_gsi_@obj@: _gsi_.c
$(LINKFILE_O): $(LINKFILE_C)
@BUILD_OBJ@

.c@obj@:
Expand Down Expand Up @@ -254,8 +271,10 @@ install-post: all
t_bindir="$$c_bindir"; \
t_libdir="$$c_libdir"; \
fi; \
$(INSTALL_DATA) "$(srcdirpfx)_$(GAMBITGSILIB).c" "$$t_libdir/_$(GAMBITGSILIB).c"; \
@MAKE_LIBRARY_FOR_INSTALL@; \
for file in $(INSTFILES_LIB_DATA); do \
$(INSTALL_DATA) "$$file" "$$t_libdir/$$file"; \
done; \
for file in $(LIBRARIES); do \
$(INSTALL_LIB) "$$file" "$$t_libdir/$$file"; \
@FIXLIB@ "$$t_libdir/$$file"; \
Expand All @@ -267,7 +286,7 @@ install-post: all
$(INSTALL_PROGRAM) "$(EXECUTABLE)" "$$t_bindir/$(EXECUTABLE_INSTALLED)"; \
if test "$$t_libdir" != "$$i_libdir"; then \
r_libdir=`$(rootfromhere)/relpath "$$t_libdir" "$$i_libdir" @ENABLE_MULTIPLE_VERSIONS@`; \
for file in _$(GAMBITGSILIB).c $(LIBRARY)$(LIB_VERSION_SUFFIX); do \
for file in $(INSTFILES_LIB_DATA) $(LIBRARIES); do \
(cd "$$i_libdir" && $(LN_S) "$$r_libdir$$file" "$$file"); \
done; \
fi; \
Expand Down
8 changes: 8 additions & 0 deletions include/makefile.in
Expand Up @@ -92,6 +92,14 @@ all-pre:

all-post: gambit.h

phase1: all

phase2:

phase3:

phase4:

bootstrap-pre:

bootstrap-post:
Expand Down

0 comments on commit ec8d10d

Please sign in to comment.