]> git.sesse.net Git - stockfish/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 9 Oct 2022 12:42:37 +0000 (14:42 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 9 Oct 2022 12:42:37 +0000 (14:42 +0200)
1  2 
src/Makefile
src/misc.cpp
src/position.cpp
src/ucioption.cpp

diff --combined src/Makefile
index aeb8ba9d29b7d81df4720ebfde628c3b4d7feb38,8315f33d6b08ff7b797f867ab6b54e3c596e0080..23c19bfb43c7253faafa30621fcf72892d06fe56
  ### Section 1. General Configuration
  ### ==========================================================================
  
+ ### Establish the operating system name
+ KERNEL = $(shell uname -s)
+ ifeq ($(KERNEL),Linux)
+       OS = $(shell uname -o)
+ endif
+ ### Target Windows OS
+ ifeq ($(OS),Windows_NT)
+       ifneq ($(COMP),ndk)
+               target_windows = yes
+       endif
+ else ifeq ($(COMP),mingw)
+       target_windows = yes
+       ifeq ($(WINE_PATH),)
+               WINE_PATH = $(shell which wine)
+       endif
+ endif
  ### Executable name
- ifeq ($(COMP),mingw)
- EXE = stockfish.exe
+ ifeq ($(target_windows),yes)
      EXE = stockfish.exe
  else
- EXE = stockfish
      EXE = stockfish
  endif
  
  ### Installation dir definitions
@@@ -32,30 -50,21 +50,24 @@@ BINDIR = $(PREFIX)/bi
  
  ### Built-in benchmark for pgo-builds
  ifeq ($(SDE_PATH),)
-       PGOBENCH = ./$(EXE) bench
+       PGOBENCH = $(WINE_PATH) ./$(EXE) bench
  else
-       PGOBENCH = $(SDE_PATH) -- ./$(EXE) bench
+       PGOBENCH = $(SDE_PATH) -- $(WINE_PATH) ./$(EXE) bench
  endif
  
  ### 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_ka_v2_hm.cpp
 +      nnue/evaluate_nnue.cpp nnue/features/half_ka_v2_hm.cpp \
 +      hashprobe.grpc.pb.cc hashprobe.pb.cc
 +CLISRCS = client.cpp hashprobe.grpc.pb.cc hashprobe.pb.cc uci.cpp
  
  OBJS = $(notdir $(SRCS:.cpp=.o))
 +CLIOBJS = $(notdir $(CLISRCS:.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
  ### ==========================================================================
@@@ -143,7 -152,7 +155,7 @@@ ifeq ($(findstring x86,$(ARCH)),x86
  ifeq ($(findstring x86-32,$(ARCH)),x86-32)
        arch = i386
        bits = 32
-       sse = yes
+       sse = no
        mmx = yes
  else
        arch = x86_64
@@@ -336,9 -345,15 +348,15 @@@ endi
  ### ==========================================================================
  
  ### 3.1 Selecting compiler (default = gcc)
- CXXFLAGS += -Wall -Wcast-qual -fno-exceptions -std=c++17 $(EXTRACXXFLAGS)
- DEPENDFLAGS += -std=c++17
- LDFLAGS += $(EXTRALDFLAGS)
+ ifeq ($(MAKELEVEL),0)
+        export ENV_CXXFLAGS := $(CXXFLAGS)
+        export ENV_DEPENDFLAGS := $(DEPENDFLAGS)
+        export ENV_LDFLAGS := $(LDFLAGS)
+ endif
+ CXXFLAGS = $(ENV_CXXFLAGS) -Wall -Wcast-qual -fno-exceptions -std=c++17 $(EXTRACXXFLAGS)
+ DEPENDFLAGS = $(ENV_DEPENDFLAGS) -std=c++17
+ LDFLAGS = $(ENV_LDFLAGS) $(EXTRALDFLAGS)
  
  ifeq ($(COMP),)
        COMP=gcc
@@@ -347,7 -362,7 +365,7 @@@ endi
  ifeq ($(COMP),gcc)
        comp=gcc
        CXX=g++
 -      CXXFLAGS += -pedantic -Wextra -Wshadow
 +      CXXFLAGS += -pedantic -Wextra
  
        ifeq ($(arch),$(filter $(arch),armv7 armv8))
                ifeq ($(OS),Android)
        endif
  endif
  
+ ifeq ($(target_windows),yes)
+       LDFLAGS += -static
+ 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
+       ifeq ($(bits),64)
+               ifeq ($(shell which x86_64-w64-mingw32-c++-posix 2> /dev/null),)
+                       CXX=x86_64-w64-mingw32-c++
                else
-                       ifeq ($(shell which i686-w64-mingw32-c++-posix),)
-                               CXX=i686-w64-mingw32-c++
-                       else
-                               CXX=i686-w64-mingw32-c++-posix
-                       endif
+                       CXX=x86_64-w64-mingw32-c++-posix
                endif
        else
-               CXX=g++
+               ifeq ($(shell which i686-w64-mingw32-c++-posix 2> /dev/null),)
+                       CXX=i686-w64-mingw32-c++
+               else
+                       CXX=i686-w64-mingw32-c++-posix
+               endif
        endif
        CXXFLAGS += -pedantic -Wextra -Wshadow
-       LDFLAGS += -static
  endif
  
  ifeq ($(COMP),icc)
@@@ -402,19 -415,19 +418,19 @@@ endi
  ifeq ($(COMP),clang)
        comp=clang
        CXX=clang++
+       ifeq ($(target_windows),yes)
+               CXX=x86_64-w64-mingw32-clang++
+       endif
        CXXFLAGS += -pedantic -Wextra -Wshadow
  
-       ifneq ($(KERNEL),Darwin)
-       ifneq ($(KERNEL),OpenBSD)
-       ifneq ($(KERNEL),FreeBSD)
-       ifneq ($(findstring MINGW,$(KERNEL)),MINGW)
+       ifeq ($(filter $(KERNEL),Darwin OpenBSD FreeBSD),)
+       ifeq ($(target_windows),)
        ifneq ($(RTLIB),compiler-rt)
                LDFLAGS += -latomic
        endif
        endif
        endif
-       endif
-       endif
  
        ifeq ($(arch),$(filter $(arch),armv7 armv8))
                ifeq ($(OS),Android)
                CXXFLAGS += -m$(bits)
                LDFLAGS += -m$(bits)
        endif
-       ifeq ($(findstring MINGW,$(KERNEL)),MINGW)
-               LDFLAGS += -static
-       endif
  endif
  
  ifeq ($(KERNEL),Darwin)
@@@ -451,11 -459,19 +462,19 @@@ ifeq ($(COMP),ndk
        ifeq ($(arch),armv7)
                CXX=armv7a-linux-androideabi16-clang++
                CXXFLAGS += -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon
-               STRIP=arm-linux-androideabi-strip
+               ifneq ($(shell which arm-linux-androideabi-strip 2>/dev/null),)
+                       STRIP=arm-linux-androideabi-strip
+               else
+                       STRIP=llvm-strip
+               endif
        endif
        ifeq ($(arch),armv8)
                CXX=aarch64-linux-android21-clang++
-               STRIP=aarch64-linux-android-strip
+               ifneq ($(shell which aarch64-linux-android-strip 2>/dev/null),)
+                       STRIP=aarch64-linux-android-strip
+               else
+                       STRIP=llvm-strip
+               endif
        endif
        LDFLAGS += -static-libstdc++ -pie -lm -latomic
  endif
@@@ -524,7 -540,7 +543,7 @@@ endi
  ### 3.3 Optimization
  ifeq ($(optimize),yes)
  
 -      CXXFLAGS += -O3
 +      CXXFLAGS += -O3 -g
  
        ifeq ($(comp),gcc)
                ifeq ($(OS), Android)
                endif
        endif
  
-     ifeq ($(KERNEL),Darwin)
-         ifeq ($(comp),$(filter $(comp),clang icc))
-             CXXFLAGS += -mdynamic-no-pic
-         endif
+       ifeq ($(KERNEL),Darwin)
+               ifeq ($(comp),$(filter $(comp),clang icc))
+                       CXXFLAGS += -mdynamic-no-pic
+               endif
  
-         ifeq ($(comp),gcc)
-             ifneq ($(arch),arm64)
-                 CXXFLAGS += -mdynamic-no-pic
-             endif
-         endif
-     endif
+               ifeq ($(comp),gcc)
+                       ifneq ($(arch),arm64)
+                               CXXFLAGS += -mdynamic-no-pic
+                       endif
+               endif
+       endif
  
        ifeq ($(comp),clang)
                CXXFLAGS += -fexperimental-new-pass-manager
@@@ -663,9 -679,7 +682,7 @@@ ifeq ($(optimize),yes
  ifeq ($(debug), no)
        ifeq ($(comp),clang)
                CXXFLAGS += -flto
-               ifneq ($(findstring MINGW,$(KERNEL)),)
-                       CXXFLAGS += -fuse-ld=lld
-               else ifneq ($(findstring MSYS,$(KERNEL)),)
+               ifeq ($(target_windows),yes)
                        CXXFLAGS += -fuse-ld=lld
                endif
                LDFLAGS += $(CXXFLAGS)
        ifeq ($(gccisclang),)
                CXXFLAGS += -flto
                LDFLAGS += $(CXXFLAGS) -flto=jobserver
-               ifneq ($(findstring MINGW,$(KERNEL)),)
-                       LDFLAGS += -save-temps
-               else ifneq ($(findstring MSYS,$(KERNEL)),)
-                       LDFLAGS += -save-temps
-               endif
        else
                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 known to work, older might not.
- # So, only enable it for a cross from Linux by default.
+ # To use LTO and static linking on Windows,
+ # the tool chain requires gcc version 10.1 or later.
        else ifeq ($(comp),mingw)
-       ifeq ($(KERNEL),Linux)
        ifneq ($(arch),i386)
                CXXFLAGS += -flto
-               LDFLAGS += $(CXXFLAGS) -flto=jobserver
-       endif
+               LDFLAGS += $(CXXFLAGS) -save-temps
        endif
        endif
  endif
@@@ -811,7 -817,7 +820,7 @@@ strip
  install:
        -mkdir -p -m 755 $(BINDIR)
        -cp $(EXE) $(BINDIR)
-       -strip $(BINDIR)/$(EXE)
+       $(STRIP) $(BINDIR)/$(EXE)
  
  # clean all
  clean: objclean profileclean
  net:
        $(eval nnuenet := $(shell grep EvalFileDefaultName evaluate.h | grep define | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
        @echo "Default net: $(nnuenet)"
-       $(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
+       $(eval nnuedownloadurl1 := https://tests.stockfishchess.org/api/nn/$(nnuenet))
+       $(eval nnuedownloadurl2 := https://github.com/official-stockfish/networks/raw/master/$(nnuenet))
        $(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -skL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
-       @if test -f "$(nnuenet)"; then \
-             echo "Already available."; \
-          else \
-             if [ "x$(curl_or_wget)" = "x" ]; then \
-                echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
-             else \
-                echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet);\
-             fi; \
-         fi;
+       @if [ "x$(curl_or_wget)" = "x" ]; then \
+           echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
+         fi
        $(eval shasum_command := $(shell if hash shasum 2>/dev/null; then echo "shasum -a 256 "; elif hash sha256sum 2>/dev/null; then echo "sha256sum "; fi))
-       @if [ "x$(shasum_command)" != "x" ]; then \
-           if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
-                 echo "Failed download or $(nnuenet) corrupted, please delete!"; exit 1; \
-             fi \
-          else \
+       @if [ "x$(shasum_command)" = "x" ]; then \
              echo "shasum / sha256sum not found, skipping net validation"; \
          fi
+       @for nnuedownloadurl in "$(nnuedownloadurl1)" "$(nnuedownloadurl2)"; do \
+          if test -f "$(nnuenet)"; then \
+             echo "$(nnuenet) available."; \
+          else \
+             if [ "x$(curl_or_wget)" != "x" ]; then \
+                echo "Downloading $${nnuedownloadurl}"; $(curl_or_wget) $${nnuedownloadurl} > $(nnuenet);\
+             fi; \
+          fi; \
+          if [ "x$(shasum_command)" != "x" ]; then \
+             if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
+                echo "Removing failed download"; rm -f $(nnuenet); \
+             else \
+                echo "Network validated"; break; \
+             fi; \
+          fi; \
+       done
+       @if ! test -f "$(nnuenet)"; then \
+           echo "Failed to download $(nnuenet)."; \
+       fi
  
  # clean binaries and objects
  objclean:
-       @rm -f $(EXE) *.o ./syzygy/*.o ./nnue/*.o ./nnue/features/*.o
+       @rm -f stockfish stockfish.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 *.s
        @rm -f stockfish.profdata *.profraw
-       @rm -f stockfish.exe.lto_wrapper_args
-       @rm -f stockfish.exe.ltrans.out
+       @rm -f stockfish.*args*
+       @rm -f stockfish.*lt*
+       @rm -f stockfish.res
        @rm -f ./-lstdc++.res
  
  default:
  ### Section 5. Private Targets
  ### ==========================================================================
  
 -all: $(EXE) .depend
 +all: $(EXE) client .depend
  
  config-sanity: net
        @echo ""
@@@ -961,32 -978,6 +981,32 @@@ icc-profile-use
        EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \
        all
  
 +### GRPC
 +
 +PROTOS_PATH = .
 +PROTOC = protoc
 +GRPC_CPP_PLUGIN = grpc_cpp_plugin
 +GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
 +
 +%.grpc.pb.h %.grpc.pb.cc: %.proto
 +      $(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
 +
 +# oh my
 +%.cpp: %.cc
 +      cp $< $@
 +
 +%.pb.h %.pb.cc: %.proto
 +      $(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<
 +
 +#LDFLAGS += -Wl,-Bstatic -Wl,-\( -lprotobuf -lgrpc++_unsecure -lgrpc_unsecure -lgrpc -lz -Wl,-\) -Wl,-Bdynamic -ldl
 +LDFLAGS += /usr/lib/x86_64-linux-gnu/libprotobuf.a /usr/lib/x86_64-linux-gnu/libgrpc++_unsecure.a /usr/lib/x86_64-linux-gnu/libgrpc_unsecure.a /usr/lib/x86_64-linux-gnu/libgrpc.a /usr/lib/x86_64-linux-gnu/libcares.a /usr/lib/x86_64-linux-gnu/libgpr.a /usr/lib/x86_64-linux-gnu/libabsl_str_format_internal.a /usr/lib/x86_64-linux-gnu/libabsl_strings.a /usr/lib/x86_64-linux-gnu/libabsl_flags_marshalling.a /usr/lib/x86_64-linux-gnu/libabsl_throw_delegate.a /usr/lib/x86_64-linux-gnu/libabsl_raw_logging_internal.a /usr/lib/x86_64-linux-gnu/libabsl_base.a /usr/lib/x86_64-linux-gnu/libabsl_int128.a /usr/lib/x86_64-linux-gnu/libabsl_bad_optional_access.a -ldl -lz
 +#LDFLAGS += /usr/lib/x86_64-linux-gnu/libprotobuf.a /usr/lib/libgrpc++_unsecure.a /usr/lib/libgrpc_unsecure.a /usr/lib/libgrpc.a /usr/lib/x86_64-linux-gnu/libcares.a -ldl -lz
 +
 +client: $(CLIOBJS)
 +      $(CXX) -o $@ $(CLIOBJS) $(LDFLAGS)
 +
 +# Other stuff
 +
  .depend: $(SRCS)
        -@$(CXX) $(DEPENDFLAGS) -MM $(SRCS) > $@ 2> /dev/null
  
diff --combined src/misc.cpp
index 9618ba763e165ed7d86c882a98f34822a9dc41bf,d19cd840bbaea481330d77c9d27ff86efb60cd7a..9cfd63047606555db23fb81f35ba781337e5701b
@@@ -155,7 -155,6 +155,7 @@@ string engine_info(bool to_uci) 
    {
        date >> month >> day >> year;
        ss << setw(2) << day << setw(2) << (1 + months.find(month) / 4) << year.substr(2);
 +      ss << "-asn";
    }
  
    ss << (to_uci  ? "\nid author ": " by ")
@@@ -379,10 -378,9 +379,9 @@@ void std_aligned_free(void* ptr) 
  
  #if defined(_WIN32)
  
- static void* aligned_large_pages_alloc_windows(size_t allocSize) {
+ static void* aligned_large_pages_alloc_windows([[maybe_unused]] size_t allocSize) {
  
    #if !defined(_WIN64)
-     (void)allocSize; // suppress unused-parameter compiler warning
      return nullptr;
    #else
  
@@@ -627,8 -625,7 +626,7 @@@ string argv0;            // path+name o
  string binaryDirectory;  // path of the executable directory
  string workingDirectory; // path of the working directory
  
- void init(int argc, char* argv[]) {
-     (void)argc;
+ void init([[maybe_unused]] int argc, char* argv[]) {
      string pathSeparator;
  
      // extract the path+name of the executable binary
diff --combined src/position.cpp
index a1643d6d280d878feb0405576efc5685d0a6c7a9,62e6e2387cb657a58976ce52a4faa9be16db1ff1..5dc6050f081fbfc412111dc1334df1bf259cfeb3
@@@ -283,6 -283,8 +283,6 @@@ Position& Position::set(const string& f
    thisThread = th;
    set_state(st);
  
 -  assert(pos_is_ok());
 -
    return *this;
  }
  
@@@ -1052,7 -1054,10 +1052,10 @@@ Key Position::key_after(Move m) const 
    if (captured)
        k ^= Zobrist::psq[captured][to];
  
-   return k ^ Zobrist::psq[pc][to] ^ Zobrist::psq[pc][from];
+   k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[pc][from];
+   return (captured || type_of(pc) == PAWN)
+       ? k : adjust_key50<true>(k);
  }
  
  
@@@ -1097,10 -1102,12 +1100,12 @@@ bool Position::see_ge(Move m, Value thr
        // Don't allow pinned pieces to attack as long as there are
        // pinners on their original square.
        if (pinners(~stm) & occupied)
+       {
            stmAttackers &= ~blockers_for_king(stm);
  
-       if (!stmAttackers)
-           break;
+           if (!stmAttackers)
+               break;
+       }
  
        res ^= 1;
  
diff --combined src/ucioption.cpp
index 6adbbde1c1da83a1fa21da315658d67bbf02f7c2,9fb48345a06044b99ab17f56c2873c9ed3886a1d..8dd10a48a26525b6f0c2c59e61989922cfb60a15
@@@ -27,7 -27,6 +27,7 @@@
  #include "thread.h"
  #include "tt.h"
  #include "uci.h"
 +#include "hashprobe.h"
  #include "syzygy/tbprobe.h"
  
  using std::string;
@@@ -35,7 -34,6 +35,7 @@@
  namespace Stockfish {
  
  UCI::OptionsMap Options; // Global object
 +std::unique_ptr<HashProbeThread> hash_probe_thread;
  
  namespace UCI {
  
@@@ -47,13 -45,6 +47,13 @@@ void on_threads(const Option& o) { Thre
  void on_tb_path(const Option& o) { Tablebases::init(o); }
  void on_use_NNUE(const Option& ) { Eval::NNUE::init(); }
  void on_eval_file(const Option& ) { Eval::NNUE::init(); }
 +void on_rpc_server_address(const Option& o) {
 +      if (hash_probe_thread) {
 +              hash_probe_thread->Shutdown();
 +      }
 +      std::string addr = o;
 +      hash_probe_thread.reset(new HashProbeThread(addr));
 +}
  
  /// Our case insensitive less() function as required by UCI protocol
  bool CaseInsensitiveLess::operator() (const string& s1, const string& s2) const {
@@@ -70,7 -61,7 +70,7 @@@ void init(OptionsMap& o) 
    constexpr int MaxHashMB = Is64Bit ? 33554432 : 2048;
  
    o["Debug Log File"]        << Option("", on_logger);
-   o["Threads"]               << Option(1, 1, 512, on_threads);
+   o["Threads"]               << Option(1, 1, 1024, on_threads);
    o["Hash"]                  << Option(16, 1, MaxHashMB, on_hash_size);
    o["Clear Hash"]            << Option(on_clear_hash);
    o["Ponder"]                << Option(false);
@@@ -90,7 -81,6 +90,7 @@@
    o["SyzygyProbeLimit"]      << Option(7, 0, 7);
    o["Use NNUE"]              << Option(true, on_use_NNUE);
    o["EvalFile"]              << Option(EvalFileDefaultName, on_eval_file);
 +  o["RPCServerAddress"]      << Option("<empty>", on_rpc_server_address);
  }