From ffdf63ff7c1fce40774aa8cff82b17c54155c6cb Mon Sep 17 00:00:00 2001 From: mstembera Date: Sun, 23 Mar 2014 09:24:35 +0100 Subject: [PATCH] Refresh TT entries generation automatically on probe 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 | 1 - src/tt.cpp | 15 +++++++++------ src/tt.h | 40 +++++++++++++++------------------------- 3 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index ccf3b56d..b0e885c6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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 diff --git a/src/tt.cpp b/src/tt.cpp index 04673901..41fc33ff 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -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; diff --git a/src/tt.h b/src/tt.h index 05f6dfff..dc423dd2 100644 --- 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(tte)->set_generation(generation); -} - #endif // #ifndef TT_H_INCLUDED -- 2.39.2