]> git.sesse.net Git - stockfish/blob - src/tt.h
add clang-format
[stockfish] / src / tt.h
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
4
5   Stockfish is free software: you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   Stockfish is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #ifndef TT_H_INCLUDED
20 #define TT_H_INCLUDED
21
22 #include <cstddef>
23 #include <cstdint>
24
25 #include "misc.h"
26 #include "types.h"
27
28 namespace Stockfish {
29
30 // TTEntry struct is the 10 bytes transposition table entry, defined as below:
31 //
32 // key        16 bit
33 // depth       8 bit
34 // generation  5 bit
35 // pv node     1 bit
36 // bound type  2 bit
37 // move       16 bit
38 // value      16 bit
39 // eval value 16 bit
40
41 struct TTEntry {
42
43     Move  move() const { return Move(move16); }
44     Value value() const { return Value(value16); }
45     Value eval() const { return Value(eval16); }
46     Depth depth() const { return Depth(depth8 + DEPTH_OFFSET); }
47     bool  is_pv() const { return bool(genBound8 & 0x4); }
48     Bound bound() const { return Bound(genBound8 & 0x3); }
49     void  save(Key k, Value v, bool pv, Bound b, Depth d, Move m, Value ev);
50
51    private:
52     friend class TranspositionTable;
53
54     uint16_t key16;
55     uint8_t  depth8;
56     uint8_t  genBound8;
57     uint16_t move16;
58     int16_t  value16;
59     int16_t  eval16;
60 };
61
62
63 // A TranspositionTable is an array of Cluster, of size clusterCount. Each
64 // cluster consists of ClusterSize number of TTEntry. Each non-empty TTEntry
65 // contains information on exactly one position. The size of a Cluster should
66 // divide the size of a cache line for best performance, as the cacheline is
67 // prefetched when possible.
68
69 class TranspositionTable {
70
71     static constexpr int ClusterSize = 3;
72
73     struct Cluster {
74         TTEntry entry[ClusterSize];
75         char    padding[2];  // Pad to 32 bytes
76     };
77
78     static_assert(sizeof(Cluster) == 32, "Unexpected Cluster size");
79
80     // Constants used to refresh the hash table periodically
81     static constexpr unsigned GENERATION_BITS = 3;  // nb of bits reserved for other things
82     static constexpr int      GENERATION_DELTA =
83       (1 << GENERATION_BITS);  // increment for generation field
84     static constexpr int GENERATION_CYCLE = 255 + (1 << GENERATION_BITS);  // cycle length
85     static constexpr int GENERATION_MASK =
86       (0xFF << GENERATION_BITS) & 0xFF;  // mask to pull out generation number
87
88    public:
89     ~TranspositionTable() { aligned_large_pages_free(table); }
90     void new_search() { generation8 += GENERATION_DELTA; }  // Lower bits are used for other things
91     TTEntry* probe(const Key key, bool& found) const;
92     int      hashfull() const;
93     void     resize(size_t mbSize);
94     void     clear();
95
96     TTEntry* first_entry(const Key key) const {
97         return &table[mul_hi64(key, clusterCount)].entry[0];
98     }
99
100    private:
101     friend struct TTEntry;
102
103     size_t   clusterCount;
104     Cluster* table;
105     uint8_t  generation8;  // Size must be not bigger than TTEntry::genBound8
106 };
107
108 extern TranspositionTable TT;
109
110 }  // namespace Stockfish
111
112 #endif  // #ifndef TT_H_INCLUDED