1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +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;
bool easyPlayed, failedLow;
double BestMoveChanges;
Value DrawValue[COLOR_NB];
CounterMovesHistoryStats CounterMovesHistory;
@ -326,16 +324,19 @@ void MainThread::search() {
if (th != this)
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;
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)
if ( th->completedDepth > bestThread->completedDepth
&& th->rootMoves[0].score > bestThread->rootMoves[0].score)
bestThread = th;
}
// Send new PV when needed.
// FIXME: Breaks multiPV, and skill levels
// Send new PV when needed
if (bestThread != this)
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)
Value bestValue, alpha, beta, delta;
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));
@ -365,12 +366,12 @@ void Thread::search() {
beta = VALUE_INFINITE;
completedDepth = DEPTH_ZERO;
if (isMainThread)
if (mainThread)
{
easyMove = EasyMove.get(rootPos.key());
EasyMove.clear();
easyPlayed = false;
BestMoveChanges = 0;
mainThread->easyMovePlayed = mainThread->failedLow = false;
mainThread->bestMoveChanges = 0;
TT.new_search();
}
@ -389,7 +390,7 @@ void Thread::search() {
{
// 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).
if (!isMainThread)
if (!mainThread)
{
int d = rootDepth + rootPos.game_ply();
@ -412,8 +413,8 @@ void Thread::search() {
}
// Age out PV variability metric
if (isMainThread)
BestMoveChanges *= 0.505, failedLow = false;
if (mainThread)
mainThread->bestMoveChanges *= 0.505, mainThread->failedLow = false;
// 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.
@ -459,7 +460,7 @@ void Thread::search() {
// When failing high/low give some update (without cluttering
// the UI) before a re-search.
if ( isMainThread
if ( mainThread
&& multiPV == 1
&& (bestValue <= alpha || bestValue >= beta)
&& Time.elapsed() > 3000)
@ -472,9 +473,9 @@ void Thread::search() {
beta = (alpha + beta) / 2;
alpha = std::max(bestValue - delta, -VALUE_INFINITE);
if (isMainThread)
if (mainThread)
{
failedLow = true;
mainThread->failedLow = true;
Signals.stopOnPonderhit = false;
}
}
@ -494,7 +495,7 @@ void Thread::search() {
// Sort the PV lines searched so far and update the GUI
std::stable_sort(rootMoves.begin(), rootMoves.begin() + PVIdx + 1);
if (!isMainThread)
if (!mainThread)
break;
if (Signals.stop)
@ -508,7 +509,7 @@ void Thread::search() {
if (!Signals.stop)
completedDepth = rootDepth;
if (!isMainThread)
if (!mainThread)
continue;
// 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
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
// of the available time has been used or we matched an easyMove
// from the previous search and just did a fast verification.
if ( rootMoves.size() == 1
|| Time.elapsed() > Time.available() * (failedLow? 641 : 315)/640
|| ( easyPlayed = ( rootMoves[0].pv[0] == easyMove
&& BestMoveChanges < 0.03
|| Time.elapsed() > Time.available() * (mainThread->failedLow ? 641 : 315) / 640
|| (mainThread->easyMovePlayed = ( rootMoves[0].pv[0] == easyMove
&& mainThread->bestMoveChanges < 0.03
&& Time.elapsed() > Time.available() / 8)))
{
// 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;
// Clear any candidate easy move that wasn't stable for the last search
// iterations; the second condition prevents consecutive fast moves.
if (EasyMove.stableCnt < 6 || easyPlayed)
if (EasyMove.stableCnt < 6 || mainThread->easyMovePlayed)
EasyMove.clear();
// 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
// the best move changes frequently, we allocate some more time.
if (moveCount > 1 && thisThread == Threads.main())
++BestMoveChanges;
++static_cast<MainThread*>(thisThread)->bestMoveChanges;
}
else
// 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 {
virtual void search();
bool easyMovePlayed, failedLow;
double bestMoveChanges;
};