]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Avoid using EmptySearchStack global
[stockfish] / src / search.cpp
index 4e04d0745ed6caf86c1d8a87eb5baee10a8fbdd1..16c46c9104fed8f75e10835959fd866a216c5cf7 100644 (file)
@@ -72,7 +72,8 @@ namespace {
   // Apart for the first one that has its score, following moves
   // normally have score -VALUE_INFINITE, so are ordered according
   // to the number of beta cutoffs occurred under their subtree during
-  // the last iteration.
+  // the last iteration. The counters are per thread variables to avoid
+  // concurrent accessing under SMP case.
 
   struct BetaCounterType {
 
@@ -80,8 +81,6 @@ namespace {
     void clear();
     void add(Color us, Depth d, int threadID);
     void read(Color us, int64_t& our, int64_t& their);
-
-    int64_t hits[THREAD_MAX][2];
   };
 
 
@@ -333,9 +332,6 @@ Lock IOLock;
 
 History H;  // Should be made local?
 
-// The empty search stack
-SearchStack EmptySearchStack;
-
 
 // SearchStack::init() initializes a search stack. Used at the beginning of a
 // new search from the root.
@@ -598,10 +594,6 @@ void init_threads() {
       // Wait until the thread has finished launching:
       while (!Threads[i].running);
   }
-
-  // Init also the empty search stack
-  EmptySearchStack.init(0);
-  EmptySearchStack.initKillers();
 }
 
 
@@ -1064,7 +1056,7 @@ namespace {
 
     // Initialize a MovePicker object for the current position, and prepare
     // to search all moves
-    MovePicker mp = MovePicker(pos, true, ttMove, ss[ply], depth);
+    MovePicker mp = MovePicker(pos, true, ttMove, depth, &ss[ply]);
 
     Move move, movesSearched[256];
     int moveCount = 0;
@@ -1325,7 +1317,7 @@ namespace {
 
     // Initialize a MovePicker object for the current position, and prepare
     // to search all moves:
-    MovePicker mp = MovePicker(pos, false, ttMove, ss[ply], depth);
+    MovePicker mp = MovePicker(pos, false, ttMove, depth, &ss[ply]);
 
     Move move, movesSearched[256];
     int moveCount = 0;
@@ -1546,7 +1538,7 @@ namespace {
     // Initialize a MovePicker object for the current position, and prepare
     // to search the moves.  Because the depth is <= 0 here, only captures,
     // queen promotions and checks (only if depth == 0) will be generated.
-    MovePicker mp = MovePicker(pos, pvNode, ttMove, EmptySearchStack, depth);
+    MovePicker mp = MovePicker(pos, pvNode, ttMove, depth);
     Move move;
     int moveCount = 0;
     Bitboard dcCandidates = mp.discovered_check_candidates();
@@ -1894,13 +1886,13 @@ namespace {
   void BetaCounterType::clear() {
 
     for (int i = 0; i < THREAD_MAX; i++)
-        hits[i][WHITE] = hits[i][BLACK] = 0ULL;
+        Threads[i].betaCutOffs[WHITE] = Threads[i].betaCutOffs[BLACK] = 0ULL;
   }
 
   void BetaCounterType::add(Color us, Depth d, int threadID) {
 
     // Weighted count based on depth
-    hits[threadID][us] += int(d);
+    Threads[threadID].betaCutOffs[us] += unsigned(d);
   }
 
   void BetaCounterType::read(Color us, int64_t& our, int64_t& their) {
@@ -1908,8 +1900,8 @@ namespace {
     our = their = 0UL;
     for (int i = 0; i < THREAD_MAX; i++)
     {
-        our += hits[i][us];
-        their += hits[i][opposite_color(us)];
+        our += Threads[i].betaCutOffs[us];
+        their += Threads[i].betaCutOffs[opposite_color(us)];
     }
   }