StateInfo st;
Move ttMove, move;
Value staticValue, bestValue, value, futilityBase, futilityValue;
- bool isCheck, enoughMaterial, moveIsCheck;
+ bool isCheck, enoughMaterial, moveIsCheck, evasionPrunable;
const TTEntry* tte = NULL;
int moveCount = 0;
bool pvNode = (beta - alpha != 1);
}
}
- // Don't search captures and checks with negative SEE values
- if ( !isCheck
+ // Detect blocking evasions that are candidate to be pruned
+ evasionPrunable = isCheck
+ && bestValue != -VALUE_INFINITE
+ && !pos.move_is_capture(move)
+ && pos.type_of_piece_on(move_from(move)) != KING
+ && !pos.can_castle(pos.side_to_move());
+
+ // Don't search moves with negative SEE values
+ if ( (!isCheck || evasionPrunable)
&& move != ttMove
&& !move_is_promotion(move)
&& pos.see_sign(move) < 0)
splitPoint->slaves[i] = 0;
Threads[master].idle = false;
+ Threads[master].stop = false;
Threads[master].splitPoint = splitPoint;
// Allocate available threads setting idle flag to false
if (thread_is_available(i, master))
{
Threads[i].idle = false;
+ Threads[i].stop = false;
Threads[i].splitPoint = splitPoint;
splitPoint->slaves[i] = 1;
splitPoint->cpus++;
// We can release the lock because master and slave threads are already booked
lock_release(&MPLock);
- // Copy the tail of current search stack to the master thread
- memcpy(splitPoint->sstack[master] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack));
-
// Tell the threads that they have work to do. This will make them leave
- // their idle loop. Also copy search stack tail for each slave thread.
+ // their idle loop. But before copy search stack tail for each thread.
for (int i = 0; i < ActiveThreads; i++)
- {
- if (splitPoint->slaves[i])
- memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack));
-
if (i == master || splitPoint->slaves[i])
{
- Threads[i].stop = false;
+ memcpy(splitPoint->sstack[i] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack));
Threads[i].workIsWaiting = true; // This makes the slave to exit from idle_loop()
}
- }
// Everything is set up. The master thread enters the idle loop, from
// which it will instantly launch a search, because its workIsWaiting