1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Allow split point master to sleep

Let to sleep even split point master, it will be waken up
by its slaves when they return from the search.

With this patch we get maximum HT speedup

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-10-21 07:46:38 +01:00
parent c81bf3743f
commit 96e589646d
2 changed files with 25 additions and 15 deletions

View file

@ -2212,6 +2212,9 @@ split_point_start: // At split points actual search starts from here
assert(threadID >= 0 && threadID < MAX_THREADS); assert(threadID >= 0 && threadID < MAX_THREADS);
int i;
bool allFinished = false;
while (true) while (true)
{ {
// Slave threads can exit as soon as AllThreadsShouldExit raises, // Slave threads can exit as soon as AllThreadsShouldExit raises,
@ -2227,23 +2230,23 @@ split_point_start: // At split points actual search starts from here
// instead of wasting CPU time polling for work. // instead of wasting CPU time polling for work.
while ( threadID >= ActiveThreads while ( threadID >= ActiveThreads
|| threads[threadID].state == THREAD_INITIALIZING || threads[threadID].state == THREAD_INITIALIZING
|| (!sp && threads[threadID].state == THREAD_AVAILABLE)) || threads[threadID].state == THREAD_AVAILABLE)
{ {
assert(!sp);
assert(threadID != 0);
if (AllThreadsShouldExit)
break;
lock_grab(&MPLock); lock_grab(&MPLock);
// Retest condition under lock protection // Test with lock held to avoid races with wake_sleeping_thread()
if (!( threadID >= ActiveThreads for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {}
allFinished = (i == ActiveThreads);
// Retest sleep conditions under lock protection
if ( AllThreadsShouldExit
|| allFinished
|| !( threadID >= ActiveThreads
|| threads[threadID].state == THREAD_INITIALIZING || threads[threadID].state == THREAD_INITIALIZING
|| (!sp && threads[threadID].state == THREAD_AVAILABLE))) || threads[threadID].state == THREAD_AVAILABLE))
{ {
lock_release(&MPLock); lock_release(&MPLock);
continue; break;
} }
// Put thread to sleep // Put thread to sleep
@ -2273,14 +2276,19 @@ split_point_start: // At split points actual search starts from here
assert(threads[threadID].state == THREAD_SEARCHING); assert(threads[threadID].state == THREAD_SEARCHING);
threads[threadID].state = THREAD_AVAILABLE; threads[threadID].state = THREAD_AVAILABLE;
// Wake up master thread so to allow it to return from the idle loop in
// case we are the last slave of the split point.
if (threadID != tsp->master && threads[tsp->master].state == THREAD_AVAILABLE)
wake_sleeping_thread(tsp->master);
} }
// If this thread is the master of a split point and all slaves 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.
int i = 0; for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {}
for ( ; sp && i < ActiveThreads && !sp->slaves[i]; i++) {} allFinished = (i == ActiveThreads);
if (i == ActiveThreads) if (allFinished)
{ {
// Because sp->slaves[] is reset under lock protection, // Because sp->slaves[] is reset under lock protection,
// be sure sp->lock has been released before to return. // be sure sp->lock has been released before to return.
@ -2487,6 +2495,7 @@ split_point_start: // At split points actual search starts from here
// Initialize the split point object // Initialize the split point object
splitPoint.parent = masterThread.splitPoint; splitPoint.parent = masterThread.splitPoint;
splitPoint.master = master;
splitPoint.stopRequest = false; splitPoint.stopRequest = false;
splitPoint.ply = ply; splitPoint.ply = ply;
splitPoint.depth = depth; splitPoint.depth = depth;

View file

@ -55,6 +55,7 @@ struct SplitPoint {
bool pvNode, mateThreat; bool pvNode, mateThreat;
Value beta; Value beta;
int ply; int ply;
int master;
Move threatMove; Move threatMove;
SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2]; SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];