Explicitly zero TT upon resize.
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Mon, 1 Jan 2018 09:10:41 +0000 (10:10 +0100)
committerMarco Costalba <mcostalba@users.noreply.github.com>
Mon, 1 Jan 2018 12:17:51 +0000 (13:17 +0100)
as discussed in issue #1349, the way pages are allocated with calloc might imply some overhead on first write.
This overhead can be large and slow down the first search after a TT resize significantly, especially for large TT.
Using an explicit clear of the TT on resize fixes this problem.

Not implemented, but possibly useful for large TT, is to do this zero-ing using all search threads. Not only would this be faster, it could also lead to a more favorable memory allocation on numa systems with a first touch policy.

No functional change.

src/tt.cpp

index a1ef44422832781d1325232da2d30a3a48582149..354ead87adb34dac0a007dcf064067fe9362b9d8 100644 (file)
@@ -41,7 +41,7 @@ void TranspositionTable::resize(size_t mbSize) {
   clusterCount = newClusterCount;
 
   free(mem);
-  mem = calloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1, 1);
+  mem = malloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1);
 
   if (!mem)
   {
@@ -51,6 +51,7 @@ void TranspositionTable::resize(size_t mbSize) {
   }
 
   table = (Cluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1));
+  clear();
 }