1
0
Fork 0
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:
Marco Costalba 2010-02-20 17:52:09 +01:00
parent b39a24ecca
commit 2da290d72b
2 changed files with 12 additions and 55 deletions

View file

@ -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;
} }
} }

View file

@ -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