// Don't overwrite more valuable entries
if ( (k >> 48) != key16
|| d > depth8 - 2
- /* || g != (genBound8 & 0xFC) // Any matching keys are already refreshed by probe() */
+ /* || g != (genBound8 & 0xFC) // Matching non-zero keys are already refreshed by probe() */
|| b == BOUND_EXACT)
{
key16 = (uint16_t)(k >> 48);
/// A TranspositionTable consists of a power of 2 number of clusters and each
/// cluster consists of ClusterSize number of TTEntry. Each non-empty entry
/// contains information of exactly one position. The size of a cluster should
-/// not be bigger than a cache line size. In case it is less, it should be padded
-/// to guarantee always aligned accesses.
+/// divide the size of a cache line size, to ensure that clusters never cross
+/// cache lines. This ensures best cache performance, as the cacheline is
+/// prefetched, as soon as possible.
class TranspositionTable {
struct Cluster {
TTEntry entry[ClusterSize];
- char padding[2]; // Align to the cache line size
+ char padding[2]; // Align to a divisor of the cache line size
};
- static_assert(sizeof(Cluster) == CacheLineSize / 2, "Cluster size incorrect");
+ static_assert(CacheLineSize % sizeof(Cluster) == 0, "Cluster size incorrect");
public:
~TranspositionTable() { free(mem); }