Reallocate TT on threadpool resize.
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Sat, 2 Jun 2018 15:02:23 +0000 (17:02 +0200)
committerStéphane Nicolet <cassio@free.fr>
Sat, 2 Jun 2018 15:03:01 +0000 (17:03 +0200)
Makes sure the potential benefit of first touch does not depend on
the order of the UCI commands Threads and Hash, by reallocating the
hash if a Threads is issued. The cost is zeroing the TT once more
than needed. In case the prefered order (first Threads than Hash)
is employed, this amounts to zeroing the default sized TT (16Mb),
which is essentially instantaneous.

Follow up for https://github.com/official-stockfish/Stockfish/pull/1601
where additional data and discussion is available.

Closes https://github.com/official-stockfish/Stockfish/pull/1620

No functional change.

src/main.cpp
src/thread.cpp
src/tt.cpp

index b5067b9..c5bf325 100644 (file)
@@ -44,7 +44,6 @@ int main(int argc, char* argv[]) {
   Search::init();
   Pawns::init();
   Tablebases::init(Options["SyzygyPath"]); // After Bitboards are set
-  TT.resize(Options["Hash"]);
   Threads.set(Options["Threads"]);
   Search::clear(); // After threads are up
 
index cab2d38..43a38e8 100644 (file)
@@ -26,6 +26,7 @@
 #include "thread.h"
 #include "uci.h"
 #include "syzygy/tbprobe.h"
+#include "tt.h"
 
 ThreadPool Threads; // Global object
 
@@ -136,6 +137,9 @@ void ThreadPool::set(size_t requested) {
           push_back(new Thread(size()));
       clear();
   }
+
+  // Reallocate the hash with the new threadpool size
+  TT.resize(Options["Hash"]);
 }
 
 /// ThreadPool::clear() sets threadPool data to initial values.
index 5fa1290..9f0bc4b 100644 (file)
@@ -36,12 +36,7 @@ TranspositionTable TT; // Our global transposition table
 
 void TranspositionTable::resize(size_t mbSize) {
 
-  size_t newClusterCount = mbSize * 1024 * 1024 / sizeof(Cluster);
-
-  if (newClusterCount == clusterCount)
-      return;
-
-  clusterCount = newClusterCount;
+  clusterCount = mbSize * 1024 * 1024 / sizeof(Cluster);
 
   free(mem);
   mem = malloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1);