X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=1062c9203a7bbc0c31c0b134e1d1f882d95f4a76;hp=dcb89d75caf89733567141297faaf3594271210c;hb=4f906a25897467ba8fc7c31aa634cefc1ec0dba9;hpb=dccaa145d2b57999aa3e368c7c9203731b4e9685 diff --git a/src/search.cpp b/src/search.cpp index dcb89d75..1062c920 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1588,59 +1588,56 @@ void Thread::idle_loop() { // Try to late join to another split point if none of its slaves has // already finished. - if (Threads.size() > 2) + SplitPoint* bestSp = NULL; + int bestThread = 0; + int bestScore = INT_MAX; + + for (size_t i = 0; i < Threads.size(); ++i) { - SplitPoint *bestSp = NULL; - int bestThread = 0; - int bestScore = INT_MAX; + const int size = Threads[i]->splitPointsSize; // Local copy + sp = size ? &Threads[i]->splitPoints[size - 1] : NULL; - for (size_t i = 0; i < Threads.size(); ++i) + if ( sp + && sp->allSlavesSearching + && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT + && available_to(Threads[i])) { - const int size = Threads[i]->splitPointsSize; // Local copy - sp = size ? &Threads[i]->splitPoints[size - 1] : NULL; + // Compute the recursive split points chain size + int level = -1; + for (SplitPoint* spp = Threads[i]->activeSplitPoint; spp; spp = spp->parentSplitPoint) + level++; + + int score = level * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1; - if ( sp - && sp->allSlavesSearching - && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT - && available_to(Threads[i])) + if (score < bestScore) { - // Compute the recursive split points chain size - int level = -1; - for (SplitPoint* spp = Threads[i]->activeSplitPoint; spp; spp = spp->parentSplitPoint) - level++; - - int score = level * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1; - - if (score < bestScore) - { - bestSp = sp; - bestThread = i; - bestScore = score; - } + bestSp = sp; + bestThread = i; + bestScore = score; } } + } - if (bestSp) - { - sp = bestSp; - - // Recheck the conditions under lock protection - Threads.mutex.lock(); - sp->mutex.lock(); + if (bestSp) + { + sp = bestSp; - if ( sp->allSlavesSearching - && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT - && available_to(Threads[bestThread])) - { - sp->slavesMask.set(idx); - sp->slavesCount++; - activeSplitPoint = sp; - searching = true; - } + // Recheck the conditions under lock protection + Threads.mutex.lock(); + sp->mutex.lock(); - sp->mutex.unlock(); - Threads.mutex.unlock(); + if ( sp->allSlavesSearching + && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT + && available_to(Threads[bestThread])) + { + sp->slavesMask.set(idx); + sp->slavesCount++; + activeSplitPoint = sp; + searching = true; } + + sp->mutex.unlock(); + Threads.mutex.unlock(); } }