From 0ff91e16da5d66d7b47274203d460ff0144f1e39 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 25 Jan 2010 12:44:30 +0100 Subject: [PATCH] Do not copy master position in split() A pointer is enough because after a split point has been setup master and slaves thread end up calling sp_search() or sp_search_pv() and here a full copy of split point position is done again, note that even master does another copy (of itself) and this is done before any do_move() call so that master Position is never updated between split() and sp_search(). Signed-off-by: Marco Costalba --- src/position.h | 4 ++-- src/search.cpp | 13 ++++--------- src/thread.h | 2 +- src/uci.cpp | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/position.h b/src/position.h index e7dc3a80..c4dbfcf6 100644 --- a/src/position.h +++ b/src/position.h @@ -147,8 +147,8 @@ public: // Constructors Position(); - Position(const Position& pos); - Position(const std::string& fen); + explicit Position(const Position& pos); + explicit Position(const std::string& fen); // Text input/output void from_fen(const std::string& fen); diff --git a/src/search.cpp b/src/search.cpp index 2244a2f7..1c271561 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1813,8 +1813,7 @@ namespace { assert(threadID >= 0 && threadID < ActiveThreads); assert(ActiveThreads > 1); - Position pos; - pos.fast_copy(sp->pos); + Position pos(*sp->pos); CheckInfo ci(pos); SearchStack* ss = sp->sstack[threadID]; Value value = -VALUE_INFINITE; @@ -1956,8 +1955,7 @@ namespace { assert(threadID >= 0 && threadID < ActiveThreads); assert(ActiveThreads > 1); - Position pos; - pos.fast_copy(sp->pos); + Position pos(*sp->pos); CheckInfo ci(pos); SearchStack* ss = sp->sstack[threadID]; Value value = -VALUE_INFINITE; @@ -2969,7 +2967,7 @@ namespace { splitPoint = SplitPointStack[master] + Threads[master].activeSplitPoints; Threads[master].activeSplitPoints++; - // Initialize the split point object and copy current position + // Initialize the split point object splitPoint->parent = Threads[master].splitPoint; splitPoint->finished = false; splitPoint->ply = ply; @@ -2983,14 +2981,11 @@ namespace { splitPoint->mp = mp; splitPoint->moves = *moves; splitPoint->cpus = 1; - splitPoint->pos.fast_copy(p); + splitPoint->pos = &p; splitPoint->parentSstack = sstck; for (i = 0; i < ActiveThreads; i++) splitPoint->slaves[i] = 0; - // Detach splitPoint Position from the master one - splitPoint->pos.detach(); - // Copy the tail of current search stack to the master thread memcpy(splitPoint->sstack[master] + ply - 1, sstck + ply - 1, 3 * sizeof(SearchStack)); Threads[master].splitPoint = splitPoint; diff --git a/src/thread.h b/src/thread.h index 2ac96813..d12ec845 100644 --- a/src/thread.h +++ b/src/thread.h @@ -46,7 +46,7 @@ const int ACTIVE_SPLIT_POINTS_MAX = 8; struct SplitPoint { SplitPoint *parent; - Position pos; + const Position* pos; SearchStack sstack[THREAD_MAX][PLY_MAX_PLUS_2]; SearchStack *parentSstack; int ply; diff --git a/src/uci.cpp b/src/uci.cpp index 21bbb884..3812a379 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -314,7 +314,7 @@ namespace { string token; int depth, tm, n; - Position pos = RootPosition; + Position pos(RootPosition); if (!(uip >> depth)) return; -- 2.39.2