mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Retire per-thread stopRequest flag
This is a per split-point request, not per-thread. When we find a beta cut-off in current thread's split point or in or in some ancestor of the current split point then threads should stop immediately the search and return to idle_loop(). The check is done by thread_should_stop() that now looks only at split point's chain. No functional change and a good semplification. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
b39a24ecca
commit
2da290d72b
2 changed files with 12 additions and 55 deletions
|
@ -70,7 +70,6 @@ namespace {
|
||||||
|
|
||||||
int active_threads() const { return ActiveThreads; }
|
int active_threads() const { return ActiveThreads; }
|
||||||
void set_active_threads(int newActiveThreads) { ActiveThreads = newActiveThreads; }
|
void set_active_threads(int newActiveThreads) { ActiveThreads = newActiveThreads; }
|
||||||
void set_stop_request(int threadID) { threads[threadID].stopRequest = true; }
|
|
||||||
void incrementNodeCounter(int threadID) { threads[threadID].nodes++; }
|
void incrementNodeCounter(int threadID) { threads[threadID].nodes++; }
|
||||||
void incrementBetaCounter(Color us, Depth d, int threadID) { threads[threadID].betaCutOffs[us] += unsigned(d); }
|
void incrementBetaCounter(Color us, Depth d, int threadID) { threads[threadID].betaCutOffs[us] += unsigned(d); }
|
||||||
void print_current_line(SearchStack ss[], int ply, int threadID);
|
void print_current_line(SearchStack ss[], int ply, int threadID);
|
||||||
|
@ -1868,11 +1867,7 @@ namespace {
|
||||||
if (sp->bestValue >= sp->beta)
|
if (sp->bestValue >= sp->beta)
|
||||||
{
|
{
|
||||||
sp_update_pv(sp->parentSstack, ss, sp->ply);
|
sp_update_pv(sp->parentSstack, ss, sp->ply);
|
||||||
for (int i = 0; i < TM.active_threads(); i++)
|
sp->stopRequest = true;
|
||||||
if (i != threadID && (i == sp->master || sp->slaves[i]))
|
|
||||||
TM.set_stop_request(i);
|
|
||||||
|
|
||||||
sp->finished = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lock_release(&(sp->lock));
|
lock_release(&(sp->lock));
|
||||||
|
@ -1881,15 +1876,6 @@ namespace {
|
||||||
|
|
||||||
/* Here we have the lock still grabbed */
|
/* Here we have the lock still grabbed */
|
||||||
|
|
||||||
// If this is the master thread and we have been asked to stop because of
|
|
||||||
// a beta cutoff higher up in the tree, stop all slave threads. Note that
|
|
||||||
// thread_should_stop(threadID) does not imply that 'stop' flag is set, so
|
|
||||||
// do this explicitly now, under lock protection.
|
|
||||||
if (sp->master == threadID && TM.thread_should_stop(threadID))
|
|
||||||
for (int i = 0; i < TM.active_threads(); i++)
|
|
||||||
if (sp->slaves[i] || i == threadID)
|
|
||||||
TM.set_stop_request(i);
|
|
||||||
|
|
||||||
sp->cpus--;
|
sp->cpus--;
|
||||||
sp->slaves[threadID] = 0;
|
sp->slaves[threadID] = 0;
|
||||||
|
|
||||||
|
@ -1997,13 +1983,7 @@ namespace {
|
||||||
{
|
{
|
||||||
// Ask threads to stop before to modify sp->alpha
|
// Ask threads to stop before to modify sp->alpha
|
||||||
if (value >= sp->beta)
|
if (value >= sp->beta)
|
||||||
{
|
sp->stopRequest = true;
|
||||||
for (int i = 0; i < TM.active_threads(); i++)
|
|
||||||
if (i != threadID && (i == sp->master || sp->slaves[i]))
|
|
||||||
TM.set_stop_request(i);
|
|
||||||
|
|
||||||
sp->finished = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp->alpha = value;
|
sp->alpha = value;
|
||||||
|
|
||||||
|
@ -2018,15 +1998,6 @@ namespace {
|
||||||
|
|
||||||
/* Here we have the lock still grabbed */
|
/* Here we have the lock still grabbed */
|
||||||
|
|
||||||
// If this is the master thread and we have been asked to stop because of
|
|
||||||
// a beta cutoff higher up in the tree, stop all slave threads. Note that
|
|
||||||
// thread_should_stop(threadID) does not imply that 'stop' flag is set, so
|
|
||||||
// do this explicitly now, under lock protection.
|
|
||||||
if (sp->master == threadID && TM.thread_should_stop(threadID))
|
|
||||||
for (int i = 0; i < TM.active_threads(); i++)
|
|
||||||
if (sp->slaves[i] || i == threadID)
|
|
||||||
TM.set_stop_request(i);
|
|
||||||
|
|
||||||
sp->cpus--;
|
sp->cpus--;
|
||||||
sp->slaves[threadID] = 0;
|
sp->slaves[threadID] = 0;
|
||||||
|
|
||||||
|
@ -2769,8 +2740,7 @@ namespace {
|
||||||
|
|
||||||
// Wait for thread termination
|
// Wait for thread termination
|
||||||
for (int i = 1; i < MAX_THREADS; i++)
|
for (int i = 1; i < MAX_THREADS; i++)
|
||||||
while (threads[i].state != THREAD_TERMINATED)
|
while (threads[i].state != THREAD_TERMINATED);
|
||||||
threads[i].stopRequest = true;
|
|
||||||
|
|
||||||
// Now we can safely destroy the locks
|
// Now we can safely destroy the locks
|
||||||
for (int i = 0; i < MAX_THREADS; i++)
|
for (int i = 0; i < MAX_THREADS; i++)
|
||||||
|
@ -2779,10 +2749,9 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// thread_should_stop() checks whether the thread with a given threadID has
|
// thread_should_stop() checks whether the thread should stop its search.
|
||||||
// been asked to stop, directly or indirectly. This can happen if a beta
|
// This can happen if a beta cutoff has occurred in the thread's currently
|
||||||
// cutoff has occurred in the thread's currently active split point, or in
|
// active split point, or in some ancestor of the current split point.
|
||||||
// some ancestor of the current split point.
|
|
||||||
|
|
||||||
bool ThreadsManager::thread_should_stop(int threadID) const {
|
bool ThreadsManager::thread_should_stop(int threadID) const {
|
||||||
|
|
||||||
|
@ -2790,17 +2759,8 @@ namespace {
|
||||||
|
|
||||||
SplitPoint* sp;
|
SplitPoint* sp;
|
||||||
|
|
||||||
if (threads[threadID].stopRequest)
|
for (sp = threads[threadID].splitPoint; sp && !sp->stopRequest; sp = sp->parent);
|
||||||
return true;
|
return sp != NULL;
|
||||||
|
|
||||||
if (ActiveThreads <= 2)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (sp = threads[threadID].splitPoint; sp != NULL; sp = sp->parent)
|
|
||||||
if (sp->finished)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2903,7 +2863,7 @@ namespace {
|
||||||
|
|
||||||
// Initialize the split point object
|
// Initialize the split point object
|
||||||
splitPoint->parent = threads[master].splitPoint;
|
splitPoint->parent = threads[master].splitPoint;
|
||||||
splitPoint->finished = false;
|
splitPoint->stopRequest = false;
|
||||||
splitPoint->ply = ply;
|
splitPoint->ply = ply;
|
||||||
splitPoint->depth = depth;
|
splitPoint->depth = depth;
|
||||||
splitPoint->alpha = pvNode ? *alpha : (*beta - 1);
|
splitPoint->alpha = pvNode ? *alpha : (*beta - 1);
|
||||||
|
@ -2930,7 +2890,6 @@ namespace {
|
||||||
if (thread_is_available(i, master))
|
if (thread_is_available(i, master))
|
||||||
{
|
{
|
||||||
threads[i].state = THREAD_BOOKED;
|
threads[i].state = THREAD_BOOKED;
|
||||||
threads[i].stopRequest = false;
|
|
||||||
threads[i].splitPoint = splitPoint;
|
threads[i].splitPoint = splitPoint;
|
||||||
splitPoint->slaves[i] = 1;
|
splitPoint->slaves[i] = 1;
|
||||||
splitPoint->cpus++;
|
splitPoint->cpus++;
|
||||||
|
@ -2970,7 +2929,6 @@ namespace {
|
||||||
|
|
||||||
*beta = splitPoint->beta;
|
*beta = splitPoint->beta;
|
||||||
*bestValue = splitPoint->bestValue;
|
*bestValue = splitPoint->bestValue;
|
||||||
threads[master].stopRequest = false;
|
|
||||||
threads[master].activeSplitPoints--;
|
threads[master].activeSplitPoints--;
|
||||||
threads[master].splitPoint = splitPoint->parent;
|
threads[master].splitPoint = splitPoint->parent;
|
||||||
|
|
||||||
|
@ -3028,8 +2986,8 @@ namespace {
|
||||||
{
|
{
|
||||||
while (threads[i].state != THREAD_SLEEPING);
|
while (threads[i].state != THREAD_SLEEPING);
|
||||||
|
|
||||||
// These two flags can be in a random state
|
// This flag can be in a random state
|
||||||
threads[i].stopRequest = threads[i].printCurrentLineRequest = false;
|
threads[i].printCurrentLineRequest = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct SplitPoint {
|
||||||
MovePicker *mp;
|
MovePicker *mp;
|
||||||
volatile int moves;
|
volatile int moves;
|
||||||
volatile int cpus;
|
volatile int cpus;
|
||||||
bool finished;
|
volatile bool stopRequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ThreadState type is used to represent thread's current state
|
// ThreadState type is used to represent thread's current state
|
||||||
|
@ -81,7 +81,6 @@ struct Thread {
|
||||||
volatile int activeSplitPoints;
|
volatile int activeSplitPoints;
|
||||||
uint64_t nodes;
|
uint64_t nodes;
|
||||||
uint64_t betaCutOffs[2];
|
uint64_t betaCutOffs[2];
|
||||||
volatile bool stopRequest;
|
|
||||||
volatile bool printCurrentLineRequest;
|
volatile bool printCurrentLineRequest;
|
||||||
volatile ThreadState state;
|
volatile ThreadState state;
|
||||||
unsigned char pad[64]; // set some distance among local data for each thread
|
unsigned char pad[64]; // set some distance among local data for each thread
|
||||||
|
|
Loading…
Add table
Reference in a new issue