X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=d06ca8f3bfd98ed3f4755ad0e0571836ba502b15;hp=0dccf934e82c2f823ed0f1b013589daf2ac6384a;hb=9a542d96981e6cb45b6b01f17258a078cf27da36;hpb=13bc6ba2c69f326017dcc771d1e45a096e23e0c4 diff --git a/src/search.cpp b/src/search.cpp index 0dccf934..d06ca8f3 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -560,7 +560,8 @@ namespace { // Start with a small aspiration window and, in case of fail high/low, // research with bigger window until not failing high/low anymore. do { - // Search starting from ss+1 to allow calling update_gains() + // Search starting from ss+1 to allow referencing (ss-1). This is + // needed by update_gains() and ss copy when splitting at Root. value = search(pos, ss+1, alpha, beta, depth * ONE_PLY); // It is critical that sorting is done with a stable algorithm @@ -1170,17 +1171,12 @@ split_point_start: // At split points actual search starts from here alpha = sp->alpha; } - - if (RootNode) + // Finished searching the move. If StopRequest is true, the search + // was aborted because the user interrupted the search or because we + // ran out of time. In this case, the return value of the search cannot + // be trusted, and we don't update the best move and/or PV. + if (RootNode && !StopRequest) { - // Finished searching the move. If StopRequest is true, the search - // was aborted because the user interrupted the search or because we - // ran out of time. In this case, the return value of the search cannot - // be trusted, and we break out of the loop without updating the best - // move and/or PV. - if (StopRequest) - break; - // Remember searched nodes counts for this move RootMove* rm = Rml.find(move); rm->nodes += pos.nodes_searched() - nodes; @@ -1226,15 +1222,14 @@ split_point_start: // At split points actual search starts from here } // Step 19. Check for split - if ( !RootNode - && !SpNode + if ( !SpNode && depth >= Threads.min_split_depth() && bestValue < beta && Threads.available_slave_exists(pos.thread()) && !StopRequest && !thread.cutoff_occurred()) Threads.split(pos, ss, &alpha, beta, &bestValue, depth, - threatMove, moveCount, &mp, PvNode); + threatMove, moveCount, &mp, NT); } // Step 20. Check for mate and stalemate @@ -2210,10 +2205,14 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack)); (ss+1)->sp = tsp; - if (tsp->pvNode) + if (tsp->nodeType == Root) + search(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth); + else if (tsp->nodeType == PV) search(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth); - else + else if (tsp->nodeType == NonPV) search(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth); + else + assert(false); assert(threads[threadID].state == Thread::SEARCHING); @@ -2242,8 +2241,6 @@ void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) { // In helpful master concept a master can help only a sub-tree, and // because here is all finished is not possible master is booked. assert(threads[threadID].state == Thread::AVAILABLE); - - threads[threadID].state = Thread::SEARCHING; return; } }