X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=2c91d7789c4bb5bef69a61b44ff94b6af6c2d432;hb=9ecdfd24018722dc70fb0a448c1c9d731d6e30a2;hp=5a4b56ba45ae2383bed345969d93432db8442f98;hpb=c28b9ef182b4a0c3d0483654ebc2b2aca4fc731c;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 5a4b56ba..2c91d778 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -59,6 +59,10 @@ namespace { // Used for debugging SMP code. const bool FakeSplit = false; + // Fast lookup table of sliding pieces indexed by Piece + const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 }; + inline bool piece_is_slider(Piece p) { return Slidings[p]; } + // ThreadsManager class is used to handle all the threads related stuff in search, // init, starting, parking and, the most important, launching a slave thread at a // split point are what this class does. All the access to shared thread data is @@ -259,7 +263,6 @@ namespace { // Multi-threads related variables Depth MinimumSplitDepth; int MaxThreadsPerSplitPoint; - bool UseSleepingMaster; ThreadsManager ThreadsMgr; // Node counters, used only by thread[0] but try to keep in different cache @@ -452,7 +455,6 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[ MaxThreadsPerSplitPoint = Options["Maximum Number of Threads per Split Point"].value(); MultiPV = Options["MultiPV"].value(); UseLogFile = Options["Use Search Log"].value(); - UseSleepingMaster = Options["Use Sleeping Master"].value(); if (UseLogFile) LogFile.open(Options["Search Log Filename"].value().c_str(), std::ios::out | std::ios::app); @@ -1932,7 +1934,7 @@ split_point_start: // At split points actual search starts from here int t = current_search_time(); // Poll for input - if (Bioskey()) + if (data_available()) { // We are line oriented, don't read single chars std::string command; @@ -2180,9 +2182,6 @@ split_point_start: // At split points actual search starts from here assert(threadID >= 0 && threadID < MAX_THREADS); - int i; - bool allFinished = false; - while (true) { // Slave threads can exit as soon as AllThreadsShouldExit raises, @@ -2198,23 +2197,23 @@ split_point_start: // At split points actual search starts from here // instead of wasting CPU time polling for work. while ( threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING - || (threads[threadID].state == THREAD_AVAILABLE && (!sp || UseSleepingMaster))) + || (!sp && threads[threadID].state == THREAD_AVAILABLE)) { - lock_grab(&MPLock); + assert(!sp); + assert(threadID != 0); - // Test with lock held to avoid races with wake_sleeping_thread() - for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {} - allFinished = (i == ActiveThreads); + if (AllThreadsShouldExit) + break; - // Retest sleep conditions under lock protection - if ( AllThreadsShouldExit - || allFinished - || !( threadID >= ActiveThreads - || threads[threadID].state == THREAD_INITIALIZING - || (threads[threadID].state == THREAD_AVAILABLE && (!sp || UseSleepingMaster)))) + lock_grab(&MPLock); + + // Retest condition under lock protection + if (!( threadID >= ActiveThreads + || threads[threadID].state == THREAD_INITIALIZING + || (!sp && threads[threadID].state == THREAD_AVAILABLE))) { lock_release(&MPLock); - break; + continue; } // Put thread to sleep @@ -2244,19 +2243,14 @@ split_point_start: // At split points actual search starts from here assert(threads[threadID].state == THREAD_SEARCHING); threads[threadID].state = THREAD_AVAILABLE; - - // Wake up master thread so to allow it to return from the idle loop in - // case we are the last slave of the split point. - if (UseSleepingMaster && threadID != tsp->master && threads[tsp->master].state == THREAD_AVAILABLE) - wake_sleeping_thread(tsp->master); } // If this thread is the master of a split point and all slaves have // finished their work at this split point, return from the idle loop. - for (i = 0; sp && i < ActiveThreads && !sp->slaves[i]; i++) {} - allFinished = (i == ActiveThreads); + int i = 0; + for ( ; sp && i < ActiveThreads && !sp->slaves[i]; i++) {} - if (allFinished) + if (i == ActiveThreads) { // Because sp->slaves[] is reset under lock protection, // be sure sp->lock has been released before to return. @@ -2320,7 +2314,7 @@ split_point_start: // At split points actual search starts from here if (!ok) { cout << "Failed to create thread number " << i << endl; - Application::exit_with_failure(); + exit(EXIT_FAILURE); } // Wait until the thread has finished launching and is gone to sleep @@ -2464,7 +2458,6 @@ split_point_start: // At split points actual search starts from here // Initialize the split point object splitPoint.parent = masterThread.splitPoint; - splitPoint.master = master; splitPoint.stopRequest = false; splitPoint.ply = ply; splitPoint.depth = depth;