}
else
{
- for (Thread* th : Threads)
- {
- th->bestMoveChanges = 0;
- if (th != this)
- th->start_searching();
- }
-
- Thread::search(); // Let's start searching!
+ Threads.start_searching(); // start non-main threads
+ Thread::search(); // main thread start searching
}
// When we reach the maximum depth, we can arrive here without a raise of
Threads.stop = true;
// Wait until all threads have finished
- for (Thread* th : Threads)
- if (th != this)
- th->wait_for_search_finished();
+ Threads.wait_for_search_finished();
// When playing in 'nodes as time' mode, subtract the searched nodes from
// the available ones before exiting.
Thread* bestThread = this;
- // Check if there are threads with a better score than main thread
- if ( int(Options["MultiPV"]) == 1
- && !Limits.depth
- && !(Skill(Options["Skill Level"]).enabled() || int(Options["UCI_LimitStrength"]))
- && rootMoves[0].pv[0] != MOVE_NONE)
- {
- std::map<Move, int64_t> votes;
- Value minScore = this->rootMoves[0].score;
-
- // Find minimum score
- for (Thread* th: Threads)
- minScore = std::min(minScore, th->rootMoves[0].score);
-
- // Vote according to score and depth, and select the best thread
- for (Thread* th : Threads)
- {
- votes[th->rootMoves[0].pv[0]] +=
- (th->rootMoves[0].score - minScore + 14) * int(th->completedDepth);
-
- if (abs(bestThread->rootMoves[0].score) >= VALUE_TB_WIN_IN_MAX_PLY)
- {
- // Make sure we pick the shortest mate / TB conversion or stave off mate the longest
- if (th->rootMoves[0].score > bestThread->rootMoves[0].score)
- bestThread = th;
- }
- else if ( th->rootMoves[0].score >= VALUE_TB_WIN_IN_MAX_PLY
- || ( th->rootMoves[0].score > VALUE_TB_LOSS_IN_MAX_PLY
- && votes[th->rootMoves[0].pv[0]] > votes[bestThread->rootMoves[0].pv[0]]))
- bestThread = th;
- }
- }
+ if (int(Options["MultiPV"]) == 1 &&
+ !Limits.depth &&
+ !(Skill(Options["Skill Level"]).enabled() || int(Options["UCI_LimitStrength"])) &&
+ rootMoves[0].pv[0] != MOVE_NONE)
+ bestThread = Threads.get_best_thread();
bestPreviousScore = bestThread->rootMoves[0].score;
contHist,
countermove,
ss->killers,
- depth > 12 ? ss->ply : MAX_PLY);
+ ss->ply);
value = bestValue;
singularQuietLMR = moveCountPruning = false;
&& ss->staticEval + 235 + 172 * lmrDepth <= alpha
&& (*contHist[0])[movedPiece][to_sq(move)]
+ (*contHist[1])[movedPiece][to_sq(move)]
- + (*contHist[3])[movedPiece][to_sq(move)] < 27400)
+ + (*contHist[3])[movedPiece][to_sq(move)]
+ + (*contHist[5])[movedPiece][to_sq(move)] / 2 < 31400)
continue;
// Prune moves with negative SEE (~20 Elo)