1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Simplify locking in splitpoint search

One rule: Always lock before picking up a move.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Joona Kiiski 2010-02-24 16:44:34 +02:00 committed by Marco Costalba
parent 3c31776a20
commit 936cd5b83d
2 changed files with 34 additions and 43 deletions

View file

@ -99,9 +99,4 @@ typedef CRITICAL_SECTION Lock;
#endif #endif
static inline bool lock_grab_bool(Lock* x) {
lock_grab(x);
return true;
}
#endif // !defined(LOCK_H_INCLUDED) #endif // !defined(LOCK_H_INCLUDED)

View file

@ -1797,8 +1797,9 @@ namespace {
bool useFutilityPruning = sp->depth < 7 * OnePly //FIXME: sync with search bool useFutilityPruning = sp->depth < 7 * OnePly //FIXME: sync with search
&& !isCheck; && !isCheck;
while ( lock_grab_bool(&(sp->lock)) lock_grab(&(sp->lock));
&& sp->bestValue < sp->beta
while ( sp->bestValue < sp->beta
&& !TM.thread_should_stop(threadID) && !TM.thread_should_stop(threadID)
&& (move = sp->mp->get_next_move()) != MOVE_NONE) && (move = sp->mp->get_next_move()) != MOVE_NONE)
{ {
@ -1826,20 +1827,20 @@ namespace {
if ( moveCount >= futility_move_count(sp->depth) if ( moveCount >= futility_move_count(sp->depth)
&& ok_to_prune(pos, move, ss[sp->ply].threatMove) && ok_to_prune(pos, move, ss[sp->ply].threatMove)
&& sp->bestValue > value_mated_in(PLY_MAX)) && sp->bestValue > value_mated_in(PLY_MAX))
{
lock_grab(&(sp->lock));
continue; continue;
}
// Value based pruning // Value based pruning
Value futilityValueScaled = sp->futilityValue - moveCount * 8; //FIXME: sync with search Value futilityValueScaled = sp->futilityValue - moveCount * 8; //FIXME: sync with search
if (futilityValueScaled < sp->beta) if (futilityValueScaled < sp->beta)
{ {
if (futilityValueScaled > sp->bestValue) // Less then 1% of cases lock_grab(&(sp->lock));
{
lock_grab(&(sp->lock)); if (futilityValueScaled > sp->bestValue)
if (futilityValueScaled > sp->bestValue) sp->bestValue = futilityValueScaled;
sp->bestValue = futilityValueScaled;
lock_release(&(sp->lock));
}
continue; continue;
} }
} }
@ -1875,26 +1876,23 @@ namespace {
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE); assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
// New best move? // New best move?
if (value > sp->bestValue) // Less then 2% of cases lock_grab(&(sp->lock));
if (value > sp->bestValue && !TM.thread_should_stop(threadID))
{ {
lock_grab(&(sp->lock)); sp->bestValue = value;
if (value > sp->bestValue && !TM.thread_should_stop(threadID)) if (sp->bestValue >= sp->beta)
{ {
sp->bestValue = value; sp->stopRequest = true;
if (sp->bestValue >= sp->beta) sp_update_pv(sp->parentSstack, ss, sp->ply);
{
sp->stopRequest = true;
sp_update_pv(sp->parentSstack, ss, sp->ply);
}
} }
lock_release(&(sp->lock));
} }
} }
/* Here we have the lock still grabbed */ /* Here we have the lock still grabbed */
sp->cpus--;
sp->slaves[threadID] = 0; sp->slaves[threadID] = 0;
sp->cpus--;
lock_release(&(sp->lock)); lock_release(&(sp->lock));
} }
@ -1920,8 +1918,9 @@ namespace {
int moveCount; int moveCount;
Move move; Move move;
while ( lock_grab_bool(&(sp->lock)) lock_grab(&(sp->lock));
&& sp->alpha < sp->beta
while ( sp->alpha < sp->beta
&& !TM.thread_should_stop(threadID) && !TM.thread_should_stop(threadID)
&& (move = sp->mp->get_next_move()) != MOVE_NONE) && (move = sp->mp->get_next_move()) != MOVE_NONE)
{ {
@ -1982,33 +1981,30 @@ namespace {
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE); assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
// New best move? // New best move?
if (value > sp->bestValue) // Less then 2% of cases lock_grab(&(sp->lock));
if (value > sp->bestValue && !TM.thread_should_stop(threadID))
{ {
lock_grab(&(sp->lock)); sp->bestValue = value;
if (value > sp->bestValue && !TM.thread_should_stop(threadID)) if (value > sp->alpha)
{ {
sp->bestValue = value; // Ask threads to stop before to modify sp->alpha
if (value > sp->alpha) if (value >= sp->beta)
{ sp->stopRequest = true;
// Ask threads to stop before to modify sp->alpha
if (value >= sp->beta)
sp->stopRequest = true;
sp->alpha = value; sp->alpha = value;
sp_update_pv(sp->parentSstack, ss, sp->ply); sp_update_pv(sp->parentSstack, ss, sp->ply);
if (value == value_mate_in(sp->ply + 1)) if (value == value_mate_in(sp->ply + 1))
ss[sp->ply].mateKiller = move; ss[sp->ply].mateKiller = move;
}
} }
lock_release(&(sp->lock));
} }
} }
/* Here we have the lock still grabbed */ /* Here we have the lock still grabbed */
sp->cpus--;
sp->slaves[threadID] = 0; sp->slaves[threadID] = 0;
sp->cpus--;
lock_release(&(sp->lock)); lock_release(&(sp->lock));
} }