X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=6215b083dd22dc3bc2e408d8fbe09c3a076e0bd0;hp=8410f73bbf8ee8ad49f45f1e1777cb200e745759;hb=7ed15af371be19a4d261df87fa33df0a94fdc930;hpb=a67c22611aea4b643e8278fa6007da316bd06b13 diff --git a/src/search.cpp b/src/search.cpp index 8410f73b..6215b083 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -163,7 +162,7 @@ uint64_t Search::perft(Position& pos, Depth depth) { for (MoveList it(pos); *it; ++it) { if (Root && depth <= ONE_PLY) - cnt = 1; + cnt = 1, nodes++; else { pos.do_move(*it, st, ci, pos.gives_check(*it, ci)); @@ -188,7 +187,7 @@ void Search::think() { TimeMgr.init(Limits, RootPos.game_ply(), RootPos.side_to_move()); - int cf = Options["Contempt Factor"] * PawnValueEg / 100; // From centipawns + int cf = Options["Contempt"] * PawnValueEg / 100; // From centipawns DrawValue[ RootPos.side_to_move()] = VALUE_DRAW - Value(cf); DrawValue[~RootPos.side_to_move()] = VALUE_DRAW + Value(cf); @@ -202,18 +201,6 @@ void Search::think() { goto finalize; } - if (Options["Write Search Log"]) - { - Log log(Options["Search Log Filename"]); - log << "\nSearching: " << RootPos.fen() - << "\ninfinite: " << Limits.infinite - << " ponder: " << Limits.ponder - << " time: " << Limits.time[RootPos.side_to_move()] - << " increment: " << Limits.inc[RootPos.side_to_move()] - << " moves to go: " << Limits.movestogo - << "\n" << std::endl; - } - // Reset the threads, still sleeping: will wake up at split time for (size_t i = 0; i < Threads.size(); ++i) Threads[i]->maxPly = 0; @@ -225,21 +212,6 @@ void Search::think() { Threads.timer->run = false; // Stop the timer - if (Options["Write Search Log"]) - { - Time::point elapsed = Time::now() - SearchTime + 1; - - Log log(Options["Search Log Filename"]); - log << "Nodes: " << RootPos.nodes_searched() - << "\nNodes/second: " << RootPos.nodes_searched() * 1000 / elapsed - << "\nBest move: " << move_to_san(RootPos, RootMoves[0].pv[0]); - - StateInfo st; - RootPos.do_move(RootMoves[0].pv[0], st); - log << "\nPonder move: " << move_to_san(RootPos, RootMoves[0].pv[1]) << std::endl; - RootPos.undo_move(RootMoves[0].pv[0]); - } - finalize: // When search is stopped this info is not printed @@ -381,17 +353,6 @@ namespace { if (skill.candidates_size() && skill.time_to_pick(depth)) skill.pick_move(); - if (Options["Write Search Log"]) - { - RootMove& rm = RootMoves[0]; - if (skill.best != MOVE_NONE) - rm = *std::find(RootMoves.begin(), RootMoves.end(), skill.best); - - Log log(Options["Search Log Filename"]); - log << pretty_pv(pos, depth, rm.score, Time::now() - SearchTime, &rm.pv[0]) - << std::endl; - } - // Have we found a "mate in x"? if ( Limits.mate && bestValue >= VALUE_MATE_IN_MAX_PLY @@ -606,8 +567,7 @@ namespace { // Null move dynamic reduction based on depth and value Depth R = 3 * ONE_PLY + depth / 4 - + (abs(beta) < VALUE_KNOWN_WIN ? int(eval - beta) / PawnValueMg * ONE_PLY - : DEPTH_ZERO); + + std::min(int(eval - beta) / PawnValueMg, 3) * ONE_PLY; pos.do_null_move(st); (ss+1)->skipNullMove = true; @@ -862,12 +822,10 @@ moves_loop: // When in check and at SpNode search starts from here { ss->reduction = reduction(improving, depth, moveCount); - if (!PvNode && cutNode) + if ( (!PvNode && cutNode) + || History[pos.piece_on(to_sq(move))][to_sq(move)] < 0) ss->reduction += ONE_PLY; - else if (History[pos.piece_on(to_sq(move))][to_sq(move)] < 0) - ss->reduction += ONE_PLY / 2; - if (move == countermoves[0] || move == countermoves[1]) ss->reduction = std::max(DEPTH_ZERO, ss->reduction - ONE_PLY); @@ -1461,46 +1419,13 @@ void Thread::idle_loop() { assert(!this_sp || (this_sp->masterThread == this && searching)); - while (true) + while (!exit) { - // If we are not searching, wait for a condition to be signaled instead of - // wasting CPU time polling for work. - while (!searching || exit) - { - if (exit) - { - assert(!this_sp); - return; - } - - // Grab the lock to avoid races with Thread::notify_one() - mutex.lock(); - - // If we are master and all slaves have finished then exit idle_loop - if (this_sp && this_sp->slavesMask.none()) - { - mutex.unlock(); - break; - } - - // Do sleep after retesting sleep conditions under lock protection. In - // particular we need to avoid a deadlock in case a master thread has, - // in the meanwhile, allocated us and sent the notify_one() call before - // we had the chance to grab the lock. - if (!searching && !exit) - sleepCondition.wait(mutex); - - mutex.unlock(); - } - // If this thread has been assigned work, launch a search - if (searching) + while (searching) { - assert(!exit); - Threads.mutex.lock(); - assert(searching); assert(activeSplitPoint); SplitPoint* sp = activeSplitPoint; @@ -1584,16 +1509,23 @@ void Thread::idle_loop() { } } - // If this thread is the master of a split point and all slaves have finished - // their work at this split point, return from the idle loop. + // Grab the lock to avoid races with Thread::notify_one() + mutex.lock(); + + // If we are master and all slaves have finished then exit idle_loop if (this_sp && this_sp->slavesMask.none()) { - this_sp->mutex.lock(); - bool finished = this_sp->slavesMask.none(); // Retest under lock protection - this_sp->mutex.unlock(); - if (finished) - return; + assert(!searching); + mutex.unlock(); + break; } + + // If we are not searching, wait for a condition to be signaled instead of + // wasting CPU time polling for work. + if (!searching && !exit) + sleepCondition.wait(mutex); + + mutex.unlock(); } }