From 8d47caa16ec9d2efad44f2638ce7d7637216d281 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 19 Feb 2015 10:27:24 +0100 Subject: [PATCH] Retire redundant sp->slavesCount field It should be used slavesMask.count() instead. Verified 100% equivalent when sp->allSlavesSearching: dbg_hit_on(sp->allSlavesSearching, sp->slavesCount != sp->slavesMask.count()); No functional change. --- src/search.cpp | 11 +++++------ src/thread.cpp | 4 +--- src/thread.h | 3 +-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 76d0350c..a0476653 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1043,8 +1043,8 @@ moves_loop: // When in check and at SpNode search starts from here && depth >= Threads.minimumSplitDepth && ( !thisThread->activeSplitPoint || !thisThread->activeSplitPoint->allSlavesSearching - || ( int(Threads.size()) > MAX_SLAVES_PER_SPLITPOINT - && thisThread->activeSplitPoint->slavesCount == MAX_SLAVES_PER_SPLITPOINT)) + || ( Threads.size() > MAX_SLAVES_PER_SPLITPOINT + && thisThread->activeSplitPoint->slavesMask.count() == MAX_SLAVES_PER_SPLITPOINT)) && thisThread->splitPointsSize < MAX_SPLITPOINTS_PER_THREAD) { assert(bestValue > -VALUE_INFINITE && bestValue < beta); @@ -1599,7 +1599,7 @@ void Thread::idle_loop() { if ( sp && sp->allSlavesSearching - && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT + && sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT && available_to(Threads[i])) { assert(this != Threads[i]); @@ -1610,7 +1610,7 @@ void Thread::idle_loop() { for (SplitPoint* spp = Threads[i]->activeSplitPoint; spp; spp = spp->parentSplitPoint) level++; - int score = level * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1; + int score = level * 256 * 256 + (int)sp->slavesMask.count() * 256 - sp->depth * 1; if (score < bestScore) { @@ -1630,11 +1630,10 @@ void Thread::idle_loop() { sp->mutex.lock(); if ( sp->allSlavesSearching - && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT + && sp->slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT && available_to(bestThread)) { sp->slavesMask.set(idx); - sp->slavesCount++; activeSplitPoint = sp; searching = true; } diff --git a/src/thread.cpp b/src/thread.cpp index 5c013c6a..8be7b721 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -155,7 +155,6 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes sp.masterThread = this; sp.parentSplitPoint = activeSplitPoint; sp.slavesMask = 0, sp.slavesMask.set(idx); - sp.slavesCount = 1; sp.depth = depth; sp.bestValue = *bestValue; sp.bestMove = *bestMove; @@ -183,11 +182,10 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes Thread* slave; - while ( sp.slavesCount < MAX_SLAVES_PER_SPLITPOINT + while ( sp.slavesMask.count() < MAX_SLAVES_PER_SPLITPOINT && (slave = Threads.available_slave(this)) != NULL) { sp.slavesMask.set(slave->idx); - sp.slavesCount++; slave->activeSplitPoint = &sp; slave->searching = true; // Slave leaves idle_loop() slave->notify_one(); // Could be sleeping diff --git a/src/thread.h b/src/thread.h index 0265ee67..42c44aa9 100644 --- a/src/thread.h +++ b/src/thread.h @@ -33,7 +33,7 @@ struct Thread; const int MAX_THREADS = 128; const int MAX_SPLITPOINTS_PER_THREAD = 8; -const int MAX_SLAVES_PER_SPLITPOINT = 4; +const size_t MAX_SLAVES_PER_SPLITPOINT = 4; /// Mutex and ConditionVariable struct are wrappers of the low level locking /// machinery and are modeled after the corresponding C++11 classes. @@ -85,7 +85,6 @@ struct SplitPoint { // Shared variable data Mutex mutex; std::bitset slavesMask; - int slavesCount; volatile bool allSlavesSearching; volatile uint64_t nodes; volatile Value alpha; -- 2.39.2