X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=6d05405b6f79c9ad002824bbafd0777b132f000b;hb=706b44a966a6ea2fe9a1a7adaf28f7964eec3115;hp=fd5378f92e751050f2217a7d877213926b9dd39c;hpb=932ae761c6e3fd3e9b202283379e487a5c187989;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index fd5378f9..6d05405b 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -611,7 +611,7 @@ namespace { // Initialize FIXME move before Rml.init() TT.new_search(); H.clear(); - memset(ss, 0, PLY_MAX_PLUS_2 * sizeof(SearchStack)); + memset(ss, 0, 4 * sizeof(SearchStack)); *ponderMove = bestMove = easyMove = MOVE_NONE; depth = aspirationDelta = 0; ss->currentMove = MOVE_NULL; // Hack to skip update_gains() @@ -801,7 +801,8 @@ namespace { bestValue = alpha; // Step 1. Initialize node and poll. Polling can abort search - ss->currentMove = ss->bestMove = threatMove = MOVE_NONE; + ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE; + (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO; (ss+2)->killers[0] = (ss+2)->killers[1] = (ss+2)->mateKiller = MOVE_NONE; if (threadID == 0 && ++NodesSincePoll > NodesBetweenPolls) @@ -1217,7 +1218,7 @@ split_point_start: // At split points actual search starts from here ss->bestMove = move; if (SpNode) - sp->parentSstack->bestMove = move; + sp->ss->bestMove = move; } } @@ -2109,16 +2110,19 @@ split_point_start: // At split points actual search starts from here threads[threadID].state = THREAD_SEARCHING; - // Here we call search() with SplitPoint template parameter set to true + // Copy SplitPoint position and search stack and call search() + // with SplitPoint template parameter set to true. + SearchStack ss[PLY_MAX_PLUS_2]; SplitPoint* tsp = threads[threadID].splitPoint; Position pos(*tsp->pos, threadID); - SearchStack* ss = tsp->sstack[threadID] + 1; - ss->sp = tsp; + + memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack)); + (ss+1)->sp = tsp; if (tsp->pvNode) - search(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); + search(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); else - search(pos, ss, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); + search(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth, tsp->ply); assert(threads[threadID].state == THREAD_SEARCHING); @@ -2363,7 +2367,7 @@ split_point_start: // At split points actual search starts from here splitPoint.moveCount = moveCount; splitPoint.pos = &pos; splitPoint.nodes = 0; - splitPoint.parentSstack = ss; + splitPoint.ss = ss; for (i = 0; i < activeThreads; i++) splitPoint.slaves[i] = 0; @@ -2390,12 +2394,10 @@ split_point_start: // At split points actual search starts from here lock_release(&mpLock); // Tell the threads that they have work to do. This will make them leave - // their idle loop. But before copy search stack tail for each thread. + // their idle loop. for (i = 0; i < activeThreads; i++) if (i == master || splitPoint.slaves[i]) { - memcpy(splitPoint.sstack[i], ss - 1, 4 * sizeof(SearchStack)); - assert(i == master || threads[i].state == THREAD_BOOKED); threads[i].state = THREAD_WORKISWAITING; // This makes the slave to exit from idle_loop()