Fix random moves when time < 10ms
authorMarco Costalba <mcostalba@gmail.com>
Tue, 10 Sep 2013 19:14:09 +0000 (21:14 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 10 Sep 2013 19:23:20 +0000 (21:23 +0200)
In case we have less then 10ms to think as soon as
we wake up the timer, it immediately fires and calls
check_time() where due to condition:

elapsed > TimeMgr.maximum_time() - 2 * TimerResolution

the stop flag is set and search returns immediately, without
actually search anything.

Here the somewhat hacky fix is to start the timer after
at least one iteration as been completed.

No functional change.

src/search.cpp

index 24f1e6245672be6b230e8d63d9484d811e30b2d6..4b0a9fe8b60676b96c7c5dcc9bda19f9d5bcd6b8 100644 (file)
@@ -242,13 +242,11 @@ void Search::think() {
   Threads.sleepWhileIdle = Options["Idle Threads Sleep"];
 
   // Set best timer interval to avoid lagging under time pressure. Timer is
   Threads.sleepWhileIdle = Options["Idle Threads Sleep"];
 
   // Set best timer interval to avoid lagging under time pressure. Timer is
-  // used to check for remaining available thinking time.
+  // used to check for remaining available thinking time. Timer will be started
+  // at the end of first iteration to avoid returning with a random move.
   Threads.timer->msec =
   Limits.use_time_management() ? std::min(100, std::max(TimeMgr.available_time() / 16, TimerResolution)) :
   Threads.timer->msec =
   Limits.use_time_management() ? std::min(100, std::max(TimeMgr.available_time() / 16, TimerResolution)) :
-                  Limits.nodes ? 2 * TimerResolution
-                               : 100;
-
-  Threads.timer->notify_one(); // Wake up the recurring timer
+                  Limits.nodes ? 2 * TimerResolution : 100;
 
   id_loop(RootPos); // Let's start searching !
 
 
   id_loop(RootPos); // Let's start searching !
 
@@ -402,6 +400,10 @@ namespace {
                 assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
             }
 
                 assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
             }
 
+            // Wake up the recurring timer after first iteration is finished
+            if (depth == 1)
+                Threads.timer->notify_one();
+
             // Sort the PV lines searched so far and update the GUI
             std::stable_sort(RootMoves.begin(), RootMoves.begin() + PVIdx + 1);
 
             // Sort the PV lines searched so far and update the GUI
             std::stable_sort(RootMoves.begin(), RootMoves.begin() + PVIdx + 1);