mirror of
https://github.com/sockspls/badfish
synced 2025-05-03 10:09:35 +00:00
Use a per-thread array for generated moves
This greately reduces stack usage and is a prerequisite for next patch. Verified with 40K games both in single and SMP case that there are no regressions. No functional change.
This commit is contained in:
parent
7b2cda95d9
commit
800410eef1
4 changed files with 14 additions and 6 deletions
|
@ -75,7 +75,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
|
||||||
|
|
||||||
assert(d > DEPTH_ZERO);
|
assert(d > DEPTH_ZERO);
|
||||||
|
|
||||||
cur = end = moves;
|
cur = end = moves = pos.this_thread()->get_moves_array();
|
||||||
endBadCaptures = moves + MAX_MOVES - 1;
|
endBadCaptures = moves + MAX_MOVES - 1;
|
||||||
countermoves = cm;
|
countermoves = cm;
|
||||||
ss = s;
|
ss = s;
|
||||||
|
@ -91,10 +91,11 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
|
||||||
}
|
}
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h,
|
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h,
|
||||||
Square sq) : pos(p), history(h), cur(moves), end(moves) {
|
Square sq) : pos(p), history(h) {
|
||||||
|
|
||||||
assert(d <= DEPTH_ZERO);
|
assert(d <= DEPTH_ZERO);
|
||||||
|
|
||||||
|
cur = end = moves = pos.this_thread()->get_moves_array();
|
||||||
if (p.checkers())
|
if (p.checkers())
|
||||||
stage = EVASION;
|
stage = EVASION;
|
||||||
|
|
||||||
|
@ -123,10 +124,11 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats&
|
||||||
}
|
}
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, PieceType pt)
|
MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, PieceType pt)
|
||||||
: pos(p), history(h), cur(moves), end(moves) {
|
: pos(p), history(h) {
|
||||||
|
|
||||||
assert(!pos.checkers());
|
assert(!pos.checkers());
|
||||||
|
|
||||||
|
cur = end = moves = pos.this_thread()->get_moves_array();
|
||||||
stage = PROBCUT;
|
stage = PROBCUT;
|
||||||
|
|
||||||
// In ProbCut we generate only captures better than parent's captured piece
|
// In ProbCut we generate only captures better than parent's captured piece
|
||||||
|
@ -139,6 +141,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, Piece
|
||||||
end += (ttMove != MOVE_NONE);
|
end += (ttMove != MOVE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MovePicker::~MovePicker() { pos.this_thread()->free_moves_array(); }
|
||||||
|
|
||||||
/// score() assign a numerical move ordering score to each move in a move list.
|
/// score() assign a numerical move ordering score to each move in a move list.
|
||||||
/// The moves with highest scores will be picked first.
|
/// The moves with highest scores will be picked first.
|
||||||
|
|
|
@ -87,6 +87,7 @@ public:
|
||||||
MovePicker(const Position&, Move, Depth, const HistoryStats&, Square);
|
MovePicker(const Position&, Move, Depth, const HistoryStats&, Square);
|
||||||
MovePicker(const Position&, Move, const HistoryStats&, PieceType);
|
MovePicker(const Position&, Move, const HistoryStats&, PieceType);
|
||||||
MovePicker(const Position&, Move, Depth, const HistoryStats&, Move*, Search::Stack*);
|
MovePicker(const Position&, Move, Depth, const HistoryStats&, Move*, Search::Stack*);
|
||||||
|
~MovePicker();
|
||||||
|
|
||||||
template<bool SpNode> Move next_move();
|
template<bool SpNode> Move next_move();
|
||||||
|
|
||||||
|
@ -103,8 +104,7 @@ private:
|
||||||
ExtMove killers[4];
|
ExtMove killers[4];
|
||||||
Square recaptureSquare;
|
Square recaptureSquare;
|
||||||
int captureThreshold, stage;
|
int captureThreshold, stage;
|
||||||
ExtMove *cur, *end, *endQuiets, *endBadCaptures;
|
ExtMove *moves, *cur, *end, *endQuiets, *endBadCaptures;
|
||||||
ExtMove moves[MAX_MOVES];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifndef MOVEPICK_H_INCLUDED
|
#endif // #ifndef MOVEPICK_H_INCLUDED
|
||||||
|
|
|
@ -83,10 +83,11 @@ void ThreadBase::wait_for(volatile const bool& b) {
|
||||||
Thread::Thread() /* : splitPoints() */ { // Value-initialization bug in MSVC
|
Thread::Thread() /* : splitPoints() */ { // Value-initialization bug in MSVC
|
||||||
|
|
||||||
searching = false;
|
searching = false;
|
||||||
maxPly = splitPointsSize = 0;
|
maxPly = splitPointsSize = curPage = 0;
|
||||||
activeSplitPoint = NULL;
|
activeSplitPoint = NULL;
|
||||||
activePosition = NULL;
|
activePosition = NULL;
|
||||||
idx = Threads.size();
|
idx = Threads.size();
|
||||||
|
movePages.resize(MAX_PLY_PLUS_6 * MAX_MOVES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,8 @@ struct Thread : public ThreadBase {
|
||||||
virtual void idle_loop();
|
virtual void idle_loop();
|
||||||
bool cutoff_occurred() const;
|
bool cutoff_occurred() const;
|
||||||
bool is_available_to(const Thread* master) const;
|
bool is_available_to(const Thread* master) const;
|
||||||
|
ExtMove* get_moves_array() { return &movePages[curPage += MAX_MOVES]; }
|
||||||
|
void free_moves_array() { curPage -= MAX_MOVES; }
|
||||||
|
|
||||||
template <bool Fake>
|
template <bool Fake>
|
||||||
void split(Position& pos, const Search::Stack* ss, Value alpha, Value beta, Value* bestValue, Move* bestMove,
|
void split(Position& pos, const Search::Stack* ss, Value alpha, Value beta, Value* bestValue, Move* bestMove,
|
||||||
|
@ -125,6 +127,8 @@ struct Thread : public ThreadBase {
|
||||||
Endgames endgames;
|
Endgames endgames;
|
||||||
Pawns::Table pawnsTable;
|
Pawns::Table pawnsTable;
|
||||||
Position* activePosition;
|
Position* activePosition;
|
||||||
|
std::vector<ExtMove> movePages;
|
||||||
|
int curPage;
|
||||||
size_t idx;
|
size_t idx;
|
||||||
int maxPly;
|
int maxPly;
|
||||||
SplitPoint* volatile activeSplitPoint;
|
SplitPoint* volatile activeSplitPoint;
|
||||||
|
|
Loading…
Add table
Reference in a new issue