And retire a redundant field. This is important also
from a concept point of view becuase we want to keep
SMP structures as simple as possible with the only
strictly necessary data.
Verified with
dbg_hit_on(sp->spLevel != level)
that the values are 100% the same out of more 50K samples.
No functional change.
&& sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT
&& available_to(Threads[i]))
{
&& sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT
&& available_to(Threads[i]))
{
- int score = sp->spLevel * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1;
+ // Compute the recursive split points chain size
+ int level = -1;
+ for (SplitPoint* spp = Threads[i]->activeSplitPoint; spp; spp = spp->parentSplitPoint)
+ level++;
+
+ int score = level * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1;
if (bestSp)
{
sp = bestSp;
if (bestSp)
{
sp = bestSp;
// Recheck the conditions under lock protection
Threads.mutex.lock();
sp->mutex.lock();
// Recheck the conditions under lock protection
Threads.mutex.lock();
sp->mutex.lock();
sp.masterThread = this;
sp.parentSplitPoint = activeSplitPoint;
sp.masterThread = this;
sp.parentSplitPoint = activeSplitPoint;
- sp.spLevel = activeSplitPoint ? activeSplitPoint->spLevel + 1 : 0;
sp.slavesMask = 0, sp.slavesMask.set(idx);
sp.slavesCount = 1;
sp.depth = depth;
sp.slavesMask = 0, sp.slavesMask.set(idx);
sp.slavesCount = 1;
sp.depth = depth;
- while ( sp.slavesCount < MAX_SLAVES_PER_SPLITPOINT
+ while ( sp.slavesCount < MAX_SLAVES_PER_SPLITPOINT
&& (slave = Threads.available_slave(this)) != NULL)
{
sp.slavesMask.set(slave->idx);
&& (slave = Threads.available_slave(this)) != NULL)
{
sp.slavesMask.set(slave->idx);
const Position* pos;
Search::Stack* ss;
Thread* masterThread;
const Position* pos;
Search::Stack* ss;
Thread* masterThread;
Depth depth;
Value beta;
int nodeType;
Depth depth;
Value beta;
int nodeType;