Reuse 5 slots instead of 4

But this time with the guarantee of an always aligned
access so that prefetching is not adversely impacted.

On Joona PC
1+0, 64Mb hash:

Orig - Mod: 174 - 237 - 359

Instead after 1000 games at 1+0 with 128MB hash size
we are at + 1 ELO (just 4 games of difference).

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2009-08-11 08:30:19 +01:00
parent 8d369600ec
commit 166c09a7a0
2 changed files with 21 additions and 11 deletions

View File

@@ -70,10 +70,23 @@ private:
uint32_t data;
int16_t value_;
int16_t depth_;
uint32_t pad_to_16_bytes;
};
/// The transposition table class. This is basically just a huge array
/// This is the number of TTEntry slots for each position
const int ClusterSize = 5;
/// Each group of ClusterSize number of TTEntry form a TTCluster
/// that is indexed by a single position key. Cluster is padded
/// to a cache line size so to guarantee always aligned accesses.
struct TTCluster {
TTEntry data[ClusterSize];
char cache_line_padding[64 - sizeof(TTEntry[ClusterSize])];
};
/// The transposition table class. This is basically just a huge array
/// containing TTEntry objects, and a few methods for writing new entries
/// and reading new ones.
@@ -95,14 +108,14 @@ public:
private:
inline TTEntry* first_entry(const Key posKey) const;
// Be sure 'writes' is at least one cacheline away
// Be sure 'writes' is at least one cache line away
// from read only variables.
unsigned char pad_before[64 - sizeof(unsigned)];
unsigned writes; // heavy SMP read/write access here
unsigned char pad_after[64];
unsigned size;
TTEntry* entries;
TTCluster* entries;
uint8_t generation;
};