From: Marco Costalba Date: Sat, 20 Feb 2010 16:52:09 +0000 (+0100) Subject: Retire per-thread stopRequest flag X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=2da290d72b4174fd36186261faba1eb8722e0ac8 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 --- diff --git a/src/search.cpp b/src/search.cpp index aea07fda..88ef5237 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -70,7 +70,6 @@ namespace { int active_threads() const { return ActiveThreads; } 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 incrementBetaCounter(Color us, Depth d, int threadID) { threads[threadID].betaCutOffs[us] += unsigned(d); } void print_current_line(SearchStack ss[], int ply, int threadID); @@ -1868,11 +1867,7 @@ namespace { if (sp->bestValue >= sp->beta) { sp_update_pv(sp->parentSstack, ss, sp->ply); - 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->stopRequest = true; } } lock_release(&(sp->lock)); @@ -1881,15 +1876,6 @@ namespace { /* 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->slaves[threadID] = 0; @@ -1997,13 +1983,7 @@ namespace { { // Ask threads to stop before to modify sp->alpha if (value >= sp->beta) - { - 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->stopRequest = true; sp->alpha = value; @@ -2018,15 +1998,6 @@ namespace { /* 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->slaves[threadID] = 0; @@ -2769,8 +2740,7 @@ namespace { // Wait for thread termination for (int i = 1; i < MAX_THREADS; i++) - while (threads[i].state != THREAD_TERMINATED) - threads[i].stopRequest = true; + while (threads[i].state != THREAD_TERMINATED); // Now we can safely destroy the locks 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 - // been asked to stop, directly or indirectly. This can happen if a beta - // cutoff has occurred in the thread's currently active split point, or in - // some ancestor of the current split point. + // thread_should_stop() checks whether the thread should stop its search. + // This can happen if a beta cutoff has occurred in the thread's currently + // active split point, or in some ancestor of the current split point. bool ThreadsManager::thread_should_stop(int threadID) const { @@ -2790,17 +2759,8 @@ namespace { SplitPoint* sp; - if (threads[threadID].stopRequest) - return true; - - if (ActiveThreads <= 2) - return false; - - for (sp = threads[threadID].splitPoint; sp != NULL; sp = sp->parent) - if (sp->finished) - return true; - - return false; + for (sp = threads[threadID].splitPoint; sp && !sp->stopRequest; sp = sp->parent); + return sp != NULL; } @@ -2903,7 +2863,7 @@ namespace { // Initialize the split point object splitPoint->parent = threads[master].splitPoint; - splitPoint->finished = false; + splitPoint->stopRequest = false; splitPoint->ply = ply; splitPoint->depth = depth; splitPoint->alpha = pvNode ? *alpha : (*beta - 1); @@ -2930,7 +2890,6 @@ namespace { if (thread_is_available(i, master)) { threads[i].state = THREAD_BOOKED; - threads[i].stopRequest = false; threads[i].splitPoint = splitPoint; splitPoint->slaves[i] = 1; splitPoint->cpus++; @@ -2970,7 +2929,6 @@ namespace { *beta = splitPoint->beta; *bestValue = splitPoint->bestValue; - threads[master].stopRequest = false; threads[master].activeSplitPoints--; threads[master].splitPoint = splitPoint->parent; @@ -3028,8 +2986,8 @@ namespace { { while (threads[i].state != THREAD_SLEEPING); - // These two flags can be in a random state - threads[i].stopRequest = threads[i].printCurrentLineRequest = false; + // This flag can be in a random state + threads[i].printCurrentLineRequest = false; } } diff --git a/src/thread.h b/src/thread.h index 556ebc59..9c5344c2 100644 --- a/src/thread.h +++ b/src/thread.h @@ -61,7 +61,7 @@ struct SplitPoint { MovePicker *mp; volatile int moves; volatile int cpus; - bool finished; + volatile bool stopRequest; }; // ThreadState type is used to represent thread's current state @@ -81,7 +81,6 @@ struct Thread { volatile int activeSplitPoints; uint64_t nodes; uint64_t betaCutOffs[2]; - volatile bool stopRequest; volatile bool printCurrentLineRequest; volatile ThreadState state; unsigned char pad[64]; // set some distance among local data for each thread