mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Move prefetch() out of TT
This code is platform specific and has nothing to do with TT class, so move to misc.cpp This patch is a prerequisite to use extend prefetch use also to other hash tables apart from Transposition Table. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
221f41c2df
commit
47ee6d9fa4
5 changed files with 40 additions and 43 deletions
26
src/misc.cpp
26
src/misc.cpp
|
@ -39,6 +39,10 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NO_PREFETCH)
|
||||||
|
# include <xmmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
@ -287,4 +291,26 @@ int Bioskey()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// prefetch() preloads the given address in L1/L2 cache. This is a non
|
||||||
|
/// blocking function and do not stalls the CPU waiting for data to be
|
||||||
|
/// loaded from RAM, that can be very slow.
|
||||||
|
#if defined(NO_PREFETCH)
|
||||||
|
void prefetch(char*) {}
|
||||||
|
#else
|
||||||
|
|
||||||
|
void prefetch(char* addr) {
|
||||||
|
|
||||||
|
#if defined(__INTEL_COMPILER) || defined(__ICL)
|
||||||
|
// This hack prevents prefetches to be optimized away by
|
||||||
|
// Intel compiler. Both MSVC and gcc seems not affected.
|
||||||
|
__asm__ ("");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_mm_prefetch(addr, _MM_HINT_T2);
|
||||||
|
_mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -55,6 +55,7 @@ extern const std::string engine_name();
|
||||||
extern int get_system_time();
|
extern int get_system_time();
|
||||||
extern int cpu_count();
|
extern int cpu_count();
|
||||||
extern int Bioskey();
|
extern int Bioskey();
|
||||||
|
extern void prefetch(char* addr);
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
|
@ -772,7 +772,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefetch TT access as soon as we know key is updated
|
// Prefetch TT access as soon as we know key is updated
|
||||||
TT.prefetch(key);
|
prefetch((char*)TT.first_entry(key));
|
||||||
|
|
||||||
// Move the piece
|
// Move the piece
|
||||||
Bitboard move_bb = make_move_bb(from, to);
|
Bitboard move_bb = make_move_bb(from, to);
|
||||||
|
@ -1250,7 +1250,7 @@ void Position::do_null_move(StateInfo& backupSt) {
|
||||||
st->key ^= zobEp[st->epSquare];
|
st->key ^= zobEp[st->epSquare];
|
||||||
|
|
||||||
st->key ^= zobSideToMove;
|
st->key ^= zobSideToMove;
|
||||||
TT.prefetch(st->key);
|
prefetch((char*)TT.first_entry(st->key));
|
||||||
|
|
||||||
sideToMove = opposite_color(sideToMove);
|
sideToMove = opposite_color(sideToMove);
|
||||||
st->epSquare = SQ_NONE;
|
st->epSquare = SQ_NONE;
|
||||||
|
|
38
src/tt.cpp
38
src/tt.cpp
|
@ -25,9 +25,6 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#if !defined(NO_PREFETCH)
|
|
||||||
# include <xmmintrin.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "movegen.h"
|
#include "movegen.h"
|
||||||
#include "tt.h"
|
#include "tt.h"
|
||||||
|
@ -91,16 +88,6 @@ void TranspositionTable::clear() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// TranspositionTable::first_entry returns a pointer to the first
|
|
||||||
/// entry of a cluster given a position. The low 32 bits of the key
|
|
||||||
/// are used to get the index in the table.
|
|
||||||
|
|
||||||
inline TTEntry* TranspositionTable::first_entry(const Key posKey) const {
|
|
||||||
|
|
||||||
return entries[uint32_t(posKey) & (size - 1)].data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// TranspositionTable::store writes a new entry containing a position,
|
/// TranspositionTable::store writes a new entry containing a position,
|
||||||
/// a value, a value type, a search depth, and a best move to the
|
/// a value, a value type, a search depth, and a best move to the
|
||||||
/// transposition table. Transposition table is organized in clusters of
|
/// transposition table. Transposition table is organized in clusters of
|
||||||
|
@ -160,31 +147,6 @@ TTEntry* TranspositionTable::retrieve(const Key posKey) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// TranspositionTable::prefetch looks up the current position in the
|
|
||||||
/// transposition table and load it in L1/L2 cache. This is a non
|
|
||||||
/// blocking function and do not stalls the CPU waiting for data
|
|
||||||
/// to be loaded from RAM, that can be very slow. When we will
|
|
||||||
/// subsequently call retrieve() the TT data will be already
|
|
||||||
/// quickly accessible in L1/L2 CPU cache.
|
|
||||||
#if defined(NO_PREFETCH)
|
|
||||||
void TranspositionTable::prefetch(const Key) const {}
|
|
||||||
#else
|
|
||||||
|
|
||||||
void TranspositionTable::prefetch(const Key posKey) const {
|
|
||||||
|
|
||||||
#if defined(__INTEL_COMPILER) || defined(__ICL)
|
|
||||||
// This hack prevents prefetches to be optimized away by
|
|
||||||
// Intel compiler. Both MSVC and gcc seems not affected.
|
|
||||||
__asm__ ("");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char const* addr = (char*)first_entry(posKey);
|
|
||||||
_mm_prefetch(addr, _MM_HINT_T2);
|
|
||||||
_mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// TranspositionTable::new_search() is called at the beginning of every new
|
/// TranspositionTable::new_search() is called at the beginning of every new
|
||||||
/// search. It increments the "generation" variable, which is used to
|
/// search. It increments the "generation" variable, which is used to
|
||||||
/// distinguish transposition table entries from previous searches from
|
/// distinguish transposition table entries from previous searches from
|
||||||
|
|
14
src/tt.h
14
src/tt.h
|
@ -108,15 +108,13 @@ public:
|
||||||
void clear();
|
void clear();
|
||||||
void store(const Key posKey, Value v, ValueType type, Depth d, Move m, Value statV, Value kingD);
|
void store(const Key posKey, Value v, ValueType type, Depth d, Move m, Value statV, Value kingD);
|
||||||
TTEntry* retrieve(const Key posKey) const;
|
TTEntry* retrieve(const Key posKey) const;
|
||||||
void prefetch(const Key posKey) const;
|
|
||||||
void new_search();
|
void new_search();
|
||||||
void insert_pv(const Position& pos, Move pv[]);
|
void insert_pv(const Position& pos, Move pv[]);
|
||||||
void extract_pv(const Position& pos, Move pv[], const int PLY_MAX);
|
void extract_pv(const Position& pos, Move pv[], const int PLY_MAX);
|
||||||
int full() const;
|
int full() const;
|
||||||
|
TTEntry* first_entry(const Key posKey) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline TTEntry* first_entry(const Key posKey) const;
|
|
||||||
|
|
||||||
// Be sure 'writes' is at least one cache line away
|
// Be sure 'writes' is at least one cache line away
|
||||||
// from read only variables.
|
// from read only variables.
|
||||||
unsigned char pad_before[64 - sizeof(unsigned)];
|
unsigned char pad_before[64 - sizeof(unsigned)];
|
||||||
|
@ -130,4 +128,14 @@ private:
|
||||||
|
|
||||||
extern TranspositionTable TT;
|
extern TranspositionTable TT;
|
||||||
|
|
||||||
|
|
||||||
|
/// TranspositionTable::first_entry returns a pointer to the first
|
||||||
|
/// entry of a cluster given a position. The low 32 bits of the key
|
||||||
|
/// are used to get the index in the table.
|
||||||
|
|
||||||
|
inline TTEntry* TranspositionTable::first_entry(const Key posKey) const {
|
||||||
|
|
||||||
|
return entries[uint32_t(posKey) & (size - 1)].data;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // !defined(TT_H_INCLUDED)
|
#endif // !defined(TT_H_INCLUDED)
|
||||||
|
|
Loading…
Add table
Reference in a new issue