1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

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

@ -33,9 +33,6 @@
#include <xmmintrin.h> #include <xmmintrin.h>
#endif #endif
// This is the number of TTEntry slots for each position
static const int ClusterSize = 4;
// The main transposition table // The main transposition table
TranspositionTable TT; TranspositionTable TT;
@ -67,14 +64,14 @@ void TranspositionTable::set_size(unsigned mbSize) {
// We store a cluster of ClusterSize number of TTEntry for each position // We store a cluster of ClusterSize number of TTEntry for each position
// and newSize is the maximum number of storable positions. // and newSize is the maximum number of storable positions.
while ((2 * newSize) * ClusterSize * (sizeof(TTEntry)) <= (mbSize << 20)) while ((2 * newSize) * sizeof(TTCluster) <= (mbSize << 20))
newSize *= 2; newSize *= 2;
if (newSize != size) if (newSize != size)
{ {
size = newSize; size = newSize;
delete [] entries; delete [] entries;
entries = new TTEntry[size * ClusterSize]; entries = new TTCluster[size];
if (!entries) if (!entries)
{ {
std::cerr << "Failed to allocate " << mbSize std::cerr << "Failed to allocate " << mbSize
@ -93,7 +90,7 @@ void TranspositionTable::set_size(unsigned mbSize) {
void TranspositionTable::clear() { void TranspositionTable::clear() {
memset(entries, 0, size * ClusterSize * sizeof(TTEntry)); memset(entries, 0, size * sizeof(TTCluster));
} }
@ -103,7 +100,7 @@ void TranspositionTable::clear() {
inline TTEntry* TranspositionTable::first_entry(const Key posKey) const { inline TTEntry* TranspositionTable::first_entry(const Key posKey) const {
return entries + ((uint32_t(posKey) & (size - 1)) * ClusterSize); return entries[uint32_t(posKey) & (size - 1)].data;
} }

View file

@ -70,9 +70,22 @@ private:
uint32_t data; uint32_t data;
int16_t value_; int16_t value_;
int16_t depth_; int16_t depth_;
uint32_t pad_to_16_bytes;
}; };
/// 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 /// The transposition table class. This is basically just a huge array
/// containing TTEntry objects, and a few methods for writing new entries /// containing TTEntry objects, and a few methods for writing new entries
/// and reading new ones. /// and reading new ones.
@ -95,14 +108,14 @@ public:
private: private:
inline TTEntry* first_entry(const Key posKey) const; 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. // from read only variables.
unsigned char pad_before[64 - sizeof(unsigned)]; unsigned char pad_before[64 - sizeof(unsigned)];
unsigned writes; // heavy SMP read/write access here unsigned writes; // heavy SMP read/write access here
unsigned char pad_after[64]; unsigned char pad_after[64];
unsigned size; unsigned size;
TTEntry* entries; TTCluster* entries;
uint8_t generation; uint8_t generation;
}; };