On platforms where size_t is 32 bit, we
can have an overflow in this expression:
(mbSize * 1024 * 1024)
Fix it setting max hash size of 2GB on platforms
where size_t is 32 bit.
A small rename while there: now struct Cluster
is definied inside class TranspositionTable so
we should drop the redundant TT prefix.
No functional change.
void TranspositionTable::resize(size_t mbSize) {
void TranspositionTable::resize(size_t mbSize) {
- assert(sizeof(TTCluster) == CacheLineSize / 2);
+ assert(sizeof(Cluster) == CacheLineSize / 2);
- size_t newClusterCount = size_t(1) << msb((mbSize * 1024 * 1024) / sizeof(TTCluster));
+ size_t newClusterCount = size_t(1) << msb((mbSize * 1024 * 1024) / sizeof(Cluster));
if (newClusterCount == clusterCount)
return;
if (newClusterCount == clusterCount)
return;
clusterCount = newClusterCount;
free(mem);
clusterCount = newClusterCount;
free(mem);
- mem = calloc(clusterCount * sizeof(TTCluster) + CacheLineSize - 1, 1);
+ mem = calloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1, 1);
- table = (TTCluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1));
+ table = (Cluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1));
void TranspositionTable::clear() {
void TranspositionTable::clear() {
- std::memset(table, 0, clusterCount * sizeof(TTCluster));
+ std::memset(table, 0, clusterCount * sizeof(Cluster));
static const int CacheLineSize = 64;
static const int TTClusterSize = 3;
static const int CacheLineSize = 64;
static const int TTClusterSize = 3;
TTEntry entry[TTClusterSize];
char padding[2]; // Align to the cache line size
};
TTEntry entry[TTClusterSize];
char padding[2]; // Align to the cache line size
};
private:
size_t clusterCount;
private:
size_t clusterCount;
void* mem;
uint8_t generation8; // Size must be not bigger than TTEntry::genBound8
};
void* mem;
uint8_t generation8; // Size must be not bigger than TTEntry::genBound8
};
void init(OptionsMap& o) {
void init(OptionsMap& o) {
+ const int MaxHashMB = Is64Bit ? 1024 * 1024 : 2048;
+
o["Write Debug Log"] << Option(false, on_logger);
o["Contempt"] << Option(0, -100, 100);
o["Min Split Depth"] << Option(0, 0, 12, on_threads);
o["Threads"] << Option(1, 1, MAX_THREADS, on_threads);
o["Write Debug Log"] << Option(false, on_logger);
o["Contempt"] << Option(0, -100, 100);
o["Min Split Depth"] << Option(0, 0, 12, on_threads);
o["Threads"] << Option(1, 1, MAX_THREADS, on_threads);
- o["Hash"] << Option(16, 1, 1024 * 1024, on_hash_size);
+ o["Hash"] << Option(16, 1, MaxHashMB, on_hash_size);
o["Clear Hash"] << Option(on_clear_hash);
o["Ponder"] << Option(true);
o["MultiPV"] << Option(1, 1, 500);
o["Clear Hash"] << Option(on_clear_hash);
o["Ponder"] << Option(true);
o["MultiPV"] << Option(1, 1, 500);