1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-02 01:29:36 +00:00

Move some globals into main thread scope

Make it explicit that those variables are not globals, but
are used only by main thread. I think it is a sensible
clarification because easy move is already tricky enough
and current patch makes the involved actors explicit.

No functional change.

Resolves #537
This commit is contained in:
Marco Costalba 2015-12-23 10:07:54 +01:00 committed by Joona Kiiski
parent 90f5937373
commit 1b5b900a29
2 changed files with 33 additions and 29 deletions

View file

@ -127,8 +127,6 @@ namespace {
}; };
EasyMoveManager EasyMove; EasyMoveManager EasyMove;
bool easyPlayed, failedLow;
double BestMoveChanges;
Value DrawValue[COLOR_NB]; Value DrawValue[COLOR_NB];
CounterMovesHistoryStats CounterMovesHistory; CounterMovesHistoryStats CounterMovesHistory;
@ -326,16 +324,19 @@ void MainThread::search() {
if (th != this) if (th != this)
th->wait_for_search_finished(); th->wait_for_search_finished();
// Check if there are threads with a better score than main thread. // Check if there are threads with a better score than main thread
Thread* bestThread = this; Thread* bestThread = this;
if (!easyPlayed && Options["MultiPV"] == 1 && !Skill(Options["Skill Level"]).enabled()) if ( !this->easyMovePlayed
&& Options["MultiPV"] == 1
&& !Skill(Options["Skill Level"]).enabled())
{
for (Thread* th : Threads) for (Thread* th : Threads)
if ( th->completedDepth > bestThread->completedDepth if ( th->completedDepth > bestThread->completedDepth
&& th->rootMoves[0].score > bestThread->rootMoves[0].score) && th->rootMoves[0].score > bestThread->rootMoves[0].score)
bestThread = th; bestThread = th;
}
// Send new PV when needed. // Send new PV when needed
// FIXME: Breaks multiPV, and skill levels
if (bestThread != this) if (bestThread != this)
sync_cout << UCI::pv(bestThread->rootPos, bestThread->completedDepth, -VALUE_INFINITE, VALUE_INFINITE) << sync_endl; sync_cout << UCI::pv(bestThread->rootPos, bestThread->completedDepth, -VALUE_INFINITE, VALUE_INFINITE) << sync_endl;
@ -357,7 +358,7 @@ void Thread::search() {
Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2) Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2)
Value bestValue, alpha, beta, delta; Value bestValue, alpha, beta, delta;
Move easyMove = MOVE_NONE; Move easyMove = MOVE_NONE;
bool isMainThread = (this == Threads.main()); MainThread* mainThread = (this == Threads.main() ? Threads.main() : nullptr);
std::memset(ss-2, 0, 5 * sizeof(Stack)); std::memset(ss-2, 0, 5 * sizeof(Stack));
@ -365,12 +366,12 @@ void Thread::search() {
beta = VALUE_INFINITE; beta = VALUE_INFINITE;
completedDepth = DEPTH_ZERO; completedDepth = DEPTH_ZERO;
if (isMainThread) if (mainThread)
{ {
easyMove = EasyMove.get(rootPos.key()); easyMove = EasyMove.get(rootPos.key());
EasyMove.clear(); EasyMove.clear();
easyPlayed = false; mainThread->easyMovePlayed = mainThread->failedLow = false;
BestMoveChanges = 0; mainThread->bestMoveChanges = 0;
TT.new_search(); TT.new_search();
} }
@ -389,7 +390,7 @@ void Thread::search() {
{ {
// Set up the new depth for the helper threads skipping in average each // Set up the new depth for the helper threads skipping in average each
// 2nd ply (using a half density map similar to a Hadamard matrix). // 2nd ply (using a half density map similar to a Hadamard matrix).
if (!isMainThread) if (!mainThread)
{ {
int d = rootDepth + rootPos.game_ply(); int d = rootDepth + rootPos.game_ply();
@ -412,8 +413,8 @@ void Thread::search() {
} }
// Age out PV variability metric // Age out PV variability metric
if (isMainThread) if (mainThread)
BestMoveChanges *= 0.505, failedLow = false; mainThread->bestMoveChanges *= 0.505, mainThread->failedLow = false;
// Save the last iteration's scores before first PV line is searched and // Save the last iteration's scores before first PV line is searched and
// all the move scores except the (new) PV are set to -VALUE_INFINITE. // all the move scores except the (new) PV are set to -VALUE_INFINITE.
@ -459,7 +460,7 @@ void Thread::search() {
// When failing high/low give some update (without cluttering // When failing high/low give some update (without cluttering
// the UI) before a re-search. // the UI) before a re-search.
if ( isMainThread if ( mainThread
&& multiPV == 1 && multiPV == 1
&& (bestValue <= alpha || bestValue >= beta) && (bestValue <= alpha || bestValue >= beta)
&& Time.elapsed() > 3000) && Time.elapsed() > 3000)
@ -472,9 +473,9 @@ void Thread::search() {
beta = (alpha + beta) / 2; beta = (alpha + beta) / 2;
alpha = std::max(bestValue - delta, -VALUE_INFINITE); alpha = std::max(bestValue - delta, -VALUE_INFINITE);
if (isMainThread) if (mainThread)
{ {
failedLow = true; mainThread->failedLow = true;
Signals.stopOnPonderhit = false; Signals.stopOnPonderhit = false;
} }
} }
@ -494,7 +495,7 @@ void Thread::search() {
// Sort the PV lines searched so far and update the GUI // Sort the PV lines searched so far and update the GUI
std::stable_sort(rootMoves.begin(), rootMoves.begin() + PVIdx + 1); std::stable_sort(rootMoves.begin(), rootMoves.begin() + PVIdx + 1);
if (!isMainThread) if (!mainThread)
break; break;
if (Signals.stop) if (Signals.stop)
@ -508,7 +509,7 @@ void Thread::search() {
if (!Signals.stop) if (!Signals.stop)
completedDepth = rootDepth; completedDepth = rootDepth;
if (!isMainThread) if (!mainThread)
continue; continue;
// If skill level is enabled and time is up, pick a sub-optimal best move // If skill level is enabled and time is up, pick a sub-optimal best move
@ -528,15 +529,15 @@ void Thread::search() {
{ {
// Take some extra time if the best move has changed // Take some extra time if the best move has changed
if (rootDepth > 4 * ONE_PLY && multiPV == 1) if (rootDepth > 4 * ONE_PLY && multiPV == 1)
Time.pv_instability(BestMoveChanges); Time.pv_instability(mainThread->bestMoveChanges);
// Stop the search if only one legal move is available or all // Stop the search if only one legal move is available or all
// of the available time has been used or we matched an easyMove // of the available time has been used or we matched an easyMove
// from the previous search and just did a fast verification. // from the previous search and just did a fast verification.
if ( rootMoves.size() == 1 if ( rootMoves.size() == 1
|| Time.elapsed() > Time.available() * (failedLow? 641 : 315)/640 || Time.elapsed() > Time.available() * (mainThread->failedLow ? 641 : 315) / 640
|| ( easyPlayed = ( rootMoves[0].pv[0] == easyMove || (mainThread->easyMovePlayed = ( rootMoves[0].pv[0] == easyMove
&& BestMoveChanges < 0.03 && mainThread->bestMoveChanges < 0.03
&& Time.elapsed() > Time.available() / 8))) && Time.elapsed() > Time.available() / 8)))
{ {
// If we are allowed to ponder do not stop the search now but // If we are allowed to ponder do not stop the search now but
@ -555,12 +556,12 @@ void Thread::search() {
} }
} }
if (!isMainThread) if (!mainThread)
return; return;
// Clear any candidate easy move that wasn't stable for the last search // Clear any candidate easy move that wasn't stable for the last search
// iterations; the second condition prevents consecutive fast moves. // iterations; the second condition prevents consecutive fast moves.
if (EasyMove.stableCnt < 6 || easyPlayed) if (EasyMove.stableCnt < 6 || mainThread->easyMovePlayed)
EasyMove.clear(); EasyMove.clear();
// If skill level is enabled, swap best PV line with the sub-optimal one // If skill level is enabled, swap best PV line with the sub-optimal one
@ -1066,7 +1067,7 @@ moves_loop: // When in check search starts from here
// iteration. This information is used for time management: When // iteration. This information is used for time management: When
// the best move changes frequently, we allocate some more time. // the best move changes frequently, we allocate some more time.
if (moveCount > 1 && thisThread == Threads.main()) if (moveCount > 1 && thisThread == Threads.main())
++BestMoveChanges; ++static_cast<MainThread*>(thisThread)->bestMoveChanges;
} }
else else
// All other moves but the PV are set to the lowest value: this is // All other moves but the PV are set to the lowest value: this is

View file

@ -76,6 +76,9 @@ public:
struct MainThread : public Thread { struct MainThread : public Thread {
virtual void search(); virtual void search();
bool easyMovePlayed, failedLow;
double bestMoveChanges;
}; };