X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=76d0350c9c7284cf2e4ec400166174f63891c7f3;hp=dcb89d75caf89733567141297faaf3594271210c;hb=b9d4e6f7fd238edffd91ebbf4b944cddcd65a955;hpb=dccaa145d2b57999aa3e368c7c9203731b4e9685 diff --git a/src/search.cpp b/src/search.cpp index dcb89d75..76d0350c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1588,59 +1588,59 @@ 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; + Thread* bestThread = NULL; + 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; + assert(this != Threads[i]); + assert(!(this_sp && this_sp->slavesMask.none())); + + // 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 = Threads[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(bestThread)) + { + sp->slavesMask.set(idx); + sp->slavesCount++; + activeSplitPoint = sp; + searching = true; } + + sp->mutex.unlock(); + Threads.mutex.unlock(); } }