mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-24 19:16:49 +08:00
This patch ports the efficiently updatable neural network (NNUE) evaluation to Stockfish. Both the NNUE and the classical evaluations are available, and can be used to assign a value to a position that is later used in alpha-beta (PVS) search to find the best move. The classical evaluation computes this value as a function of various chess concepts, handcrafted by experts, tested and tuned using fishtest. The NNUE evaluation computes this value with a neural network based on basic inputs. The network is optimized and trained on the evalutions of millions of positions at moderate search depth. The NNUE evaluation was first introduced in shogi, and ported to Stockfish afterward. It can be evaluated efficiently on CPUs, and exploits the fact that only parts of the neural network need to be updated after a typical chess move. [The nodchip repository](https://github.com/nodchip/Stockfish) provides additional tools to train and develop the NNUE networks. This patch is the result of contributions of various authors, from various communities, including: nodchip, ynasu87, yaneurao (initial port and NNUE authors), domschl, FireFather, rqs, xXH4CKST3RXx, tttak, zz4032, joergoster, mstembera, nguyenpham, erbsenzaehler, dorzechowski, and vondele. This new evaluation needed various changes to fishtest and the corresponding infrastructure, for which tomtor, ppigazzini, noobpwnftw, daylen, and vondele are gratefully acknowledged. The first networks have been provided by gekkehenker and sergiovieri, with the latter net (nn-97f742aaefcd.nnue) being the current default. The evaluation function can be selected at run time with the `Use NNUE` (true/false) UCI option, provided the `EvalFile` option points the the network file (depending on the GUI, with full path). The performance of the NNUE evaluation relative to the classical evaluation depends somewhat on the hardware, and is expected to improve quickly, but is currently on > 80 Elo on fishtest: 60000 @ 10+0.1 th 1 https://tests.stockfishchess.org/tests/view/5f28fe6ea5abc164f05e4c4c ELO: 92.77 +-2.1 (95%) LOS: 100.0% Total: 60000 W: 24193 L: 8543 D: 27264 Ptnml(0-2): 609, 3850, 9708, 10948, 4885 40000 @ 20+0.2 th 8 https://tests.stockfishchess.org/tests/view/5f290229a5abc164f05e4c58 ELO: 89.47 +-2.0 (95%) LOS: 100.0% Total: 40000 W: 12756 L: 2677 D: 24567 Ptnml(0-2): 74, 1583, 8550, 7776, 2017 At the same time, the impact on the classical evaluation remains minimal, causing no significant regression: sprt @ 10+0.1 th 1 https://tests.stockfishchess.org/tests/view/5f2906a2a5abc164f05e4c5b LLR: 2.94 (-2.94,2.94) {-6.00,-4.00} Total: 34936 W: 6502 L: 6825 D: 21609 Ptnml(0-2): 571, 4082, 8434, 3861, 520 sprt @ 60+0.6 th 1 https://tests.stockfishchess.org/tests/view/5f2906cfa5abc164f05e4c5d LLR: 2.93 (-2.94,2.94) {-6.00,-4.00} Total: 10088 W: 1232 L: 1265 D: 7591 Ptnml(0-2): 49, 914, 3170, 843, 68 The needed networks can be found at https://tests.stockfishchess.org/nns It is recommended to use the default one as indicated by the `EvalFile` UCI option. Guidelines for testing new nets can be found at https://github.com/glinscott/fishtest/wiki/Creating-my-first-test#nnue-net-tests Integration has been discussed in various issues: https://github.com/official-stockfish/Stockfish/issues/2823 https://github.com/official-stockfish/Stockfish/issues/2728 The integration branch will be closed after the merge: https://github.com/official-stockfish/Stockfish/pull/2825 https://github.com/official-stockfish/Stockfish/tree/nnue-player-wip closes https://github.com/official-stockfish/Stockfish/pull/2912 This will be an exciting time for computer chess, looking forward to seeing the evolution of this approach. Bench: 4746616
738 lines
19 KiB
Makefile
738 lines
19 KiB
Makefile
# Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
# Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
|
# Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
|
|
# Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
|
|
#
|
|
# Stockfish is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Stockfish is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
### ==========================================================================
|
|
### Section 1. General Configuration
|
|
### ==========================================================================
|
|
|
|
### Executable name
|
|
ifeq ($(COMP),mingw)
|
|
EXE = stockfish.exe
|
|
else
|
|
EXE = stockfish
|
|
endif
|
|
|
|
### Installation dir definitions
|
|
PREFIX = /usr/local
|
|
BINDIR = $(PREFIX)/bin
|
|
|
|
### Built-in benchmark for pgo-builds
|
|
PGOBENCH = ./$(EXE) bench
|
|
|
|
### Source and object files
|
|
SRCS = benchmark.cpp bitbase.cpp bitboard.cpp endgame.cpp evaluate.cpp main.cpp \
|
|
material.cpp misc.cpp movegen.cpp movepick.cpp pawns.cpp position.cpp psqt.cpp \
|
|
search.cpp thread.cpp timeman.cpp tt.cpp uci.cpp ucioption.cpp tune.cpp syzygy/tbprobe.cpp \
|
|
nnue/evaluate_nnue.cpp nnue/features/half_kp.cpp
|
|
|
|
OBJS = $(notdir $(SRCS:.cpp=.o))
|
|
|
|
VPATH = syzygy:nnue:nnue/features
|
|
|
|
### Establish the operating system name
|
|
KERNEL = $(shell uname -s)
|
|
ifeq ($(KERNEL),Linux)
|
|
OS = $(shell uname -o)
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 2. High-level Configuration
|
|
### ==========================================================================
|
|
#
|
|
# flag --- Comp switch --- Description
|
|
# ----------------------------------------------------------------------------
|
|
#
|
|
# debug = yes/no --- -DNDEBUG --- Enable/Disable debug mode
|
|
# sanitize = undefined/thread/no (-fsanitize )
|
|
# --- ( undefined ) --- enable undefined behavior checks
|
|
# --- ( thread ) --- enable threading error checks
|
|
# optimize = yes/no --- (-O3/-fast etc.) --- Enable/Disable optimizations
|
|
# arch = (name) --- (-arch) --- Target architecture
|
|
# bits = 64/32 --- -DIS_64BIT --- 64-/32-bit operating system
|
|
# prefetch = yes/no --- -DUSE_PREFETCH --- Use prefetch asm-instruction
|
|
# popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt asm-instruction
|
|
# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions
|
|
# sse3 = yes/no --- -msse3 --- Use Intel Streaming SIMD Extensions 3
|
|
# ssse3 = yes/no --- -mssse3 --- Use Intel Supplemental Streaming SIMD Extensions 3
|
|
# sse41 = yes/no --- -msse4.1 --- Use Intel Streaming SIMD Extensions 4.1
|
|
# sse42 = yes/no --- -msse4.2 --- Use Intel Streaming SIMD Extensions 4.2
|
|
# avx2 = yes/no --- -mavx2 --- Use Intel Advanced Vector Extensions 2
|
|
# pext = yes/no --- -DUSE_PEXT --- Use pext x86_64 asm-instruction
|
|
# avx512 = yes/no --- -mavx512bw --- Use Intel Advanced Vector Extensions 512
|
|
# neon = yes/no --- -DUSE_NEON --- Use ARM SIMD architecture
|
|
#
|
|
# Note that Makefile is space sensitive, so when adding new architectures
|
|
# or modifying existing flags, you have to make sure there are no extra spaces
|
|
# at the end of the line for flag values.
|
|
|
|
### 2.1. General and architecture defaults
|
|
optimize = yes
|
|
debug = no
|
|
sanitize = no
|
|
bits = 64
|
|
prefetch = no
|
|
popcnt = no
|
|
sse = no
|
|
sse3 = no
|
|
ssse3 = no
|
|
sse41 = no
|
|
sse42 = no
|
|
avx2 = no
|
|
pext = no
|
|
avx512 = no
|
|
neon = no
|
|
ARCH = x86-64-modern
|
|
|
|
### 2.2 Architecture specific
|
|
ifeq ($(ARCH),general-32)
|
|
arch = any
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-32-old)
|
|
arch = i386
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-32)
|
|
arch = i386
|
|
bits = 32
|
|
prefetch = yes
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),general-64)
|
|
arch = any
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-sse3)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-sse3-popcnt)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
popcnt = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-ssse3)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-sse41)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-modern)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-sse42)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
sse42 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-avx2)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
sse42 = yes
|
|
avx2 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-bmi2)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
sse42 = yes
|
|
avx2 = yes
|
|
pext = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-avx512)
|
|
arch = x86_64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
sse3 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
sse42 = yes
|
|
avx2 = yes
|
|
pext = yes
|
|
avx512 = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),armv7)
|
|
arch = armv7
|
|
prefetch = yes
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),armv8)
|
|
arch = armv8-a
|
|
prefetch = yes
|
|
popcnt = yes
|
|
neon = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),apple-silicon)
|
|
arch = arm64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
neon = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc-32)
|
|
arch = ppc
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc-64)
|
|
arch = ppc64
|
|
popcnt = yes
|
|
prefetch = yes
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 3. Low-level Configuration
|
|
### ==========================================================================
|
|
|
|
### 3.1 Selecting compiler (default = gcc)
|
|
CXXFLAGS += -Wall -Wcast-qual -fno-exceptions -std=c++17 $(EXTRACXXFLAGS)
|
|
DEPENDFLAGS += -std=c++17
|
|
LDFLAGS += $(EXTRALDFLAGS)
|
|
|
|
ifeq ($(COMP),)
|
|
COMP=gcc
|
|
endif
|
|
|
|
ifeq ($(COMP),gcc)
|
|
comp=gcc
|
|
CXX=g++
|
|
CXXFLAGS += -pedantic -Wextra -Wshadow
|
|
|
|
ifeq ($(ARCH),$(filter $(ARCH),armv7 armv8))
|
|
ifeq ($(OS),Android)
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
else
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
|
|
ifneq ($(KERNEL),Darwin)
|
|
LDFLAGS += -Wl,--no-as-needed
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(COMP),mingw)
|
|
comp=mingw
|
|
|
|
ifeq ($(KERNEL),Linux)
|
|
ifeq ($(bits),64)
|
|
ifeq ($(shell which x86_64-w64-mingw32-c++-posix),)
|
|
CXX=x86_64-w64-mingw32-c++
|
|
else
|
|
CXX=x86_64-w64-mingw32-c++-posix
|
|
endif
|
|
else
|
|
ifeq ($(shell which i686-w64-mingw32-c++-posix),)
|
|
CXX=i686-w64-mingw32-c++
|
|
else
|
|
CXX=i686-w64-mingw32-c++-posix
|
|
endif
|
|
endif
|
|
else
|
|
CXX=g++
|
|
endif
|
|
|
|
CXXFLAGS += -Wextra -Wshadow
|
|
LDFLAGS += -static
|
|
endif
|
|
|
|
ifeq ($(COMP),icc)
|
|
comp=icc
|
|
CXX=icpc
|
|
CXXFLAGS += -diag-disable 1476,10120 -Wcheck -Wabi -Wdeprecated -strict-ansi
|
|
endif
|
|
|
|
ifeq ($(COMP),clang)
|
|
comp=clang
|
|
CXX=clang++
|
|
CXXFLAGS += -pedantic -Wextra -Wshadow
|
|
|
|
ifneq ($(KERNEL),Darwin)
|
|
ifneq ($(KERNEL),OpenBSD)
|
|
LDFLAGS += -latomic
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),$(filter $(ARCH),armv7 armv8))
|
|
ifeq ($(OS),Android)
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
else
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),icc)
|
|
profile_make = icc-profile-make
|
|
profile_use = icc-profile-use
|
|
else
|
|
ifeq ($(comp),clang)
|
|
profile_make = clang-profile-make
|
|
profile_use = clang-profile-use
|
|
else
|
|
profile_make = gcc-profile-make
|
|
profile_use = gcc-profile-use
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(KERNEL),Darwin)
|
|
CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.15
|
|
LDFLAGS += -arch $(arch) -mmacosx-version-min=10.15
|
|
endif
|
|
|
|
### Travis CI script uses COMPILER to overwrite CXX
|
|
ifdef COMPILER
|
|
COMPCXX=$(COMPILER)
|
|
endif
|
|
|
|
### Allow overwriting CXX from command line
|
|
ifdef COMPCXX
|
|
CXX=$(COMPCXX)
|
|
endif
|
|
|
|
### On mingw use Windows threads, otherwise POSIX
|
|
ifneq ($(comp),mingw)
|
|
# On Android Bionic's C library comes with its own pthread implementation bundled in
|
|
ifneq ($(OS),Android)
|
|
# Haiku has pthreads in its libroot, so only link it in on other platforms
|
|
ifneq ($(KERNEL),Haiku)
|
|
LDFLAGS += -lpthread
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.2.1 Debugging
|
|
ifeq ($(debug),no)
|
|
CXXFLAGS += -DNDEBUG
|
|
else
|
|
CXXFLAGS += -g
|
|
endif
|
|
|
|
### 3.2.2 Debugging with undefined behavior sanitizers
|
|
ifneq ($(sanitize),no)
|
|
CXXFLAGS += -g3 -fsanitize=$(sanitize)
|
|
LDFLAGS += -fsanitize=$(sanitize)
|
|
endif
|
|
|
|
### 3.3 Optimization
|
|
ifeq ($(optimize),yes)
|
|
|
|
CXXFLAGS += -O3
|
|
|
|
ifeq ($(comp),gcc)
|
|
ifeq ($(OS), Android)
|
|
CXXFLAGS += -fno-gcse -mthumb -march=armv7-a -mfloat-abi=softfp
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),$(filter $(comp),gcc clang icc))
|
|
ifeq ($(KERNEL),Darwin)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.4 Bits
|
|
ifeq ($(bits),64)
|
|
CXXFLAGS += -DIS_64BIT
|
|
endif
|
|
|
|
### 3.5 prefetch
|
|
ifeq ($(prefetch),yes)
|
|
ifeq ($(sse),yes)
|
|
CXXFLAGS += -msse
|
|
DEPENDFLAGS += -msse
|
|
endif
|
|
else
|
|
CXXFLAGS += -DNO_PREFETCH
|
|
endif
|
|
|
|
### 3.6 popcnt
|
|
ifeq ($(popcnt),yes)
|
|
ifeq ($(arch),$(filter $(arch),ppc64 armv8-a arm64))
|
|
CXXFLAGS += -DUSE_POPCNT
|
|
else ifeq ($(comp),icc)
|
|
CXXFLAGS += -msse3 -DUSE_POPCNT
|
|
else
|
|
CXXFLAGS += -msse3 -mpopcnt -DUSE_POPCNT
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(avx2),yes)
|
|
CXXFLAGS += -DUSE_AVX2
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mavx2
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(avx512),yes)
|
|
CXXFLAGS += -DUSE_AVX512
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mavx512bw
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(sse42),yes)
|
|
CXXFLAGS += -DUSE_SSE42
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -msse4.2
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(sse41),yes)
|
|
CXXFLAGS += -DUSE_SSE41
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -msse4.1
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ssse3),yes)
|
|
CXXFLAGS += -DUSE_SSSE3
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mssse3
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(sse3),yes)
|
|
CXXFLAGS += -DUSE_SSE3
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -msse3
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(neon),yes)
|
|
CXXFLAGS += -DUSE_NEON
|
|
endif
|
|
|
|
ifeq ($(arch),x86_64)
|
|
CXXFLAGS += -DUSE_SSE2
|
|
endif
|
|
|
|
### 3.7 pext
|
|
ifeq ($(pext),yes)
|
|
CXXFLAGS += -DUSE_PEXT
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mbmi2
|
|
endif
|
|
endif
|
|
|
|
### 3.8 Link Time Optimization
|
|
### This is a mix of compile and link time options because the lto link phase
|
|
### needs access to the optimization flags.
|
|
ifeq ($(optimize),yes)
|
|
ifeq ($(debug), no)
|
|
ifeq ($(comp),$(filter $(comp),gcc clang))
|
|
CXXFLAGS += -flto
|
|
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)
|
|
ifeq ($(KERNEL),Linux)
|
|
CXXFLAGS += -flto
|
|
LDFLAGS += $(CXXFLAGS)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.9 Android 5 can only run position independent executables. Note that this
|
|
### breaks Android 4.0 and earlier.
|
|
ifeq ($(OS), Android)
|
|
CXXFLAGS += -fPIE
|
|
LDFLAGS += -fPIE -pie
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 4. Public Targets
|
|
### ==========================================================================
|
|
|
|
help:
|
|
@echo ""
|
|
@echo "To compile stockfish, type: "
|
|
@echo ""
|
|
@echo "make target ARCH=arch [COMP=compiler] [COMPCXX=cxx]"
|
|
@echo ""
|
|
@echo "Supported targets:"
|
|
@echo ""
|
|
@echo "build > Standard build"
|
|
@echo "profile-build > Standard build with PGO"
|
|
@echo "strip > Strip executable"
|
|
@echo "install > Install executable"
|
|
@echo "clean > Clean up"
|
|
@echo "net > Download the default nnue net"
|
|
@echo ""
|
|
@echo "Supported archs:"
|
|
@echo ""
|
|
@echo "x86-64-avx512 > x86 64-bit with avx512 support"
|
|
@echo "x86-64-bmi2 > x86 64-bit with bmi2 support"
|
|
@echo "x86-64-avx2 > x86 64-bit with avx2 support"
|
|
@echo "x86-64-sse42 > x86 64-bit with sse42 support"
|
|
@echo "x86-64-modern > x86 64-bit with sse41 support (x86-64-sse41)"
|
|
@echo "x86-64-sse41 > x86 64-bit with sse41 support"
|
|
@echo "x86-64-ssse3 > x86 64-bit with ssse3 support"
|
|
@echo "x86-64-sse3-popcnt > x86 64-bit with sse3 and popcnt support"
|
|
@echo "x86-64-sse3 > x86 64-bit with sse3 support"
|
|
@echo "x86-64 > x86 64-bit generic"
|
|
@echo "x86-32 > x86 32-bit (also enables SSE)"
|
|
@echo "x86-32-old > x86 32-bit fall back for old hardware"
|
|
@echo "ppc-64 > PPC 64-bit"
|
|
@echo "ppc-32 > PPC 32-bit"
|
|
@echo "armv7 > ARMv7 32-bit"
|
|
@echo "armv8 > ARMv8 64-bit"
|
|
@echo "apple-silicon > Apple silicon ARM64"
|
|
@echo "general-64 > unspecified 64-bit"
|
|
@echo "general-32 > unspecified 32-bit"
|
|
@echo ""
|
|
@echo "Supported compilers:"
|
|
@echo ""
|
|
@echo "gcc > Gnu compiler (default)"
|
|
@echo "mingw > Gnu compiler with MinGW under Windows"
|
|
@echo "clang > LLVM Clang compiler"
|
|
@echo "icc > Intel compiler"
|
|
@echo ""
|
|
@echo "Simple examples. If you don't know what to do, you likely want to run: "
|
|
@echo ""
|
|
@echo "make -j build ARCH=x86-64 (This is for 64-bit systems)"
|
|
@echo "make -j build ARCH=x86-32 (This is for 32-bit systems)"
|
|
@echo ""
|
|
@echo "Advanced examples, for experienced users: "
|
|
@echo ""
|
|
@echo "make -j build ARCH=x86-64-modern COMP=clang"
|
|
@echo "make -j profile-build ARCH=x86-64-bmi2 COMP=gcc COMPCXX=g++-4.8"
|
|
@echo ""
|
|
@echo "The selected architecture $(ARCH) enables the following configuration: "
|
|
@echo ""
|
|
@$(MAKE) ARCH=$(ARCH) COMP=$(COMP) config-sanity
|
|
|
|
|
|
.PHONY: help build profile-build strip install clean net objclean profileclean \
|
|
config-sanity icc-profile-use icc-profile-make gcc-profile-use gcc-profile-make \
|
|
clang-profile-use clang-profile-make
|
|
|
|
build: config-sanity
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) all
|
|
|
|
profile-build: config-sanity objclean profileclean
|
|
@echo ""
|
|
@echo "Step 1/4. Building instrumented executable ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_make)
|
|
@echo ""
|
|
@echo "Step 2/4. Running benchmark for pgo-build ..."
|
|
$(PGOBENCH) > /dev/null
|
|
@echo ""
|
|
@echo "Step 3/4. Building optimized executable ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) objclean
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_use)
|
|
@echo ""
|
|
@echo "Step 4/4. Deleting profile data ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) profileclean
|
|
|
|
strip:
|
|
strip $(EXE)
|
|
|
|
install:
|
|
-mkdir -p -m 755 $(BINDIR)
|
|
-cp $(EXE) $(BINDIR)
|
|
-strip $(BINDIR)/$(EXE)
|
|
|
|
#clean all
|
|
clean: objclean profileclean
|
|
@rm -f .depend *~ core
|
|
|
|
net:
|
|
$(eval nnuenet := $(shell grep EvalFile ucioption.cpp | grep Option | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
|
|
@echo "Default net: $(nnuenet)"
|
|
$(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
|
|
$(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -sL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
|
|
@if test -f "$(nnuenet)"; then echo "Already available."; else echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet); fi
|
|
|
|
# clean binaries and objects
|
|
objclean:
|
|
@rm -f $(EXE) *.o ./syzygy/*.o ./nnue/*.o ./nnue/features/*.o
|
|
|
|
# clean auxiliary profiling files
|
|
profileclean:
|
|
@rm -rf profdir
|
|
@rm -f bench.txt *.gcda *.gcno ./syzygy/*.gcda ./nnue/*.gcda ./nnue/features/*.gcda
|
|
@rm -f stockfish.profdata *.profraw
|
|
|
|
default:
|
|
help
|
|
|
|
### ==========================================================================
|
|
### Section 5. Private Targets
|
|
### ==========================================================================
|
|
|
|
all: $(EXE) .depend
|
|
|
|
config-sanity:
|
|
@echo ""
|
|
@echo "Config:"
|
|
@echo "debug: '$(debug)'"
|
|
@echo "sanitize: '$(sanitize)'"
|
|
@echo "optimize: '$(optimize)'"
|
|
@echo "arch: '$(arch)'"
|
|
@echo "bits: '$(bits)'"
|
|
@echo "kernel: '$(KERNEL)'"
|
|
@echo "os: '$(OS)'"
|
|
@echo "prefetch: '$(prefetch)'"
|
|
@echo "popcnt: '$(popcnt)'"
|
|
@echo "sse: '$(sse)'"
|
|
@echo "sse3: '$(sse3)'"
|
|
@echo "ssse3: '$(ssse3)'"
|
|
@echo "sse41: '$(sse41)'"
|
|
@echo "sse42: '$(sse42)'"
|
|
@echo "avx2: '$(avx2)'"
|
|
@echo "pext: '$(pext)'"
|
|
@echo "avx512: '$(avx512)'"
|
|
@echo "neon: '$(neon)'"
|
|
@echo ""
|
|
@echo "Flags:"
|
|
@echo "CXX: $(CXX)"
|
|
@echo "CXXFLAGS: $(CXXFLAGS)"
|
|
@echo "LDFLAGS: $(LDFLAGS)"
|
|
@echo ""
|
|
@echo "Testing config sanity. If this fails, try 'make help' ..."
|
|
@echo ""
|
|
@test "$(debug)" = "yes" || test "$(debug)" = "no"
|
|
@test "$(sanitize)" = "undefined" || test "$(sanitize)" = "thread" || test "$(sanitize)" = "address" || test "$(sanitize)" = "no"
|
|
@test "$(optimize)" = "yes" || test "$(optimize)" = "no"
|
|
@test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \
|
|
test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || \
|
|
test "$(arch)" = "armv7" || test "$(arch)" = "armv8-a" || test "$(arch)" = "arm64"
|
|
@test "$(bits)" = "32" || test "$(bits)" = "64"
|
|
@test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"
|
|
@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
|
|
@test "$(sse)" = "yes" || test "$(sse)" = "no"
|
|
@test "$(sse3)" = "yes" || test "$(sse3)" = "no"
|
|
@test "$(ssse3)" = "yes" || test "$(ssse3)" = "no"
|
|
@test "$(sse41)" = "yes" || test "$(sse41)" = "no"
|
|
@test "$(sse42)" = "yes" || test "$(sse42)" = "no"
|
|
@test "$(avx2)" = "yes" || test "$(avx2)" = "no"
|
|
@test "$(pext)" = "yes" || test "$(pext)" = "no"
|
|
@test "$(avx512)" = "yes" || test "$(avx512)" = "no"
|
|
@test "$(neon)" = "yes" || test "$(neon)" = "no"
|
|
@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
|
|
|
|
$(EXE): $(OBJS)
|
|
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
|
|
|
|
clang-profile-make:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-instr-generate ' \
|
|
EXTRALDFLAGS=' -fprofile-instr-generate' \
|
|
all
|
|
|
|
clang-profile-use:
|
|
llvm-profdata merge -output=stockfish.profdata *.profraw
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-instr-use=stockfish.profdata' \
|
|
EXTRALDFLAGS='-fprofile-use ' \
|
|
all
|
|
|
|
gcc-profile-make:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-generate' \
|
|
EXTRALDFLAGS='-lgcov' \
|
|
all
|
|
|
|
gcc-profile-use:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-use -fno-peel-loops -fno-tracer' \
|
|
EXTRALDFLAGS='-lgcov' \
|
|
all
|
|
|
|
icc-profile-make:
|
|
@mkdir -p profdir
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-prof-gen=srcpos -prof_dir ./profdir' \
|
|
all
|
|
|
|
icc-profile-use:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \
|
|
all
|
|
|
|
.depend:
|
|
-@$(CXX) $(DEPENDFLAGS) -MM $(SRCS) > $@ 2> /dev/null
|
|
|
|
-include .depend
|