X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=a97c73485523eaf13002ddf3c6895b3f7c52d663;hb=ea6c1f7a17572f1cd291ffd00e28cfbd3b2947d5;hp=744d84f442e682808839cf5b1195b1555f821e2b;hpb=2d60995c004e4ddf010373ba84a766d2cbaf082e;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 744d84f4..a97c7348 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -227,7 +227,15 @@ void Search::think() { << std::endl; } - Threads.wake_up(); + // Reset and wake up the threads + for (size_t i = 0; i < Threads.size(); i++) + { + Threads[i].maxPly = 0; + Threads[i].do_sleep = false; + + if (!Threads.use_sleeping_threads()) + Threads[i].notify_one(); + } // Set best timer interval to avoid lagging under time pressure. Timer is // used to check for remaining available thinking time. @@ -242,7 +250,11 @@ void Search::think() { id_loop(RootPos); // Let's start searching ! Threads.set_timer(0); // Stop timer - Threads.sleep(); + + // Main thread will go to sleep by itself to avoid a race with start_searching() + for (size_t i = 0; i < Threads.size(); i++) + if (&Threads[i] != Threads.main_thread()) + Threads[i].do_sleep = true; if (Options["Use Search Log"]) { @@ -262,10 +274,15 @@ void Search::think() { finalize: // When we reach max depth we arrive here even without Signals.stop is raised, - // but if we are pondering or in infinite search, we shouldn't print the best - // move before we are told to do so. + // but if we are pondering or in infinite search, according to UCI protocol, + // we shouldn't print the best move before the GUI sends a "stop" or "ponderhit" + // command. We simply wait here until GUI sends one of those commands (that + // raise Signals.stop). if (!Signals.stop && (Limits.ponder || Limits.infinite)) - RootPos.this_thread()->wait_for_stop_or_ponderhit(); + { + Signals.stopOnPonderhit = true; + RootPos.this_thread()->wait_for(Signals.stop); + } // Best move could be MOVE_NONE when searching on a stalemate position sync_cout << "bestmove " << move_to_uci(RootMoves[0].pv[0], RootPos.is_chess960()) @@ -902,7 +919,7 @@ split_point_start: // At split points actual search starts from here continue; } - pvMove = PvNode ? moveCount == 1 : false; + pvMove = PvNode && moveCount == 1; ss->currentMove = move; if (!SpNode && !captureOrPromotion && playedMoveCount < 64) movesSearched[playedMoveCount++] = move; @@ -994,24 +1011,21 @@ split_point_start: // At split points actual search starts from here if (value > bestValue) { - bestValue = value; - if (SpNode) sp->bestValue = value; + bestValue = SpNode ? sp->bestValue = value : value; if (value > alpha) { - bestMove = move; - if (SpNode) sp->bestMove = move; + bestMove = SpNode ? sp->bestMove = move : move; - if (PvNode && value < beta) - { - alpha = value; // Update alpha here! Always alpha < beta - if (SpNode) sp->alpha = value; - } + if (PvNode && value < beta) // Update alpha! Always alpha < beta + alpha = SpNode ? sp->alpha = value : value; else { assert(value >= beta); // Fail high - if (SpNode) sp->cutoff = true; + if (SpNode) + sp->cutoff = true; + break; } } @@ -1109,7 +1123,7 @@ split_point_start: // At split points actual search starts from here Key posKey; Move ttMove, move, bestMove; Value bestValue, value, ttValue, futilityValue, futilityBase, oldAlpha; - bool givesCheck, enoughMaterial, evasionPrunable, fromNull; + bool givesCheck, enoughMaterial, evasionPrunable; Depth ttDepth; // To flag BOUND_EXACT a node with eval above alpha and no available moves @@ -1118,7 +1132,6 @@ split_point_start: // At split points actual search starts from here ss->currentMove = bestMove = MOVE_NONE; ss->ply = (ss-1)->ply + 1; - fromNull = (ss-1)->currentMove == MOVE_NULL; // Check for an instant draw or maximum ply reached if (pos.is_draw() || ss->ply > MAX_PLY) @@ -1156,13 +1169,7 @@ split_point_start: // At split points actual search starts from here } else { - if (fromNull) - { - // Approximated score. Real one is slightly higher due to tempo - ss->staticEval = bestValue = -(ss-1)->staticEval; - ss->evalMargin = VALUE_ZERO; - } - else if (tte) + if (tte) { // Never assume anything on values stored in TT if ( (ss->staticEval = bestValue = tte->static_value()) == VALUE_NONE @@ -1206,7 +1213,6 @@ split_point_start: // At split points actual search starts from here // Futility pruning if ( !PvNode && !InCheck - && !fromNull && !givesCheck && move != ttMove && enoughMaterial @@ -1704,7 +1710,7 @@ void Thread::idle_loop() { && !sp->slavesMask) { assert(!sp->master->is_searching); - sp->master->wake_up(); + sp->master->notify_one(); } // After releasing the lock we cannot access anymore any SplitPoint