LimitsType Limits;
RootMoveVector RootMoves;
Position RootPos;
- Time::point SearchTime;
+ TimePoint SearchTime;
StateStackPtr SetupStates;
}
// the UI) before a re-search.
if ( multiPV == 1
&& (bestValue <= alpha || bestValue >= beta)
- && Time::now() - SearchTime > 3000)
+ && now() - SearchTime > 3000)
sync_cout << UCI::pv(pos, depth, alpha, beta) << sync_endl;
// In case of failing low/high increase aspiration window and
if (Signals.stop)
sync_cout << "info nodes " << RootPos.nodes_searched()
- << " time " << Time::now() - SearchTime << sync_endl;
+ << " time " << now() - SearchTime << sync_endl;
- else if (PVIdx + 1 == multiPV || Time::now() - SearchTime > 3000)
+ else if (PVIdx + 1 == multiPV || now() - SearchTime > 3000)
sync_cout << UCI::pv(pos, depth, alpha, beta) << sync_endl;
}
// Stop the search if only one legal move is available or all
// of the available time has been used.
if ( RootMoves.size() == 1
- || Time::now() - SearchTime > TimeMgr.available_time())
+ || now() - SearchTime > TimeMgr.available_time())
{
// If we are allowed to ponder do not stop the search now but
// keep pondering until the GUI sends "ponderhit" or "stop".
continue;
moveCount = ++splitPoint->moveCount;
- splitPoint->mutex.unlock();
+ splitPoint->spinlock.release();
}
else
++moveCount;
{
Signals.firstRootMove = (moveCount == 1);
- if (thisThread == Threads.main() && Time::now() - SearchTime > 3000)
+ if (thisThread == Threads.main() && now() - SearchTime > 3000)
sync_cout << "info depth " << depth / ONE_PLY
<< " currmove " << UCI::move(move, pos.is_chess960())
<< " currmovenumber " << moveCount + PVIdx << sync_endl;
&& moveCount >= FutilityMoveCounts[improving][depth])
{
if (SpNode)
- splitPoint->mutex.lock();
+ splitPoint->spinlock.acquire();
continue;
}
if (SpNode)
{
- splitPoint->mutex.lock();
+ splitPoint->spinlock.acquire();
if (bestValue > splitPoint->bestValue)
splitPoint->bestValue = bestValue;
}
if (predictedDepth < 4 * ONE_PLY && pos.see_sign(move) < VALUE_ZERO)
{
if (SpNode)
- splitPoint->mutex.lock();
+ splitPoint->spinlock.acquire();
continue;
}
// Step 18. Check for new best move
if (SpNode)
{
- splitPoint->mutex.lock();
+ splitPoint->spinlock.acquire();
bestValue = splitPoint->bestValue;
alpha = splitPoint->alpha;
}
Move Skill::pick_best(size_t multiPV) {
// PRNG sequence should be non-deterministic, so we seed it with the time at init
- static PRNG rng(Time::now());
+ static PRNG rng(now());
// RootMoves are already sorted by score in descending order
int variance = std::min(RootMoves[0].score - RootMoves[multiPV - 1].score, PawnValueMg);
string UCI::pv(const Position& pos, Depth depth, Value alpha, Value beta) {
std::stringstream ss;
- Time::point elapsed = Time::now() - SearchTime + 1;
+ TimePoint elapsed = now() - SearchTime + 1;
size_t multiPV = std::min((size_t)Options["MultiPV"], RootMoves.size());
int selDepth = 0;
// If this thread has been assigned work, launch a search
while (searching)
{
- Threads.mutex.lock();
+ Threads.spinlock.acquire();
assert(activeSplitPoint);
SplitPoint* sp = activeSplitPoint;
- Threads.mutex.unlock();
+ Threads.spinlock.release();
Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2)
Position pos(*sp->pos, this);
std::memcpy(ss-2, sp->ss-2, 5 * sizeof(Stack));
ss->splitPoint = sp;
- sp->mutex.lock();
+ sp->spinlock.acquire();
assert(activePosition == nullptr);
// After releasing the lock we can't access any SplitPoint related data
// in a safe way because it could have been released under our feet by
// the sp master.
- sp->mutex.unlock();
+ sp->spinlock.release();
// Try to late join to another split point if none of its slaves has
// already finished.
SplitPoint* bestSp = NULL;
- Thread* bestThread = NULL;
- int bestScore = INT_MAX;
+ int minLevel = INT_MAX;
for (Thread* th : Threads)
{
if ( sp
&& sp->allSlavesSearching
&& sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT
- && available_to(th))
+ && can_join(sp))
{
assert(this != th);
assert(!(this_sp && this_sp->slavesMask.none()));
// Prefer to join to SP with few parents to reduce the probability
// that a cut-off occurs above us, and hence we waste our work.
- int level = -1;
- for (SplitPoint* spp = th->activeSplitPoint; spp; spp = spp->parentSplitPoint)
+ int level = 0;
+ for (SplitPoint* p = th->activeSplitPoint; p; p = p->parentSplitPoint)
level++;
- int score = level * 256 * 256 + (int)sp->slavesMask.count() * 256 - sp->depth * 1;
-
- if (score < bestScore)
+ if (level < minLevel)
{
bestSp = sp;
- bestThread = th;
- bestScore = score;
+ minLevel = level;
}
}
}
sp = bestSp;
// Recheck the conditions under lock protection
- Threads.mutex.lock();
- sp->mutex.lock();
+ Threads.spinlock.acquire();
+ sp->spinlock.acquire();
if ( sp->allSlavesSearching
&& sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT
- && available_to(bestThread))
+ && can_join(sp))
{
sp->slavesMask.set(idx);
activeSplitPoint = sp;
searching = true;
}
- sp->mutex.unlock();
- Threads.mutex.unlock();
+ sp->spinlock.release();
+ Threads.spinlock.release();
}
}
void check_time() {
- static Time::point lastInfoTime = Time::now();
- Time::point elapsed = Time::now() - SearchTime;
+ static TimePoint lastInfoTime = now();
+ TimePoint elapsed = now() - SearchTime;
- if (Time::now() - lastInfoTime >= 1000)
+ if (now() - lastInfoTime >= 1000)
{
- lastInfoTime = Time::now();
+ lastInfoTime = now();
dbg_print();
}
else if (Limits.nodes)
{
- Threads.mutex.lock();
+ Threads.spinlock.acquire();
int64_t nodes = RootPos.nodes_searched();
{
SplitPoint& sp = th->splitPoints[i];
- sp.mutex.lock();
+ sp.spinlock.acquire();
nodes += sp.nodes;
if (sp.slavesMask.test(idx) && Threads[idx]->activePosition)
nodes += Threads[idx]->activePosition->nodes_searched();
- sp.mutex.unlock();
+ sp.spinlock.release();
}
- Threads.mutex.unlock();
+ Threads.spinlock.release();
if (nodes >= Limits.nodes)
Signals.stop = true;