Microptimize first_entry() for 32bits
authorMarco Costalba <mcostalba@gmail.com>
Sat, 9 Feb 2013 09:22:34 +0000 (10:22 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 9 Feb 2013 09:55:38 +0000 (10:55 +0100)
Do a 32bit bitwise 'and' instead of a 64bit
subtract and bitwise 'and'.

This is possible because even in the biggest
hash table case (8GB) the number of entries
is 2^29 so storable in an unsigned int.

No functional change.

src/tt.cpp
src/tt.h

index 2445f79420692c870922e7c88e77906af3ff0144..fa0d39de00db423202eab55e5d2e82d0f94ebd4a 100644 (file)
@@ -32,12 +32,14 @@ TranspositionTable TT; // Our global transposition table
 
 void TranspositionTable::set_size(size_t mbSize) {
 
-  size_t newSize = 1ULL << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize]));
+  assert(msb((mbSize << 20) / sizeof(TTEntry)) < 32);
 
-  if (newSize == size)
+  uint32_t size = 1 << msb((mbSize << 20) / sizeof(TTEntry[ClusterSize]));
+
+  if (clusterMask == size - 1)
       return;
 
-  size = newSize;
+  clusterMask = size - 1;
   delete [] entries;
   entries = new (std::nothrow) TTEntry[size * ClusterSize];
 
@@ -58,7 +60,7 @@ void TranspositionTable::set_size(size_t mbSize) {
 
 void TranspositionTable::clear() {
 
-  memset(entries, 0, size * sizeof(TTEntry[ClusterSize]));
+  memset(entries, 0, (clusterMask + 1) * sizeof(TTEntry[ClusterSize]));
 }
 
 
index 3484f0eb46163895d9dca72b47a70bd6e6fa5453..81bfd3b267385c2d50951c02d3736f5cf1601a32 100644 (file)
--- a/src/tt.h
+++ b/src/tt.h
@@ -96,7 +96,7 @@ public:
   void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV, Value kingD);
 
 private:
-  size_t size;
+  uint32_t clusterMask;
   TTEntry* entries;
   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 & (size - 1)) * ClusterSize;
+  return entries + ((uint32_t)key & clusterMask) * ClusterSize;
 }