Retire redundant sp->slavesCount field
authorMarco Costalba <mcostalba@gmail.com>
Thu, 19 Feb 2015 09:27:24 +0000 (10:27 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 19 Feb 2015 09:36:15 +0000 (10:36 +0100)
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
src/thread.cpp
src/thread.h

index 76d0350..a047665 100644 (file)
@@ -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;
               }
index 5c013c6..8be7b72 100644 (file)
@@ -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
index 0265ee6..42c44aa 100644 (file)
@@ -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<MAX_THREADS> slavesMask;
-  int slavesCount;
   volatile bool allSlavesSearching;
   volatile uint64_t nodes;
   volatile Value alpha;