From 6e5bb3279f84428818f65cbcb9903ba77fd28423 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 13 May 2010 10:56:11 +0200 Subject: [PATCH 1/1] Another split() tweak session Function split() doesn't need to return a value, also remove useless 'master' field. No functional change. Signed-off-by: Marco Costalba --- src/search.cpp | 42 ++++++++++++++++++------------------------ src/thread.h | 4 ++-- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index decd51ce..768b0594 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -89,8 +89,8 @@ namespace { void idle_loop(int threadID, SplitPoint* sp); template - bool split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue, - Depth depth, bool mateThreat, int* moves, MovePicker* mp, int master, bool pvNode); + void split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue, + Depth depth, bool mateThreat, int* moveCount, MovePicker* mp, int master, bool pvNode); private: friend void poll(); @@ -1366,10 +1366,9 @@ namespace { && Iteration <= 99 && TM.available_thread_exists(threadID) && !AbortSearch - && !TM.thread_should_stop(threadID) - && TM.split(pos, ss, ply, &alpha, beta, &bestValue, depth, - mateThreat, &moveCount, &mp, threadID, PvNode)) - break; + && !TM.thread_should_stop(threadID)) + TM.split(pos, ss, ply, &alpha, beta, &bestValue, depth, + mateThreat, &moveCount, &mp, threadID, PvNode); } // Step 19. Check for mate and stalemate @@ -1635,7 +1634,7 @@ namespace { && (move = sp->mp->get_next_move()) != MOVE_NONE && !TM.thread_should_stop(threadID)) { - moveCount = ++sp->moves; + moveCount = ++sp->moveCount; lock_release(&(sp->lock)); assert(move_is_ok(move)); @@ -2589,20 +2588,19 @@ namespace { // split() does the actual work of distributing the work at a node between - // several threads at PV nodes. If it does not succeed in splitting the + // several available threads. If it does not succeed in splitting the // node (because no idle threads are available, or because we have no unused - // split point objects), the function immediately returns false. If - // splitting is possible, a SplitPoint object is initialized with all the - // data that must be copied to the helper threads (the current position and - // search stack, alpha, beta, the search depth, etc.), and we tell our - // helper threads that they have been assigned work. This will cause them - // to instantly leave their idle loops and call sp_search(). When all - // threads have returned from sp_search() then split() returns true. + // split point objects), the function immediately returns. If splitting is + // possible, a SplitPoint object is initialized with all the data that must be + // copied to the helper threads and we tell our helper threads that they have + // been assigned work. This will cause them to instantly leave their idle loops + // and call sp_search(). When all threads have returned from sp_search() then + // split() returns. template - bool ThreadsManager::split(const Position& p, SearchStack* sstck, int ply, Value* alpha, + void ThreadsManager::split(const Position& p, SearchStack* sstck, int ply, Value* alpha, const Value beta, Value* bestValue, Depth depth, bool mateThreat, - int* moves, MovePicker* mp, int master, bool pvNode) { + int* moveCount, MovePicker* mp, int master, bool pvNode) { assert(p.is_ok()); assert(sstck != NULL); assert(ply >= 0 && ply < PLY_MAX); @@ -2614,8 +2612,6 @@ namespace { assert(master >= 0 && master < ActiveThreads); assert(ActiveThreads > 1); - SplitPoint* splitPoint; - lock_grab(&MPLock); // If no other thread is available to help us, or if we have too many @@ -2624,11 +2620,11 @@ namespace { || threads[master].activeSplitPoints >= ACTIVE_SPLIT_POINTS_MAX) { lock_release(&MPLock); - return false; + return; } // Pick the next available split point object from the split point stack - splitPoint = &SplitPointStack[master][threads[master].activeSplitPoints]; + SplitPoint* splitPoint = &SplitPointStack[master][threads[master].activeSplitPoints]; // Initialize the split point object splitPoint->parent = threads[master].splitPoint; @@ -2640,9 +2636,8 @@ namespace { splitPoint->beta = beta; splitPoint->pvNode = pvNode; splitPoint->bestValue = *bestValue; - splitPoint->master = master; splitPoint->mp = mp; - splitPoint->moves = *moves; + splitPoint->moveCount = *moveCount; splitPoint->pos = &p; splitPoint->parentSstack = sstck; for (int i = 0; i < ActiveThreads; i++) @@ -2700,7 +2695,6 @@ namespace { threads[master].splitPoint = splitPoint->parent; lock_release(&MPLock); - return true; } diff --git a/src/thread.h b/src/thread.h index 66acf6f8..6fda35f8 100644 --- a/src/thread.h +++ b/src/thread.h @@ -54,7 +54,7 @@ struct SplitPoint { Depth depth; bool pvNode, mateThreat; Value beta; - int ply, master; + int ply; SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2]; // Const pointers to shared data @@ -65,7 +65,7 @@ struct SplitPoint { Lock lock; volatile Value alpha; volatile Value bestValue; - volatile int moves; + volatile int moveCount; volatile bool stopRequest; volatile int slaves[MAX_THREADS]; }; -- 2.39.2