Parallelize Link Time Optimization for GCC, CLANG and MINGW
authorGuy Vreuls <guyvreuls@gmail.com>
Sat, 8 Aug 2020 10:45:10 +0000 (12:45 +0200)
committerJoost VandeVondele <Joost.VandeVondele@gmail.com>
Sat, 8 Aug 2020 20:35:18 +0000 (22:35 +0200)
This patch tries to run multiple LTO threads in parallel, speeding up
the build process of optimized builds if the -j make parameter is used.
This mitigates the longer linking times of optimized builds since the
integration of the NNUE code. Roughly 2x build speedup.

I've tried a similar patch some two years ago but it ran into trouble
with old compiler versions then. Since we're on the C++17 standard now
these old compilers should be obsolete.

closes https://github.com/official-stockfish/Stockfish/pull/2943

No functional change.

src/Makefile

index 4741e722bfdd125d5fbdd260d31558767703577f..cab7a7e50629021f17a68a4458aee45c74989bc7 100644 (file)
@@ -282,6 +282,9 @@ ifeq ($(COMP),gcc)
        ifneq ($(KERNEL),Darwin)
           LDFLAGS += -Wl,--no-as-needed
        endif
        ifneq ($(KERNEL),Darwin)
           LDFLAGS += -Wl,--no-as-needed
        endif
+       
+       gccversion = $(shell $(CXX) --version)
+       gccisclang = $(findstring clang,$(gccversion))
 endif
 
 ifeq ($(COMP),mingw)
 endif
 
 ifeq ($(COMP),mingw)
@@ -496,18 +499,28 @@ endif
 ### needs access to the optimization flags.
 ifeq ($(optimize),yes)
 ifeq ($(debug), no)
 ### needs access to the optimization flags.
 ifeq ($(optimize),yes)
 ifeq ($(debug), no)
-       ifeq ($(comp),$(filter $(comp),gcc clang))
+       ifeq ($(comp),clang)
+               CXXFLAGS += -flto=thin
+               LDFLAGS += $(CXXFLAGS)
+
+# GCC and CLANG use different methods for parallelizing LTO and CLANG pretends to be
+# GCC on some systems.
+       else ifeq ($(comp),gcc)
+       ifeq ($(gccisclang),)
                CXXFLAGS += -flto
                CXXFLAGS += -flto
+               LDFLAGS += $(CXXFLAGS) -flto=jobserver
+       else
+               CXXFLAGS += -flto=thin
                LDFLAGS += $(CXXFLAGS)
        endif
 
 # To use LTO and static linking on windows, the tool chain requires a recent gcc:
 # gcc version 10.1 in msys2 or TDM-GCC version 9.2 are know to work, older might not.
 # So, only enable it for a cross from Linux by default.
                LDFLAGS += $(CXXFLAGS)
        endif
 
 # To use LTO and static linking on windows, the tool chain requires a recent gcc:
 # gcc version 10.1 in msys2 or TDM-GCC version 9.2 are know to work, older might not.
 # So, only enable it for a cross from Linux by default.
-       ifeq ($(comp),mingw)
+       else ifeq ($(comp),mingw)
        ifeq ($(KERNEL),Linux)
                CXXFLAGS += -flto
        ifeq ($(KERNEL),Linux)
                CXXFLAGS += -flto
-               LDFLAGS += $(CXXFLAGS)
+               LDFLAGS += $(CXXFLAGS) -flto=jobserver
        endif
        endif
 endif
        endif
        endif
 endif
@@ -693,7 +706,7 @@ config-sanity:
        @test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
 
 $(EXE): $(OBJS)
        @test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
 
 $(EXE): $(OBJS)
-       $(CXX) -o $@ $(OBJS) $(LDFLAGS)
+       +$(CXX) -o $@ $(OBJS) $(LDFLAGS)
 
 clang-profile-make:
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
 
 clang-profile-make:
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \