mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 12:07:43 +00:00
Only main thread checks time
The main change of the patch is that now time check is done only by main thread. In the past, before lazy SMP, we needed all the threds to check for available time because main thread could have been blocked on a split point, now this is no more the case and main thread can do the job alone, greatly simplifying the logic. Verified for regression testing on STC with 7 threads: LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 11895 W: 1741 L: 1608 D: 8546 No functional change. Closes #1152
This commit is contained in:
committed by
Joona Kiiski
parent
fa1e3427bd
commit
05513a6641
+16
-33
@@ -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<PV>(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<MainThread*>(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() {
|
||||
|
||||
static std::atomic<TimePoint> lastInfoTime = { now() };
|
||||
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 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.
|
||||
|
||||
Reference in New Issue
Block a user