Store distinct upper and lower bound scores

This is more complex than what I'd like but I
was unable to split in small chunks.

Here we add 2 slots to TTEntry (valueUpper and depthUpper)
so that sizeof(TTEntry) returns to the original 16 bytes
and we can pack exactly 4 entries in a 64 bytes cache line.

Now we save an upper bound score alongside a lower (exact)
score. The idea is to increase TT cut-offs rates becuase
there is now an higher probability for a node to use TT info.

This patch is highly experimental and probably needs further
steps as is hinted by an unrealistic bench number:

bench: 2022385
This commit is contained in:
Marco Costalba
2012-12-09 11:08:37 +01:00
parent 23bdd06442
commit feeafb0a50
4 changed files with 94 additions and 42 deletions

View File

@@ -46,19 +46,43 @@ class TTEntry {
public:
void save(uint32_t k, Value v, Bound b, Depth d, Move m, int g) {
key32 = (uint32_t)k;
move16 = (uint16_t)m;
bound = (uint8_t)b;
generation8 = (uint8_t)g;
value16 = (int16_t)v;
depth16 = (int16_t)d;
key32 = (uint32_t)k;
move16 = (uint16_t)m;
bound = (uint8_t)b;
generation8 = (uint8_t)g;
valueUpper = (int16_t)(b & BOUND_UPPER ? v : VALUE_NONE);
depthUpper = (int16_t)(b & BOUND_UPPER ? d : DEPTH_NONE);
valueLower = (int16_t)(b & BOUND_LOWER ? v : VALUE_NONE);
depthLower = (int16_t)(b & BOUND_LOWER ? d : DEPTH_NONE);
}
void update(Value v, Bound b, Depth d, Move m, int g) {
move16 = (uint16_t)m;
bound |= (uint8_t)b;
generation8 = (uint8_t)g;
if (b & BOUND_UPPER)
{
valueUpper = (int16_t)v;
depthUpper = (int16_t)d;
}
if (b & BOUND_LOWER)
{
valueLower = (int16_t)v;
depthLower = (int16_t)d;
}
}
void set_generation(int g) { generation8 = (uint8_t)g; }
uint32_t key() const { return key32; }
Depth depth() const { return (Depth)depth16; }
Depth depth() const { return (Depth)depthLower; }
Depth depth_upper() const { return (Depth)depthUpper; }
Move move() const { return (Move)move16; }
Value value() const { return (Value)value16; }
Value value() const { return (Value)valueLower; }
Value value_upper() const { return (Value)valueUpper; }
Bound type() const { return (Bound)bound; }
int generation() const { return (int)generation8; }
@@ -66,7 +90,7 @@ private:
uint32_t key32;
uint16_t move16;
uint8_t bound, generation8;
int16_t value16, depth16;
int16_t valueLower, depthLower, valueUpper, depthUpper;
};
@@ -96,7 +120,7 @@ public:
~TranspositionTable();
void set_size(size_t mbSize);
void clear();
void store(const Key posKey, Value v, Bound type, Depth d, Move m);
void store(const Key posKey, Value v, Bound b, Depth d, Move m);
TTEntry* probe(const Key posKey) const;
void new_search();
TTEntry* first_entry(const Key posKey) const;