// 置換表のサイズを確保しなおす。 void TranspositionTable::resize(size_t mbSize) { size_t newClusterCount = size_t(1) << MSB64((mbSize * 1024 * 1024) / sizeof(Cluster)); // 同じサイズなら確保しなおす必要はない。 if (newClusterCount == clusterCount) return; clusterCount = newClusterCount; free(mem); // tableはCacheLineSizeでalignされたメモリに配置したいので、CacheLineSize-1だけ余分に確保する。 // callocではなくmallocにしないと初回の探索でTTにアクセスするとき、特に巨大なTTだと // 極めて遅くなるので、mallocで確保して、ゼロクリアすることでこれを回避する。 // cf. Explicitly zero TT upon resize. : https://github.com/official-stockfish/Stockfish/commit/2ba47416cbdd5db2c7c79257072cd8675b61721f mem = malloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1); if (!mem) { std::cout << "info string Error : Failed to allocate " << mbSize << "MB for transposition table. ClusterCount = " << newClusterCount << std::endl; my_exit(); } table = (Cluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1)); }
// 置換表のサイズを確保しなおす。 void TranspositionTable::resize(size_t mbSize) { size_t newClusterCount = size_t(1) << MSB64((mbSize * 1024 * 1024) / sizeof(Cluster)); // 同じサイズなら確保しなおす必要はない。 if (newClusterCount == clusterCount) return; clusterCount = newClusterCount; free(mem); // tableはCacheLineSizeでalignされたメモリに配置したいので、CacheLineSize-1だけ余分に確保する。 mem = calloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1, 1); if (!mem) { std::cout << "info string Error : Failed to allocate " << mbSize << "MB for transposition table." << std::endl; exit(EXIT_FAILURE); } table = (Cluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1)); }