summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7b2cda9)
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.
+ cur = end = moves = pos.this_thread()->get_moves_array();
endBadCaptures = moves + MAX_MOVES - 1;
countermoves = cm;
ss = s;
endBadCaptures = moves + MAX_MOVES - 1;
countermoves = cm;
ss = s;
}
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) {
+ cur = end = moves = pos.this_thread()->get_moves_array();
if (p.checkers())
stage = EVASION;
if (p.checkers())
stage = EVASION;
}
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) {
+ cur = end = moves = pos.this_thread()->get_moves_array();
stage = PROBCUT;
// In ProbCut we generate only captures better than parent's captured piece
stage = PROBCUT;
// In ProbCut we generate only captures better than parent's captured 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.
/// The moves with highest scores will be picked first.
/// score() assign a numerical move ordering score to each move in a move list.
/// The moves with highest scores will be picked first.
MovePicker(const Position&, Move, Depth, const HistoryStats&, Square);
MovePicker(const Position&, Move, const HistoryStats&, PieceType);
MovePicker(const Position&, Move, Depth, const HistoryStats&, Move*, Search::Stack*);
MovePicker(const Position&, Move, Depth, const HistoryStats&, Square);
MovePicker(const Position&, Move, const HistoryStats&, PieceType);
MovePicker(const Position&, Move, Depth, const HistoryStats&, Move*, Search::Stack*);
template<bool SpNode> Move next_move();
template<bool SpNode> Move next_move();
ExtMove killers[4];
Square recaptureSquare;
int captureThreshold, stage;
ExtMove killers[4];
Square recaptureSquare;
int captureThreshold, stage;
- ExtMove *cur, *end, *endQuiets, *endBadCaptures;
- ExtMove moves[MAX_MOVES];
+ ExtMove *moves, *cur, *end, *endQuiets, *endBadCaptures;
};
#endif // #ifndef MOVEPICK_H_INCLUDED
};
#endif // #ifndef MOVEPICK_H_INCLUDED
Thread::Thread() /* : splitPoints() */ { // Value-initialization bug in MSVC
searching = false;
Thread::Thread() /* : splitPoints() */ { // Value-initialization bug in MSVC
searching = false;
- maxPly = splitPointsSize = 0;
+ maxPly = splitPointsSize = curPage = 0;
activeSplitPoint = NULL;
activePosition = NULL;
idx = Threads.size();
activeSplitPoint = NULL;
activePosition = NULL;
idx = Threads.size();
+ movePages.resize(MAX_PLY_PLUS_6 * MAX_MOVES);
virtual void idle_loop();
bool cutoff_occurred() const;
bool is_available_to(const Thread* master) const;
virtual void idle_loop();
bool cutoff_occurred() 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>
void split(Position& pos, const Search::Stack* ss, Value alpha, Value beta, Value* bestValue, Move* bestMove,
template <bool Fake>
void split(Position& pos, const Search::Stack* ss, Value alpha, Value beta, Value* bestValue, Move* bestMove,
Endgames endgames;
Pawns::Table pawnsTable;
Position* activePosition;
Endgames endgames;
Pawns::Table pawnsTable;
Position* activePosition;
+ std::vector<ExtMove> movePages;
+ int curPage;
size_t idx;
int maxPly;
SplitPoint* volatile activeSplitPoint;
size_t idx;
int maxPly;
SplitPoint* volatile activeSplitPoint;