X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=76d0350c9c7284cf2e4ec400166174f63891c7f3;hp=29820a1f45ac884a6c77edeb5abaa46b0677dd4d;hb=b9d4e6f7fd238edffd91ebbf4b944cddcd65a955;hpb=d65f75c1532536f11a2dfbc0263c55e1beb88c2b diff --git a/src/search.cpp b/src/search.cpp index 29820a1f..76d0350c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1588,54 +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) { - int score = sp->spLevel * 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 ( sp->allSlavesSearching - && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT - && available_to(Threads[bestThread])) - { - sp->slavesMask.set(idx); - sp->slavesCount++; - activeSplitPoint = sp; - searching = true; - } + if (bestSp) + { + sp = bestSp; + + // 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(); } }