1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 01:03:09 +00:00

Reduce lock contention in sp_search_pv()

In less then 1% of cases value > sp->bestValue, so avoid
an useless lock in the common case. This is the same change
already applied to sp_search().

Also SplitPoint futilityValue is not volatile because
never changes after has been assigned in split()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-01-26 12:05:38 +01:00
parent 5ca4284027
commit cf9bf4e58f
2 changed files with 30 additions and 26 deletions

View file

@ -2046,37 +2046,40 @@ namespace {
break;
// New best move?
lock_grab(&(sp->lock));
if (value > sp->bestValue && !thread_should_stop(threadID))
if (value > sp->bestValue) // Less then 2% of cases
{
sp->bestValue = value;
if (value > sp->alpha)
lock_grab(&(sp->lock));
if (value > sp->bestValue && !thread_should_stop(threadID))
{
// Ask threads to stop before to modify sp->alpha
if (value >= sp->beta)
sp->bestValue = value;
if (value > sp->alpha)
{
for (int i = 0; i < ActiveThreads; i++)
if (i != threadID && (i == sp->master || sp->slaves[i]))
Threads[i].stop = true;
// Ask threads to stop before to modify sp->alpha
if (value >= sp->beta)
{
for (int i = 0; i < ActiveThreads; i++)
if (i != threadID && (i == sp->master || sp->slaves[i]))
Threads[i].stop = true;
sp->finished = true;
sp->finished = true;
}
sp->alpha = value;
sp_update_pv(sp->parentSstack, ss, sp->ply);
if (value == value_mate_in(sp->ply + 1))
ss[sp->ply].mateKiller = move;
}
sp->alpha = value;
sp_update_pv(sp->parentSstack, ss, sp->ply);
if (value == value_mate_in(sp->ply + 1))
ss[sp->ply].mateKiller = move;
}
// If we are at ply 1, and we are searching the first root move at
// ply 0, set the 'Problem' variable if the score has dropped a lot
// (from the computer's point of view) since the previous iteration.
if ( sp->ply == 1
&& Iteration >= 2
&& -value <= IterationInfo[Iteration-1].value - ProblemMargin)
Problem = true;
// If we are at ply 1, and we are searching the first root move at
// ply 0, set the 'Problem' variable if the score has dropped a lot
// (from the computer's point of view) since the previous iteration.
if ( sp->ply == 1
&& Iteration >= 2
&& -value <= IterationInfo[Iteration-1].value - ProblemMargin)
Problem = true;
}
lock_release(&(sp->lock));
}
lock_release(&(sp->lock));
}
lock_grab(&(sp->lock));

View file

@ -51,7 +51,8 @@ struct SplitPoint {
SearchStack *parentSstack;
int ply;
Depth depth;
volatile Value alpha, beta, bestValue, futilityValue;
volatile Value alpha, beta, bestValue;
Value futilityValue;
bool pvNode;
int master, slaves[THREAD_MAX];
Lock lock;