diff --git a/src/Makefile b/src/Makefile index 53c3a929..24a62826 100644 --- a/src/Makefile +++ b/src/Makefile @@ -160,8 +160,8 @@ endif ifeq ($(ARCH),armv8) arch = armv8-a - bits = 64 prefetch = yes + popcnt = yes endif ifeq ($(ARCH),ppc-32) @@ -370,8 +370,8 @@ endif ### 3.6 popcnt ifeq ($(popcnt),yes) - ifeq ($(arch),ppc64) - CXXFLAGS += -DUSE_POPCNT -DUSE_SSE2 + ifeq ($(arch),$(filter $(arch),ppc64 armv8-a)) + CXXFLAGS += -DUSE_POPCNT else ifeq ($(comp),icc) CXXFLAGS += -msse3 -DUSE_POPCNT -DUSE_SSE2 else @@ -399,10 +399,20 @@ endif ### needs access to the optimization flags. ifeq ($(optimize),yes) ifeq ($(debug), no) - ifeq ($(comp),$(filter $(comp),gcc clang mingw)) + 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 diff --git a/src/eval/nnue/nnue_common.h b/src/eval/nnue/nnue_common.h index 502fbc05..bb52bdfe 100644 --- a/src/eval/nnue/nnue_common.h +++ b/src/eval/nnue/nnue_common.h @@ -7,6 +7,8 @@ #if defined(USE_AVX2) #include +#elif defined(USE_SSE41) +#include #elif defined(USE_SSE2) #include #endif diff --git a/src/learn/learner.cpp b/src/learn/learner.cpp index fb0d9959..ea7c4d7e 100644 --- a/src/learn/learner.cpp +++ b/src/learn/learner.cpp @@ -1028,24 +1028,10 @@ double sigmoid(double x) // A function that converts the evaluation value to the winning rate [0,1] double winning_percentage(double value) { - // In Maxima, - // load("C:/maxima-5.44.0/cform.lisp"); - // PawnValueEg = 206; - // cform(1.0 / (1.0 + 10.0 ^ (-value / PawnValueEg / 4.0))); - constexpr double PawnValue = PawnValueEg; - return 1.0 * pow(pow(10.0, -0.25 * pow(PawnValue, -1) * value) + 1.0, -1); -} - -double delta_winning_percentage(double value) -{ - // In Maxima, - // load("C:/maxima-5.44.0/cform.lisp"); - // PawnValueEg = 206; - // cform(diff(1.0/(1.0+10.0^(-value/PawnValue/4.0)),value)); - constexpr double PawnValue = PawnValueEg; - return - 0.5756462732485115 * pow(PawnValue, -1) * pow(10.0, -0.25 * pow(PawnValue, -1) * value) * - pow(pow(10.0, -0.25 * pow(PawnValue, -1) * value) + 1.0, -2); + // 1/(1+10^(-Eval/4)) + // = 1/(1+e^(-Eval/4*ln(10)) + // = sigmoid(Eval/4*ln(10)) + return sigmoid(value / PawnValueEg / 4.0 * log(10.0)); } double dsigmoid(double x) { @@ -1143,7 +1129,6 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv) const double q = winning_percentage(shallow); const double p = winning_percentage(deep); - const double dq = delta_winning_percentage(shallow); // Use 1 as the correction term if the expected win rate is 1, 0 if you lose, and 0.5 if you draw. // game_result = 1,0,-1 so add 1 and divide by 2. @@ -1154,9 +1139,7 @@ double calc_grad(Value deep, Value shallow , const PackedSfenValue& psv) // Use the actual win rate as a correction term. // This is the idea of ​​elmo (WCSC27), modern O-parts. - const double pp = (q - p) * dq / q / (1.0 - q); - const double tt = (q - t) * dq / q / (1.0 - q); - const double grad = lambda * pp + (1.0 - lambda) * tt; + const double grad = lambda * (q - p) + (1.0 - lambda) * (q - t); return grad; } diff --git a/src/search.h b/src/search.h index 0d22b0ff..7638d822 100644 --- a/src/search.h +++ b/src/search.h @@ -92,7 +92,7 @@ struct LimitsType { } bool use_time_management() const { - return !(mate | movetime | depth | nodes | perft | infinite); + return time[WHITE] || time[BLACK]; } std::vector searchmoves;