]> git.sesse.net Git - stockfish/commitdiff
Revert "Allow split point master to sleep (take 2)"
authorMarco Costalba <mcostalba@gmail.com>
Tue, 23 Nov 2010 06:00:30 +0000 (07:00 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 27 Nov 2010 20:25:59 +0000 (21:25 +0100)
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp
src/thread.h
src/ucioption.cpp

index 121575f554525c6a2b13b52140a7d4d6fa2f86b6..2c91d7789c4bb5bef69a61b44ff94b6af6c2d432 100644 (file)
@@ -263,7 +263,6 @@ namespace {
   // Multi-threads related variables
   Depth MinimumSplitDepth;
   int MaxThreadsPerSplitPoint;
   // Multi-threads related variables
   Depth MinimumSplitDepth;
   int MaxThreadsPerSplitPoint;
-  bool UseSleepingMaster;
   ThreadsManager ThreadsMgr;
 
   // Node counters, used only by thread[0] but try to keep in different cache
   ThreadsManager ThreadsMgr;
 
   // Node counters, used only by thread[0] but try to keep in different cache
@@ -456,7 +455,6 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[
   MaxThreadsPerSplitPoint = Options["Maximum Number of Threads per Split Point"].value<int>();
   MultiPV                 = Options["MultiPV"].value<int>();
   UseLogFile              = Options["Use Search Log"].value<bool>();
   MaxThreadsPerSplitPoint = Options["Maximum Number of Threads per Split Point"].value<int>();
   MultiPV                 = Options["MultiPV"].value<int>();
   UseLogFile              = Options["Use Search Log"].value<bool>();
-  UseSleepingMaster       = Options["Use Sleeping Master"].value<bool>();
 
   if (UseLogFile)
       LogFile.open(Options["Search Log Filename"].value<std::string>().c_str(), std::ios::out | std::ios::app);
 
   if (UseLogFile)
       LogFile.open(Options["Search Log Filename"].value<std::string>().c_str(), std::ios::out | std::ios::app);
@@ -2184,9 +2182,6 @@ split_point_start: // At split points actual search starts from here
 
     assert(threadID >= 0 && threadID < MAX_THREADS);
 
 
     assert(threadID >= 0 && threadID < MAX_THREADS);
 
-    int i;
-    bool allFinished = false;
-
     while (true)
     {
         // Slave threads can exit as soon as AllThreadsShouldExit raises,
     while (true)
     {
         // Slave threads can exit as soon as AllThreadsShouldExit raises,
@@ -2202,23 +2197,23 @@ split_point_start: // At split points actual search starts from here
         // instead of wasting CPU time polling for work.
         while (   threadID >= ActiveThreads
                || threads[threadID].state == THREAD_INITIALIZING
         // instead of wasting CPU time polling for work.
         while (   threadID >= ActiveThreads
                || threads[threadID].state == THREAD_INITIALIZING
-               || (threads[threadID].state == THREAD_AVAILABLE && (!sp || UseSleepingMaster)))
+               || (!sp && threads[threadID].state == THREAD_AVAILABLE))
         {
         {
-            lock_grab(&MPLock);
+            assert(!sp);
+            assert(threadID != 0);
+
+            if (AllThreadsShouldExit)
+                break;
 
 
-            // Test with lock held to avoid races with wake_sleeping_thread()
-            for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {}
-            allFinished = (i == ActiveThreads);
+            lock_grab(&MPLock);
 
 
-            // Retest sleep conditions under lock protection
-            if (   AllThreadsShouldExit
-                || allFinished
-                || !(   threadID >= ActiveThreads
-                     || threads[threadID].state == THREAD_INITIALIZING
-                     || (threads[threadID].state == THREAD_AVAILABLE && (!sp || UseSleepingMaster))))
+            // Retest condition under lock protection
+            if (!(   threadID >= ActiveThreads
+                  || threads[threadID].state == THREAD_INITIALIZING
+                  || (!sp && threads[threadID].state == THREAD_AVAILABLE)))
             {
                 lock_release(&MPLock);
             {
                 lock_release(&MPLock);
-                break;
+                continue;
             }
 
             // Put thread to sleep
             }
 
             // Put thread to sleep
@@ -2248,19 +2243,14 @@ split_point_start: // At split points actual search starts from here
             assert(threads[threadID].state == THREAD_SEARCHING);
 
             threads[threadID].state = THREAD_AVAILABLE;
             assert(threads[threadID].state == THREAD_SEARCHING);
 
             threads[threadID].state = THREAD_AVAILABLE;
-
-            // Wake up master thread so to allow it to return from the idle loop in
-            // case we are the last slave of the split point.
-            if (UseSleepingMaster && threadID != tsp->master && threads[tsp->master].state == THREAD_AVAILABLE)
-                wake_sleeping_thread(tsp->master);
         }
 
         // If this thread is the master of a split point and all slaves have
         // finished their work at this split point, return from the idle loop.
         }
 
         // If this thread is the master of a split point and all slaves have
         // finished their work at this split point, return from the idle loop.
-        for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {}
-        allFinished = (i == ActiveThreads);
+        int i = 0;
+        for ( ; sp && i < ActiveThreads && !sp->slaves[i]; i++) {}
 
 
-        if (allFinished)
+        if (i == ActiveThreads)
         {
             // Because sp->slaves[] is reset under lock protection,
             // be sure sp->lock has been released before to return.
         {
             // Because sp->slaves[] is reset under lock protection,
             // be sure sp->lock has been released before to return.
@@ -2468,7 +2458,6 @@ split_point_start: // At split points actual search starts from here
 
     // Initialize the split point object
     splitPoint.parent = masterThread.splitPoint;
 
     // Initialize the split point object
     splitPoint.parent = masterThread.splitPoint;
-    splitPoint.master = master;
     splitPoint.stopRequest = false;
     splitPoint.ply = ply;
     splitPoint.depth = depth;
     splitPoint.stopRequest = false;
     splitPoint.ply = ply;
     splitPoint.depth = depth;
index 98576ccea2131a877edc2a61a16ff164219596c3..44b70e1e64311e910f7e4cb2cfd61b7939535214 100644 (file)
@@ -55,7 +55,6 @@ struct SplitPoint {
   bool pvNode, mateThreat;
   Value beta;
   int ply;
   bool pvNode, mateThreat;
   Value beta;
   int ply;
-  int master;
   Move threatMove;
   SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
 
   Move threatMove;
   SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
 
index 4194f839a3b77f7bc90c3aa2ff94d1910de7f9c4..81dd0ca0a074fd15565a55f07408018ab02b45af 100644 (file)
@@ -94,7 +94,6 @@ void init_uci_options() {
   Options["Minimum Split Depth"] = Option(4, 4, 7);
   Options["Maximum Number of Threads per Split Point"] = Option(5, 4, 8);
   Options["Threads"] = Option(1, 1, MAX_THREADS);
   Options["Minimum Split Depth"] = Option(4, 4, 7);
   Options["Maximum Number of Threads per Split Point"] = Option(5, 4, 8);
   Options["Threads"] = Option(1, 1, MAX_THREADS);
-  Options["Use Sleeping Master"] = Option(false);
   Options["Hash"] = Option(32, 4, 8192);
   Options["Clear Hash"] = Option(false, "button");
   Options["Ponder"] = Option(true);
   Options["Hash"] = Option(32, 4, 8192);
   Options["Clear Hash"] = Option(false, "button");
   Options["Ponder"] = Option(true);