mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Retire splitPoint->cpus field
It is redundant with splitPoint->slaves[]. Also move slaves[MAX_THREADS] among the shared data in SplitPoint definition as it should have been already. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
2cec7347db
commit
16d6faf479
2 changed files with 18 additions and 16 deletions
|
@ -1353,6 +1353,7 @@ namespace {
|
||||||
alpha = value;
|
alpha = value;
|
||||||
|
|
||||||
update_pv(ss, ply);
|
update_pv(ss, ply);
|
||||||
|
|
||||||
if (value == value_mate_in(ply + 1))
|
if (value == value_mate_in(ply + 1))
|
||||||
ss[ply].mateKiller = move;
|
ss[ply].mateKiller = move;
|
||||||
}
|
}
|
||||||
|
@ -1740,7 +1741,6 @@ namespace {
|
||||||
/* Here we have the lock still grabbed */
|
/* Here we have the lock still grabbed */
|
||||||
|
|
||||||
sp->slaves[threadID] = 0;
|
sp->slaves[threadID] = 0;
|
||||||
sp->cpus--;
|
|
||||||
|
|
||||||
lock_release(&(sp->lock));
|
lock_release(&(sp->lock));
|
||||||
}
|
}
|
||||||
|
@ -2406,12 +2406,15 @@ namespace {
|
||||||
threads[threadID].state = THREAD_AVAILABLE;
|
threads[threadID].state = THREAD_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this thread is the master of a split point and all threads have
|
// If this thread is the master of a split point and all slaves have
|
||||||
// finished their work at this split point, return from the idle loop.
|
// finished their work at this split point, return from the idle loop.
|
||||||
if (sp && sp->cpus == 0)
|
int i = 0;
|
||||||
|
for ( ; sp && !sp->slaves[i] && i < ActiveThreads; i++) {}
|
||||||
|
|
||||||
|
if (i == ActiveThreads)
|
||||||
{
|
{
|
||||||
// Because sp->cpus is decremented under lock protection,
|
// Because sp->slaves[] is reset under lock protection,
|
||||||
// be sure sp->lock has been released before to proceed.
|
// be sure sp->lock has been released before to return.
|
||||||
lock_grab(&(sp->lock));
|
lock_grab(&(sp->lock));
|
||||||
lock_release(&(sp->lock));
|
lock_release(&(sp->lock));
|
||||||
|
|
||||||
|
@ -2593,9 +2596,8 @@ namespace {
|
||||||
// data that must be copied to the helper threads (the current position and
|
// data that must be copied to the helper threads (the current position and
|
||||||
// search stack, alpha, beta, the search depth, etc.), and we tell our
|
// search stack, alpha, beta, the search depth, etc.), and we tell our
|
||||||
// helper threads that they have been assigned work. This will cause them
|
// helper threads that they have been assigned work. This will cause them
|
||||||
// to instantly leave their idle loops and call sp_search_pv(). When all
|
// to instantly leave their idle loops and call sp_search(). When all
|
||||||
// threads have returned from sp_search_pv (or, equivalently, when
|
// threads have returned from sp_search() then split() returns true.
|
||||||
// splitPoint->cpus becomes 0), split() returns true.
|
|
||||||
|
|
||||||
template <bool Fake>
|
template <bool Fake>
|
||||||
bool ThreadsManager::split(const Position& p, SearchStack* sstck, int ply, Value* alpha,
|
bool ThreadsManager::split(const Position& p, SearchStack* sstck, int ply, Value* alpha,
|
||||||
|
@ -2641,7 +2643,6 @@ namespace {
|
||||||
splitPoint->master = master;
|
splitPoint->master = master;
|
||||||
splitPoint->mp = mp;
|
splitPoint->mp = mp;
|
||||||
splitPoint->moves = *moves;
|
splitPoint->moves = *moves;
|
||||||
splitPoint->cpus = 1;
|
|
||||||
splitPoint->pos = &p;
|
splitPoint->pos = &p;
|
||||||
splitPoint->parentSstack = sstck;
|
splitPoint->parentSstack = sstck;
|
||||||
for (int i = 0; i < ActiveThreads; i++)
|
for (int i = 0; i < ActiveThreads; i++)
|
||||||
|
@ -2653,17 +2654,19 @@ namespace {
|
||||||
// If we are here it means we are not available
|
// If we are here it means we are not available
|
||||||
assert(threads[master].state != THREAD_AVAILABLE);
|
assert(threads[master].state != THREAD_AVAILABLE);
|
||||||
|
|
||||||
|
int workersCnt = 1; // At least the master is included
|
||||||
|
|
||||||
// Allocate available threads setting state to THREAD_BOOKED
|
// Allocate available threads setting state to THREAD_BOOKED
|
||||||
for (int i = 0; !Fake && i < ActiveThreads && splitPoint->cpus < MaxThreadsPerSplitPoint; i++)
|
for (int i = 0; !Fake && i < ActiveThreads && workersCnt < MaxThreadsPerSplitPoint; i++)
|
||||||
if (thread_is_available(i, master))
|
if (thread_is_available(i, master))
|
||||||
{
|
{
|
||||||
threads[i].state = THREAD_BOOKED;
|
threads[i].state = THREAD_BOOKED;
|
||||||
threads[i].splitPoint = splitPoint;
|
threads[i].splitPoint = splitPoint;
|
||||||
splitPoint->slaves[i] = 1;
|
splitPoint->slaves[i] = 1;
|
||||||
splitPoint->cpus++;
|
workersCnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(Fake || splitPoint->cpus > 1);
|
assert(Fake || workersCnt > 1);
|
||||||
|
|
||||||
// We can release the lock because slave threads are already booked and master is not available
|
// We can release the lock because slave threads are already booked and master is not available
|
||||||
lock_release(&MPLock);
|
lock_release(&MPLock);
|
||||||
|
@ -2684,8 +2687,7 @@ namespace {
|
||||||
// which it will instantly launch a search, because its state is
|
// which it will instantly launch a search, because its state is
|
||||||
// THREAD_WORKISWAITING. We send the split point as a second parameter to the
|
// THREAD_WORKISWAITING. We send the split point as a second parameter to the
|
||||||
// idle loop, which means that the main thread will return from the idle
|
// idle loop, which means that the main thread will return from the idle
|
||||||
// loop when all threads have finished their work at this split point
|
// loop when all threads have finished their work at this split point.
|
||||||
// (i.e. when splitPoint->cpus == 0).
|
|
||||||
idle_loop(master, splitPoint);
|
idle_loop(master, splitPoint);
|
||||||
|
|
||||||
// We have returned from the idle loop, which means that all threads are
|
// We have returned from the idle loop, which means that all threads are
|
||||||
|
|
|
@ -54,7 +54,7 @@ struct SplitPoint {
|
||||||
Depth depth;
|
Depth depth;
|
||||||
bool pvNode, mateThreat;
|
bool pvNode, mateThreat;
|
||||||
Value beta;
|
Value beta;
|
||||||
int ply, master, slaves[MAX_THREADS];
|
int ply, master;
|
||||||
SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
|
SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
|
||||||
|
|
||||||
// Const pointers to shared data
|
// Const pointers to shared data
|
||||||
|
@ -66,8 +66,8 @@ struct SplitPoint {
|
||||||
volatile Value alpha;
|
volatile Value alpha;
|
||||||
volatile Value bestValue;
|
volatile Value bestValue;
|
||||||
volatile int moves;
|
volatile int moves;
|
||||||
volatile int cpus;
|
|
||||||
volatile bool stopRequest;
|
volatile bool stopRequest;
|
||||||
|
volatile int slaves[MAX_THREADS];
|
||||||
};
|
};
|
||||||
|
|
||||||
// ThreadState type is used to represent thread's current state
|
// ThreadState type is used to represent thread's current state
|
||||||
|
|
Loading…
Add table
Reference in a new issue