X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=21d5d786b6ba8be9e558bca2ffb18dfd78c951f1;hp=ad3898c14af9cbe3faf7727ddb4146661691e0b8;hb=ce159b16b9483f83b9e96ac6bf3d6e2ba7e5619c;hpb=44432f67d724573d0f6e3cfea6165c9b1d125d72 diff --git a/src/search.cpp b/src/search.cpp index ad3898c1..21d5d786 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1337,7 +1337,7 @@ split_point_start: // At split points actual search starts from here // Rule 1. Checks which give opponent's king at most one escape square are dangerous b = kingAtt & ~pos.pieces(them) & ~newAtt & ~(1ULL << to); - if (single_bit(b)) // Catches also !b + if (!more_than_one(b)) return true; // Rule 2. Queen contact check is very dangerous @@ -1386,7 +1386,7 @@ split_point_start: // At split points actual search starts from here // Case 3: Moving through the vacated square p2 = pos.piece_on(f2); - if (piece_is_slider(p2) && (squares_between(f2, t2) & f1)) + if (piece_is_slider(p2) && (between_bb(f2, t2) & f1)) return true; // Case 4: The destination square for m2 is defended by the moving piece in m1 @@ -1397,7 +1397,7 @@ split_point_start: // At split points actual search starts from here // Case 5: Discovered check, checking piece is the piece moved in m1 ksq = pos.king_square(pos.side_to_move()); if ( piece_is_slider(p1) - && (squares_between(t1, ksq) & f2) + && (between_bb(t1, ksq) & f2) && (pos.attacks_from(p1, t1, pos.pieces() ^ f2) & ksq)) return true; @@ -1469,7 +1469,7 @@ split_point_start: // At split points actual search starts from here // Case 3: If the moving piece in the threatened move is a slider, don't // prune safe moves which block its ray. if ( piece_is_slider(pos.piece_on(tfrom)) - && (squares_between(tfrom, tto) & mto) + && (between_bb(tfrom, tto) & mto) && pos.see_sign(m) >= 0) return true; @@ -1844,6 +1844,7 @@ void Thread::idle_loop(SplitPoint* sp_master) { assert(is_searching); is_searching = false; + sp->allSlavesRunning = false; sp->slavesMask &= ~(1ULL << idx); sp->nodes += pos.nodes_searched(); @@ -1860,46 +1861,40 @@ void Thread::idle_loop(SplitPoint* sp_master) { // 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 ( !sp_master - && !is_searching - && !do_sleep - && !do_exit - && !splitPointsCnt - && Threads.size() > 2) + // Try to reparent to the first split point, with still all slaves + // running, where we are available as a possible slave. + for (int i = 0; i < Threads.size(); i++) { - for (int i = 0; i < Threads.size(); i++) + Thread* th = &Threads[i]; + int spCnt = th->splitPointsCnt; + SplitPoint* latest = &th->splitPoints[spCnt ? spCnt - 1 : 0]; + + if ( this->is_available_to(th) + && spCnt > 0 + && !th->cutoff_occurred() + && latest->allSlavesRunning + && more_than_one(latest->slavesMask)) { - SplitPoint* oldest = &Threads[i].splitPoints[0]; - - // Find the first oldest split point with still all slaves running - if ( Threads[i].splitPointsCnt - && oldest->slavesMask == oldest->allSlavesMask - && !single_bit(oldest->allSlavesMask)) + lock_grab(latest->lock); + lock_grab(Threads.splitLock); + + // Retest all under lock protection, we are in the middle + // of a race storm here ! + if ( this->is_available_to(th) + && spCnt == th->splitPointsCnt + && !th->cutoff_occurred() + && latest->allSlavesRunning + && more_than_one(latest->slavesMask)) { - lock_grab(oldest->lock); - lock_grab(Threads.splitLock); // Needed by is_searching - - // Retest all under lock protection, we are in the middle - // of a race storm ! - if ( !is_searching - && !do_sleep - && !do_exit - && Threads[i].splitPointsCnt - && 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) + latest->slavesMask |= 1ULL << idx; + curSplitPoint = latest; + is_searching = true; } + + lock_release(Threads.splitLock); + lock_release(latest->lock); + + break; // Exit anyhow, only one try (enough in 99% of cases) } } }