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:
parent
3c31776a20
commit
936cd5b83d
2 changed files with 34 additions and 43 deletions
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue