Skip to content

Commit 9dba7df

Browse files
authored
Prefetch TTable entry on move generation (#1085)
VSTC Elo | 6.20 +- 3.23 (95%) SPRT | 4.0+0.04s Threads=1 Hash=16MB LLR | 3.00 (-2.25, 2.89) [0.00, 3.00] Games | N: 11032 W: 2919 L: 2722 D: 5391 Penta | [42, 1086, 3085, 1239, 64] https://recklesschess.space/test/15314/ Thanks to @dhanaway for the idea. No functional change. Bench: 3204302
1 parent a4e68fd commit 9dba7df

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

src/board.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,28 @@ impl Board {
8383
self.state.keys.full() ^ ZOBRIST.fiftymove_clock[self.fiftymove_clock_bucket()]
8484
}
8585

86+
pub fn key_after(&self, mv: Move) -> u64 {
87+
let from = mv.from();
88+
let to = mv.to();
89+
let piece = self.piece_on(from);
90+
let captured = self.piece_on(to);
91+
92+
let mut key = self.state.keys.full() ^ ZOBRIST.side ^ ZOBRIST.pieces[piece][from] ^ ZOBRIST.pieces[piece][to];
93+
94+
if captured != Piece::None {
95+
key ^= ZOBRIST.pieces[captured][to];
96+
}
97+
98+
let fiftymove_clock = if captured != Piece::None || piece.piece_type() == PieceType::Pawn {
99+
0
100+
} else {
101+
self.fiftymove_clock() + 1
102+
};
103+
let bucket = (fiftymove_clock.saturating_sub(8) as usize / 8).min(15);
104+
105+
key ^ ZOBRIST.fiftymove_clock[bucket]
106+
}
107+
86108
pub const fn pawn_key(&self) -> u64 {
87109
self.state.keys.pawn()
88110
}

src/search.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,7 @@ fn update_continuation_histories(td: &mut ThreadData, ply: isize, piece: Piece,
14141414
}
14151415

14161416
fn make_move(td: &mut ThreadData, ply: isize, mv: Move) {
1417+
td.shared.tt.prefetch(td.board.key_after(mv));
14171418
td.stack[ply].mv = mv;
14181419
td.stack[ply].piece = td.board.moved_piece(mv);
14191420
td.stack[ply].conthist =

0 commit comments

Comments
 (0)