Refresh TT entries generation automatically on probe
authormstembera <MissingEmail@email>
Sun, 23 Mar 2014 08:24:35 +0000 (09:24 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 23 Mar 2014 08:46:15 +0000 (09:46 +0100)
And other assorted simplifications, tested with SPRT[-3, 1]

Passed both short TC
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 18814 W: 3600 L: 3475 D: 11739

And long TC
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 20731 W: 3217 L: 3096 D: 14418

No functional change.

src/search.cpp
src/tt.cpp
src/tt.h

index ccf3b56d65b34199f74f7a8f22348035bacf4e52..b0e885c6aabf35e257dd0ff5c9fd191c86d0498e 100644 (file)
@@ -534,7 +534,6 @@ namespace {
             : ttValue >= beta ? (tte->bound() &  BOUND_LOWER)
                               : (tte->bound() &  BOUND_UPPER)))
     {
-        TT.refresh(tte);
         ss->currentMove = ttMove; // Can be MOVE_NONE
 
         // If ttMove is quiet, update killers, history, counter move and followup move on TT hit
index 04673901545381a0f00956ed571a10d7023eee66..41fc33ff9ebba868927ce1de876ab42f512b2618 100644 (file)
@@ -70,12 +70,15 @@ void TranspositionTable::clear() {
 
 const TTEntry* TranspositionTable::probe(const Key key) const {
 
-  const TTEntry* tte = first_entry(key);
+  TTEntry* tte = first_entry(key);
   uint32_t key32 = key >> 32;
 
   for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
-      if (tte->key() == key32)
+      if (tte->key32 == key32)
+      {
+          tte->generation8 = generation; // Refresh
           return tte;
+      }
 
   return NULL;
 }
@@ -99,7 +102,7 @@ void TranspositionTable::store(const Key key, Value v, Bound b, Depth d, Move m,
 
   for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
   {
-      if (!tte->key() || tte->key() == key32) // Empty or overwrite old
+      if (!tte->key32 || tte->key32 == key32) // Empty or overwrite old
       {
           if (!m)
               m = tte->move(); // Preserve any existing ttMove
@@ -109,9 +112,9 @@ void TranspositionTable::store(const Key key, Value v, Bound b, Depth d, Move m,
       }
 
       // Implement replace strategy
-      c1 = (replace->generation() == generation ?  2 : 0);
-      c2 = (tte->generation() == generation || tte->bound() == BOUND_EXACT ? -2 : 0);
-      c3 = (tte->depth() < replace->depth() ?  1 : 0);
+      c1 = (replace->generation8 == generation ?  2 : 0);
+      c2 = (tte->generation8 == generation || tte->bound() == BOUND_EXACT ? -2 : 0);
+      c3 = (tte->depth16 < replace->depth16 ?  1 : 0);
 
       if (c1 + c2 + c3 > 0)
           replace = tte;
index 05f6dfff5d76fccb707e67223c5940d07c3a7793..dc423dd2efb08e480bf1774100cc65e2f1936bb6 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -37,25 +37,25 @@ struct TTEntry {
 
   void save(uint32_t k, Value v, Bound b, Depth d, Move m, int g, Value ev) {
 
-    key32        = (uint32_t)k;
-    move16       = (uint16_t)m;
-    bound8       = (uint8_t)b;
-    generation8  = (uint8_t)g;
-    value16      = (int16_t)v;
-    depth16      = (int16_t)d;
-    evalValue    = (int16_t)ev;
+    key32       = (uint32_t)k;
+    move16      = (uint16_t)m;
+    bound8      = (uint8_t)b;
+    generation8 = (uint8_t)g;
+    value16     = (int16_t)v;
+    depth16     = (int16_t)d;
+    evalValue   = (int16_t)ev;
   }
-  void set_generation(uint8_t g) { generation8 = g; }
 
-  uint32_t key() const      { return key32; }
-  Depth depth() const       { return (Depth)depth16; }
-  Move move() const         { return (Move)move16; }
-  Value value() const       { return (Value)value16; }
-  Bound bound() const       { return (Bound)bound8; }
-  int generation() const    { return (int)generation8; }
-  Value eval_value() const  { return (Value)evalValue; }
+  uint32_t key() const     { return key32; }
+  Move move() const        { return (Move)move16; }
+  Bound bound() const      { return (Bound)bound8; }
+  Value value() const      { return (Value)value16; }
+  Depth depth() const      { return (Depth)depth16; }
+  Value eval_value() const { return (Value)evalValue; }
 
 private:
+  friend struct TranspositionTable;
+
   uint32_t key32;
   uint16_t move16;
   uint8_t bound8, generation8;
@@ -79,7 +79,6 @@ public:
 
   const TTEntry* probe(const Key key) const;
   TTEntry* first_entry(const Key key) const;
-  void refresh(const TTEntry* tte) const;
   void resize(uint64_t mbSize);
   void clear();
   void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV);
@@ -103,13 +102,4 @@ inline TTEntry* TranspositionTable::first_entry(const Key key) const {
   return table + ((uint32_t)key & hashMask);
 }
 
-
-/// TranspositionTable::refresh() updates the 'generation' value of the TTEntry
-/// to avoid aging. It is normally called after a TT hit.
-
-inline void TranspositionTable::refresh(const TTEntry* tte) const {
-
-  const_cast<TTEntry*>(tte)->set_generation(generation);
-}
-
 #endif // #ifndef TT_H_INCLUDED