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:
parent
90f5937373
commit
1b5b900a29
2 changed files with 33 additions and 29 deletions
|
@ -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
|
||||||
|
|
|
@ -76,6 +76,9 @@ public:
|
||||||
|
|
||||||
struct MainThread : public Thread {
|
struct MainThread : public Thread {
|
||||||
virtual void search();
|
virtual void search();
|
||||||
|
|
||||||
|
bool easyMovePlayed, failedLow;
|
||||||
|
double bestMoveChanges;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue