From 0be7b8c54207a5a435ed38f0b8e42ad9a8cc9935 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 9 Feb 2013 16:22:47 +0100 Subject: [PATCH] Further simplify first_entry() We can encode the ClusterSize directly in the hashMask, this allows to skip the left shift. There is no real change, but bench number is now different because instead of using the lowest order bits of the key to index the start of the cluster, now we don't use the last two lsb bits that are always set to zero (cluster size is 4). So for instance, if 10 bits are used to index the cluster, instead of bits [9..0] now we use bits [11..2]. This changes the positions that end up in the same cluster affecting TT hits and so bench is different. Also some renaming while there. bench: 5383795 --- src/tt.cpp | 14 +++++++------- src/tt.h | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/tt.cpp b/src/tt.cpp index fa0d39de..f4e55354 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -34,16 +34,16 @@ void TranspositionTable::set_size(size_t mbSize) { assert(msb((mbSize << 20) / sizeof(TTEntry)) < 32); - uint32_t size = 1 << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize])); + uint32_t size = ClusterSize << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize])); - if (clusterMask == size - 1) + if (hashMask == size - ClusterSize) return; - clusterMask = size - 1; - delete [] entries; - entries = new (std::nothrow) TTEntry[size * ClusterSize]; + hashMask = size - ClusterSize; + delete [] table; + table = new (std::nothrow) TTEntry[size]; - if (!entries) + if (!table) { std::cerr << "Failed to allocate " << mbSize << "MB for transposition table." << std::endl; @@ -60,7 +60,7 @@ void TranspositionTable::set_size(size_t mbSize) { void TranspositionTable::clear() { - memset(entries, 0, (clusterMask + 1) * sizeof(TTEntry[ClusterSize])); + memset(table, 0, (hashMask + ClusterSize) * sizeof(TTEntry)); } diff --git a/src/tt.h b/src/tt.h index 81bfd3b2..2db19c89 100644 --- a/src/tt.h +++ b/src/tt.h @@ -85,7 +85,7 @@ class TranspositionTable { static const unsigned ClusterSize = 4; // A cluster is 64 Bytes public: - ~TranspositionTable() { delete [] entries; } + ~TranspositionTable() { delete [] table; } void new_search() { generation++; } TTEntry* probe(const Key key) const; @@ -96,8 +96,8 @@ public: void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV, Value kingD); private: - uint32_t clusterMask; - TTEntry* entries; + uint32_t hashMask; + TTEntry* table; uint8_t generation; // Size must be not bigger then TTEntry::generation8 }; @@ -110,7 +110,7 @@ extern TranspositionTable TT; inline TTEntry* TranspositionTable::first_entry(const Key key) const { - return entries + ((uint32_t)key & clusterMask) * ClusterSize; + return table + ((uint32_t)key & hashMask); } -- 2.39.2