Use 128 bit multiply for TT index

Remove super cluster stuff from TT and just use a 128 bit multiply.

STC https://tests.stockfishchess.org/tests/view/5ee719b3aae8aec816ab7548
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 12736 W: 2502 L: 2333 D: 7901
Ptnml(0-2): 191, 1452, 2944, 1559, 222

LTC https://tests.stockfishchess.org/tests/view/5ee732d1aae8aec816ab7556
LLR: 2.93 (-2.94,2.94) {-1.50,0.50}
Total: 27584 W: 3431 L: 3350 D: 20803
Ptnml(0-2): 173, 2500, 8400, 2511, 208

Scheme back to being derived from https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/

Also the default optimized version of the index calculation now uses fewer instructions.
https://godbolt.org/z/Tktxbv
Might benefit from mulx (requires -mbmi2)

closes https://github.com/official-stockfish/Stockfish/pull/2744

bench: 4320954
This commit is contained in:
mstembera
2020-06-14 23:35:07 -07:00
committed by Joost VandeVondele
parent 995ee4b311
commit 1ea488d34c
5 changed files with 22 additions and 22 deletions

View File

@@ -66,7 +66,6 @@ private:
class TranspositionTable {
static constexpr int ClusterSize = 3;
static constexpr int ClustersPerSuperCluster = 256;
struct Cluster {
TTEntry entry[ClusterSize];
@@ -84,20 +83,13 @@ public:
void clear();
TTEntry* first_entry(const Key key) const {
// The index is computed from
// Idx = (K48 * SCC) / 2^40, with K48 the 48 lowest bits swizzled.
const uint64_t firstTerm = uint32_t(key) * uint64_t(superClusterCount);
const uint64_t secondTerm = (uint16_t(key >> 32) * uint64_t(superClusterCount)) >> 16;
return &table[(firstTerm + secondTerm) >> 24].entry[0];
return &table[mul_hi64(key, clusterCount)].entry[0];
}
private:
friend struct TTEntry;
size_t superClusterCount;
size_t clusterCount;
Cluster* table;
void* mem;
uint8_t generation8; // Size must be not bigger than TTEntry::genBound8