From 33772a0418117f88cc04de7833bdfdb05640f8bc Mon Sep 17 00:00:00 2001 From: nodchip Date: Mon, 8 Jun 2020 23:46:06 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=91=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/eval/nnue/evaluate_nnue_learner.cpp | 6 +++--- src/learn/learner.cpp | 17 +++++++++-------- src/learn/multi_think.h | 14 +++++++------- src/search.cpp | 20 ++++++++++---------- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/eval/nnue/evaluate_nnue_learner.cpp b/src/eval/nnue/evaluate_nnue_learner.cpp index b474f2e2..636f90e1 100644 --- a/src/eval/nnue/evaluate_nnue_learner.cpp +++ b/src/eval/nnue/evaluate_nnue_learner.cpp @@ -35,7 +35,7 @@ namespace { std::vector examples; // examplesの排他制御をするMutex -Mutex examples_mutex; +std::mutex examples_mutex; // ミニバッチのサンプル数 uint64_t batch_size; @@ -158,7 +158,7 @@ void AddExample(Position& pos, Color rootColor, } } - std::lock_guard lock(examples_mutex); + std::lock_guard lock(examples_mutex); examples.push_back(std::move(example)); } @@ -170,7 +170,7 @@ void UpdateParameters(uint64_t epoch) { const auto learning_rate = static_cast( get_eta() / batch_size); - std::lock_guard lock(examples_mutex); + std::lock_guard lock(examples_mutex); std::shuffle(examples.begin(), examples.end(), rng); while (examples.size() >= batch_size) { std::vector batch(examples.end() - batch_size, examples.end()); diff --git a/src/learn/learner.cpp b/src/learn/learner.cpp index c143e451..526c027c 100644 --- a/src/learn/learner.cpp +++ b/src/learn/learner.cpp @@ -15,6 +15,7 @@ #if defined(EVAL_LEARN) +#include #include #include "learn.h" @@ -170,7 +171,7 @@ struct SfenWriter // sfen_buffers_poolに積んでおけばあとはworkerがよきに計らってくれる。 // sfen_buffers_poolの内容を変更するときはmutexのlockが必要。 - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); sfen_buffers_pool.push_back(buf); buf = nullptr; @@ -181,7 +182,7 @@ struct SfenWriter // 自分のスレッド用のバッファに残っている分をファイルに書き出すためのバッファに移動させる。 void finalize(size_t thread_id) { - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); auto& buf = sfen_buffers[thread_id]; @@ -214,7 +215,7 @@ struct SfenWriter { vector buffers; { - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); // まるごとコピー buffers = sfen_buffers_pool; @@ -299,7 +300,7 @@ private: std::vector sfen_buffers_pool; // sfen_buffers_poolにアクセスするときに必要なmutex - Mutex mutex; + std::mutex mutex; // 書きだした局面の数 uint64_t sfen_write_count = 0; @@ -1293,7 +1294,7 @@ struct SfenReader while (true) { { - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); // ファイルバッファから充填できたなら、それで良し。 if (packed_sfens_pool.size() != 0) { @@ -1410,7 +1411,7 @@ struct SfenReader // sfensの用意が出来たので、折を見てコピー { - std::unique_lock lk(mutex); + std::unique_lock lk(mutex); // ポインタをコピーするだけなのでこの時間は無視できるはず…。 // packed_sfens_poolの内容を変更するのでmutexのlockが必要。 @@ -1479,7 +1480,7 @@ protected: std::vector packed_sfens; // packed_sfens_poolにアクセスするときのmutex - Mutex mutex; + std::mutex mutex; // sfenのpool。fileから読み込むworker threadはここに補充する。 // 各worker threadはここから自分のpacked_sfens[thread_id]に充填する。 @@ -2704,7 +2705,7 @@ void learn(Position&, istringstream& is) #pragma warning(push) #pragma warning(disable:4996) - namespace sys = std::tr2::sys; + namespace sys = std::filesystem; sys::path p(kif_base_dir); // 列挙の起点 std::for_each(sys::directory_iterator(p), sys::directory_iterator(), [&](const sys::path& p) { diff --git a/src/learn/multi_think.h b/src/learn/multi_think.h index 4d4e0daf..ad6baa5e 100644 --- a/src/learn/multi_think.h +++ b/src/learn/multi_think.h @@ -59,7 +59,7 @@ struct MultiThink // 局面を生成する場合などは、局面を生成するタイミングでこの関数を呼び出すようにしないと、 // 生成した局面数と、カウンターの値が一致しなくなってしまうので注意すること。 uint64_t get_next_loop_count() { - std::unique_lock lk(loop_mutex); + std::unique_lock lk(loop_mutex); if (loop_count >= loop_max) return UINT64_MAX; return loop_count++; @@ -67,12 +67,12 @@ struct MultiThink // [ASYNC] 処理した個数を返す用。呼び出されるごとにインクリメントされたカウンターが返る。 uint64_t get_done_count() { - std::unique_lock lk(loop_mutex); + std::unique_lock lk(loop_mutex); return ++done_count; } // worker threadがI/Oにアクセスするときのmutex - Mutex io_mutex; + std::mutex io_mutex; protected: // 乱数発生器本体 @@ -87,7 +87,7 @@ private: std::atomic done_count; // ↑の変数を変更するときのmutex - Mutex loop_mutex; + std::mutex loop_mutex; // スレッドの終了フラグ。 // vectorにすると複数スレッドから書き換えようとしたときに正しく反映されないことがある…はず。 @@ -117,7 +117,7 @@ struct TaskDispatcher // [ASYNC] taskを一つ積む。 void push_task_async(Task task) { - std::unique_lock lk(task_mutex); + std::unique_lock lk(task_mutex); tasks.push_back(task); } @@ -134,7 +134,7 @@ protected: // [ASYNC] taskを一つ取り出す。on_idle()から呼び出される。 Task get_task_async() { - std::unique_lock lk(task_mutex); + std::unique_lock lk(task_mutex); if (tasks.size() == 0) return nullptr; Task task = *tasks.rbegin(); @@ -143,7 +143,7 @@ protected: } // tasksにアクセスするとき用のmutex - Mutex task_mutex; + std::mutex task_mutex; }; #endif // defined(EVAL_LEARN) && defined(YANEURAOU_2018_OTAFUKU_ENGINE) diff --git a/src/search.cpp b/src/search.cpp index 15655329..43032d86 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -2024,9 +2024,9 @@ namespace Learner { auto th = pos.this_thread(); - th->completedDepth = DEPTH_ZERO; + th->completedDepth = 0; th->selDepth = 0; - th->rootDepth = DEPTH_ZERO; + th->rootDepth = 0; // Tm[h̃[ th->nodes = 0; @@ -2050,7 +2050,7 @@ namespace Learner : -make_score(ct, ct / 2)); for (int i = 7; i > 0; i--) - (ss - i)->continuationHistory = &th->continuationHistory[NO_PIECE][0]; // Use as sentinel + (ss - i)->continuationHistory = &th->continuationHistory[0][0][NO_PIECE][0]; // Use as a sentinel // rootMoves̐ݒ auto& rootMoves = th->rootMoves; @@ -2109,7 +2109,7 @@ namespace Learner return { mated_in(/*ss->ply*/ 0 + 1), {} }; } - auto bestValue = ::qsearch(pos, ss, -VALUE_INFINITE, VALUE_INFINITE, DEPTH_ZERO); + auto bestValue = ::qsearch(pos, ss, -VALUE_INFINITE, VALUE_INFINITE, 0); // ꂽPVԂB std::vector pvs; @@ -2139,11 +2139,11 @@ namespace Learner { std::vector pvs; - Depth depth = depth_ * ONE_PLY; - if (depth < DEPTH_ZERO) + Depth depth = depth_; + if (depth < 0) return std::pair>(Eval::evaluate(pos), std::vector()); - if (depth == DEPTH_ZERO) + if (depth == 0) return qsearch(pos); Stack stack[MAX_PLY + 10], * ss = stack + 7; @@ -2176,7 +2176,7 @@ namespace Learner Value delta = -VALUE_INFINITE; Value bestValue = -VALUE_INFINITE; - while ((rootDepth += ONE_PLY) <= depth + while ((rootDepth += 1) <= depth // node𒴂ꍇ̃[v𔲂 // Tm[h́Å֐̈œnĂB && !(nodesLimit /*node*/ && th->nodes.load(std::memory_order_relaxed) >= nodesLimit) @@ -2203,7 +2203,7 @@ namespace Learner selDepth = 0; // depth 5ȏɂĂaspiration searchɐ؂ւB - if (rootDepth >= 5 * ONE_PLY) + if (rootDepth >= 5 * 1) { delta = Value(20); @@ -2217,7 +2217,7 @@ namespace Learner int failedHighCnt = 0; while (true) { - Depth adjustedDepth = std::max(ONE_PLY, rootDepth - failedHighCnt * ONE_PLY); + Depth adjustedDepth = std::max(1, rootDepth - failedHighCnt * 1); bestValue = ::search(pos, ss, alpha, beta, adjustedDepth, false); stable_sort(rootMoves.begin() + pvIdx, rootMoves.end());