X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=dd3030a0dd4f1390b0ef8b1043ff70bfa73afb19;hb=c645aca199ac7db2ffcfc229b3cda8dafa6fb835;hp=1d06dbd05748d75073647c544a603171e1b5a89b;hpb=4a310baae2416055167a137e972a1160e236195a;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 1d06dbd0..dd3030a0 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1859,6 +1859,45 @@ void Thread::idle_loop(SplitPoint* sp_master) { // our feet by the sp master. Also accessing other Thread objects is // unsafe because if we are exiting there is a chance are already freed. lock_release(sp->lock); + + // Try to reparent to another split point. Only for slave threads + // that are not master of any active split point. + if (!splitPointsCnt) + for (int i = 0; i < Threads.size(); i++) + { + Thread* th = &Threads[i]; + SplitPoint* oldest = &th->splitPoints[0]; + + // Find the first split point with still all slaves running + // where we are available as a possible slave. + if ( !is_searching + && th->splitPointsCnt + && !oldest->cutoff + && oldest->slavesMask == oldest->allSlavesMask + && !single_bit(oldest->allSlavesMask)) + { + lock_grab(oldest->lock); + lock_grab(Threads.splitLock); + + // Retest all under lock protection, we are in the middle + // of a race storm here ! + if ( !is_searching + && th->splitPointsCnt + && !oldest->cutoff + && oldest->slavesMask == oldest->allSlavesMask + && !single_bit(oldest->allSlavesMask)) + { + oldest->slavesMask |= 1ULL << idx; // allSlavesMask is not updated + curSplitPoint = oldest; + is_searching = true; + } + + lock_release(Threads.splitLock); + lock_release(oldest->lock); + + break; // Exit anyhow, only one try (enough in 99% of cases) + } + } } } }