mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-18 08:07:08 +08:00
Active Reparenting
In Young Brothers Wait Concept (YBWC) available slaves are booked by the split point master, then start to search below the assigned split point and, once finished, return in idle state waiting to be booked by another master. This patch introduces "Active Reparenting" so that when a slave finishes its job on the assigned split point, instead of passively waiting to be booked, searches a suitable active split point and reprents itselfs to that split point. Then immediately starts to search below the split point in exactly the same way of the others split point's slaves. This reduces to zero the time waiting in idle loop and should increase scalability especially whit many (8 or more) cores. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
@@ -319,6 +319,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
sp->master = master;
|
||||
sp->cutoff = false;
|
||||
sp->slavesMask = 1ULL << master->idx;
|
||||
sp->allSlavesMask = 1ULL << master->idx;
|
||||
sp->depth = depth;
|
||||
sp->bestMove = *bestMove;
|
||||
sp->threatMove = threatMove;
|
||||
@@ -347,6 +348,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
if (threads[i]->is_available_to(master))
|
||||
{
|
||||
sp->slavesMask |= 1ULL << i;
|
||||
sp->allSlavesMask |= 1ULL << i;
|
||||
threads[i]->curSplitPoint = sp;
|
||||
threads[i]->is_searching = true; // Slave leaves idle_loop()
|
||||
|
||||
@@ -354,7 +356,10 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
threads[i]->wake_up();
|
||||
|
||||
if (++slavesCnt + 1 >= maxThreadsPerSplitPoint) // Master is always included
|
||||
{
|
||||
sp->allSlavesMask = 0; // Disable reparenting to this split point
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lock_release(splitLock);
|
||||
|
||||
Reference in New Issue
Block a user