Subversion Repositories Games.Chess Giants

Rev

Rev 169 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
  3.   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
  4.   Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
  5.   Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
  6.  
  7.   Stockfish is free software: you can redistribute it and/or modify
  8.   it under the terms of the GNU General Public License as published by
  9.   the Free Software Foundation, either version 3 of the License, or
  10.   (at your option) any later version.
  11.  
  12.   Stockfish is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License
  18.   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19. */
  20.  
  21. #ifndef TT_H_INCLUDED
  22. #define TT_H_INCLUDED
  23.  
  24. #include "misc.h"
  25. #include "types.h"
  26.  
  27. /// TTEntry struct is the 10 bytes transposition table entry, defined as below:
  28. ///
  29. /// key        16 bit
  30. /// move       16 bit
  31. /// value      16 bit
  32. /// eval value 16 bit
  33. /// generation  6 bit
  34. /// bound type  2 bit
  35. /// depth       8 bit
  36.  
  37. struct TTEntry {
  38.  
  39.   Move  move()  const { return (Move )move16; }
  40.   Value value() const { return (Value)value16; }
  41.   Value eval()  const { return (Value)eval16; }
  42.   Depth depth() const { return (Depth)(depth8 * int(ONE_PLY)); }
  43.   Bound bound() const { return (Bound)(genBound8 & 0x3); }
  44.   void save(Key k, Value v, Bound b, Depth d, Move m, Value ev);
  45.  
  46. private:
  47.   friend class TranspositionTable;
  48.  
  49.   uint16_t key16;
  50.   uint16_t move16;
  51.   int16_t  value16;
  52.   int16_t  eval16;
  53.   uint8_t  genBound8;
  54.   int8_t   depth8;
  55. };
  56.  
  57.  
  58. /// A TranspositionTable consists of a power of 2 number of clusters and each
  59. /// cluster consists of ClusterSize number of TTEntry. Each non-empty entry
  60. /// contains information of exactly one position. The size of a cluster should
  61. /// divide the size of a cache line size, to ensure that clusters never cross
  62. /// cache lines. This ensures best cache performance, as the cacheline is
  63. /// prefetched, as soon as possible.
  64.  
  65. class TranspositionTable {
  66.  
  67.   static constexpr int CacheLineSize = 64;
  68.   static constexpr int ClusterSize = 3;
  69.  
  70.   struct Cluster {
  71.     TTEntry entry[ClusterSize];
  72.     char padding[2]; // Align to a divisor of the cache line size
  73.   };
  74.  
  75.   static_assert(CacheLineSize % sizeof(Cluster) == 0, "Cluster size incorrect");
  76.  
  77. public:
  78.  ~TranspositionTable() { free(mem); }
  79.   void new_search() { generation8 += 4; } // Lower 2 bits are used by Bound
  80.   TTEntry* probe(const Key key, bool& found) const;
  81.   int hashfull() const;
  82.   void resize(size_t mbSize);
  83.   void clear();
  84.  
  85.   // The 32 lowest order bits of the key are used to get the index of the cluster
  86.   TTEntry* first_entry(const Key key) const {
  87.     return &table[(uint32_t(key) * uint64_t(clusterCount)) >> 32].entry[0];
  88.   }
  89.  
  90. private:
  91.   friend struct TTEntry;
  92.  
  93.   size_t clusterCount;
  94.   Cluster* table;
  95.   void* mem;
  96.   uint8_t generation8; // Size must be not bigger than TTEntry::genBound8
  97. };
  98.  
  99. extern TranspositionTable TT;
  100.  
  101. #endif // #ifndef TT_H_INCLUDED
  102.