X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=e6c3cd701485947c1c174b98f037661dca03409e;hb=05513a66410f96959f3a6e70be9aea72425cf7c7;hp=12cbffe020b25f7bf92921dc860e23e83eb3d919;hpb=fa1e3427bdf7f6347326015a381014564e8fb337;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 12cbffe0..e6c3cd70 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -154,7 +154,6 @@ namespace { void update_pv(Move* pv, Move move, Move* childPv); void update_cm_stats(Stack* ss, Piece pc, Square s, int bonus); void update_stats(const Position& pos, Stack* ss, Move move, Move* quiets, int quietsCnt, int bonus); - void check_time(); } // namespace @@ -193,7 +192,6 @@ void Search::clear() { for (Thread* th : Threads) { - th->resetCalls = true; th->counterMoves.fill(MOVE_NONE); th->history.fill(0); @@ -204,6 +202,7 @@ void Search::clear() { th->counterMoveHistory[NO_PIECE][0].fill(CounterMovePruneThreshold - 1); } + Threads.main()->callsCnt = 0; Threads.main()->previousScore = VALUE_INFINITE; } @@ -400,9 +399,6 @@ void Thread::search() { { bestValue = ::search(rootPos, ss, alpha, beta, rootDepth, false, false); - this->tbHits = rootPos.tb_hits(); - this->nodes = rootPos.nodes_searched(); - // Bring the best move to the front. It is critical that sorting // is done with a stable algorithm because all the values but the // first and eventually the new best one are set to -VALUE_INFINITE @@ -567,26 +563,8 @@ namespace { ss->ply = (ss-1)->ply + 1; // Check for the available remaining time - if (thisThread->resetCalls.load(std::memory_order_relaxed)) - { - thisThread->resetCalls = false; - - thisThread->tbHits = pos.tb_hits(); - thisThread->nodes = pos.nodes_searched(); - - // At low node count increase the checking rate to about 0.1% of nodes - // otherwise use a default value. - thisThread->callsCnt = Limits.nodes ? std::min(4096, int(Limits.nodes / 1024)) - : 4096; - } - - if (--thisThread->callsCnt <= 0) - { - for (Thread* th : Threads) - th->resetCalls = true; - - check_time(); - } + if (thisThread == Threads.main()) + static_cast(thisThread)->check_time(); // Used to send selDepth info to GUI if (PvNode && thisThread->maxPly < ss->ply) @@ -674,7 +652,7 @@ namespace { if (err != TB::ProbeState::FAIL) { - pos.increment_tbHits(); + thisThread->tbHits.fetch_add(1, std::memory_order_relaxed); int drawScore = TB::UseRule50 ? 1 : 0; @@ -960,7 +938,7 @@ moves_loop: // When in check search starts from here ss->moveCount = --moveCount; continue; } - + if (move == ttMove && captureOrPromotion) ttCapture = true; @@ -983,11 +961,10 @@ moves_loop: // When in check search starts from here r -= r ? ONE_PLY : DEPTH_ZERO; else { - // Increase reduction if ttMove is a capture if (ttCapture) r += ONE_PLY; - + // Increase reduction for cut nodes if (cutNode) r += 2 * ONE_PLY; @@ -1482,13 +1459,21 @@ moves_loop: // When in check search starts from here return best; } +} // namespace // check_time() is used to print debug info and, more importantly, to detect // when we are out of available time and thus stop the search. - void check_time() { + void MainThread::check_time() { + + if (--callsCnt > 0) + return; + + // At low node count increase the checking rate to about 0.1% of nodes + // otherwise use a default value. + callsCnt = Limits.nodes ? std::min(4096, int(Limits.nodes / 1024)) : 4096; - static std::atomic lastInfoTime = { now() }; + static TimePoint lastInfoTime = now(); int elapsed = Time.elapsed(); TimePoint tick = Limits.startTime + elapsed; @@ -1509,8 +1494,6 @@ moves_loop: // When in check search starts from here Signals.stop = true; } -} // namespace - /// UCI::pv() formats PV information according to the UCI protocol. UCI requires /// that all (if any) unsearched PV lines are sent using a previous search score.