X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=f374b462f8a0169be2a28399cb313975b653af56;hp=a6f4d6bdd462d13a2472b8abd444f9b17881c554;hb=13c11f40480ec97316bd4da3a53787cc871037ea;hpb=0b36ba74fc0a80388cac43a35962ffc73c01b071 diff --git a/src/search.cpp b/src/search.cpp index a6f4d6bd..f374b462 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -95,6 +95,7 @@ namespace { double BestMoveChanges; Value DrawValue[COLOR_NB]; HistoryStats History; + CounterMovesHistoryStats CounterMovesHistory; GainsStats Gains; MovesStats Countermoves, Followupmoves; @@ -289,6 +290,7 @@ namespace { TT.new_search(); History.clear(); + CounterMovesHistory.clear(); Gains.clear(); Countermoves.clear(); Followupmoves.clear(); @@ -687,7 +689,7 @@ namespace { assert((ss-1)->currentMove != MOVE_NONE); assert((ss-1)->currentMove != MOVE_NULL); - MovePicker mp(pos, ttMove, History, pos.captured_piece_type()); + MovePicker mp(pos, ttMove, History, CounterMovesHistory, pos.captured_piece_type()); CheckInfo ci(pos); while ((move = mp.next_move()) != MOVE_NONE) @@ -726,7 +728,7 @@ moves_loop: // When in check and at SpNode search starts from here Move followupmoves[] = { Followupmoves[pos.piece_on(prevOwnMoveSq)][prevOwnMoveSq].first, Followupmoves[pos.piece_on(prevOwnMoveSq)][prevOwnMoveSq].second }; - MovePicker mp(pos, ttMove, depth, History, countermoves, followupmoves, ss); + MovePicker mp(pos, ttMove, depth, History, CounterMovesHistory, countermoves, followupmoves, ss); CheckInfo ci(pos); value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc improving = ss->staticEval >= (ss-2)->staticEval @@ -765,7 +767,7 @@ moves_loop: // When in check and at SpNode search starts from here continue; moveCount = ++splitPoint->moveCount; - splitPoint->spinlock.release(); + splitPoint->mutex.unlock(); } else ++moveCount; @@ -834,7 +836,7 @@ moves_loop: // When in check and at SpNode search starts from here && moveCount >= FutilityMoveCounts[improving][depth]) { if (SpNode) - splitPoint->spinlock.acquire(); + splitPoint->mutex.lock(); continue; } @@ -853,7 +855,7 @@ moves_loop: // When in check and at SpNode search starts from here if (SpNode) { - splitPoint->spinlock.acquire(); + splitPoint->mutex.lock(); if (bestValue > splitPoint->bestValue) splitPoint->bestValue = bestValue; } @@ -865,7 +867,7 @@ moves_loop: // When in check and at SpNode search starts from here if (predictedDepth < 4 * ONE_PLY && pos.see_sign(move) < VALUE_ZERO) { if (SpNode) - splitPoint->spinlock.acquire(); + splitPoint->mutex.lock(); continue; } @@ -965,7 +967,7 @@ moves_loop: // When in check and at SpNode search starts from here // Step 18. Check for new best move if (SpNode) { - splitPoint->spinlock.acquire(); + splitPoint->mutex.lock(); bestValue = splitPoint->bestValue; alpha = splitPoint->alpha; } @@ -1192,7 +1194,7 @@ moves_loop: // When in check and at SpNode search starts from here // to search the moves. Because the depth is <= 0 here, only captures, // queen promotions and checks (only if depth >= DEPTH_QS_CHECKS) will // be generated. - MovePicker mp(pos, ttMove, depth, History, to_sq((ss-1)->currentMove)); + MovePicker mp(pos, ttMove, depth, History, CounterMovesHistory, to_sq((ss-1)->currentMove)); CheckInfo ci(pos); // Loop through the moves until no moves remain or a beta cutoff occurs @@ -1356,7 +1358,16 @@ moves_loop: // When in check and at SpNode search starts from here if (is_ok((ss-1)->currentMove)) { Square prevMoveSq = to_sq((ss-1)->currentMove); - Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, move); + Piece prevMovePiece = pos.piece_on(prevMoveSq); + Countermoves.update(prevMovePiece, prevMoveSq, move); + + HistoryStats& cmh = CounterMovesHistory[prevMovePiece][prevMoveSq]; + cmh.update(pos.moved_piece(move), to_sq(move), bonus); + for (int i = 0; i < quietsCnt; ++i) + { + Move m = quiets[i]; + cmh.update(pos.moved_piece(m), to_sq(m), -bonus); + } } if (is_ok((ss-2)->currentMove) && (ss-1)->currentMove == (ss-1)->ttMove) @@ -1526,13 +1537,12 @@ void Thread::idle_loop() { // If this thread has been assigned work, launch a search while (searching) { - Threads.spinlock.acquire(); + mutex.lock(); assert(activeSplitPoint); - SplitPoint* sp = activeSplitPoint; - Threads.spinlock.release(); + mutex.unlock(); Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2) Position pos(*sp->pos, this); @@ -1540,7 +1550,7 @@ void Thread::idle_loop() { std::memcpy(ss-2, sp->ss-2, 5 * sizeof(Stack)); ss->splitPoint = sp; - sp->spinlock.acquire(); + sp->mutex.lock(); assert(activePosition == nullptr); @@ -1578,7 +1588,7 @@ void Thread::idle_loop() { // After releasing the lock we can't access any SplitPoint related data // in a safe way because it could have been released under our feet by // the sp master. - sp->spinlock.release(); + sp->mutex.unlock(); // Try to late join to another split point if none of its slaves has // already finished. @@ -1593,7 +1603,7 @@ void Thread::idle_loop() { if ( sp && sp->allSlavesSearching && sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT - && available_to(sp->master)) + && can_join(sp)) { assert(this != th); assert(!(this_sp && this_sp->slavesMask.none())); @@ -1618,25 +1628,29 @@ void Thread::idle_loop() { sp = bestSp; // Recheck the conditions under lock protection - Threads.spinlock.acquire(); - sp->spinlock.acquire(); + sp->mutex.lock(); if ( sp->allSlavesSearching - && sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT - && available_to(sp->master)) + && sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT) { - sp->slavesMask.set(idx); - activeSplitPoint = sp; - searching = true; + mutex.lock(); + + if (can_join(sp)) + { + sp->slavesMask.set(idx); + activeSplitPoint = sp; + searching = true; + } + + mutex.unlock(); } - sp->spinlock.release(); - Threads.spinlock.release(); + sp->mutex.unlock(); } } // Avoid races with notify_one() fired from last slave of the split point - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); // If we are master and all slaves have finished then exit idle_loop if (this_sp && this_sp->slavesMask.none()) @@ -1687,18 +1701,17 @@ void check_time() { else if (Limits.nodes) { - Threads.spinlock.acquire(); - int64_t nodes = RootPos.nodes_searched(); // Loop across all split points and sum accumulated SplitPoint nodes plus // all the currently active positions nodes. + // FIXME: Racy... for (Thread* th : Threads) for (size_t i = 0; i < th->splitPointsSize; ++i) { SplitPoint& sp = th->splitPoints[i]; - sp.spinlock.acquire(); + sp.mutex.lock(); nodes += sp.nodes; @@ -1706,11 +1719,9 @@ void check_time() { if (sp.slavesMask.test(idx) && Threads[idx]->activePosition) nodes += Threads[idx]->activePosition->nodes_searched(); - sp.spinlock.release(); + sp.mutex.unlock(); } - Threads.spinlock.release(); - if (nodes >= Limits.nodes) Signals.stop = true; }