mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-25 11:36:51 +08:00
Translation
Files in /eval, /extra, & /learn - comments translated from Japanese to English
This commit is contained in:
@@ -10,67 +10,67 @@
|
||||
|
||||
void MultiThink::go_think()
|
||||
{
|
||||
// あとでOptionsの設定を復元するためにコピーで保持しておく。
|
||||
// Keep a copy to restore the Options settings later.
|
||||
auto oldOptions = Options;
|
||||
|
||||
// 定跡を用いる場合、on the flyで行なうとすごく時間がかかる&ファイルアクセスを行なう部分が
|
||||
// thread safeではないので、メモリに丸読みされている状態であることをここで保証する。
|
||||
// When using the constant track, it takes a lot of time to perform on the fly & the part to access the file is
|
||||
// Since it is not thread safe, it is guaranteed here that it is being completely read in memory.
|
||||
Options["BookOnTheFly"] = std::string("false");
|
||||
|
||||
// 評価関数の読み込み等
|
||||
// learnコマンドの場合、評価関数読み込み後に評価関数の値を補正している可能性があるので、
|
||||
// メモリの破損チェックは省略する。
|
||||
// Read evaluation function, etc.
|
||||
// In the case of the learn command, the value of the evaluation function may be corrected after reading the evaluation function, so
|
||||
// Skip memory corruption check.
|
||||
is_ready(true);
|
||||
|
||||
// 派生クラスのinit()を呼び出す。
|
||||
// Call the derived class's init().
|
||||
init();
|
||||
|
||||
// ループ上限はset_loop_max()で設定されているものとする。
|
||||
// The loop upper limit is set with set_loop_max().
|
||||
loop_count = 0;
|
||||
done_count = 0;
|
||||
|
||||
// threadをOptions["Threads"]の数だけ生成して思考開始。
|
||||
// Create threads as many as Options["Threads"] and start thinking.
|
||||
std::vector<std::thread> threads;
|
||||
auto thread_num = (size_t)Options["Threads"];
|
||||
|
||||
// worker threadの終了フラグの確保
|
||||
// Secure end flag of worker thread
|
||||
thread_finished.resize(thread_num);
|
||||
|
||||
// worker threadの起動
|
||||
// start worker thread
|
||||
for (size_t i = 0; i < thread_num; ++i)
|
||||
{
|
||||
thread_finished[i] = 0;
|
||||
threads.push_back(std::thread([i, this]
|
||||
{
|
||||
// プロセッサの全スレッドを使い切る。
|
||||
// exhaust all processor threads.
|
||||
WinProcGroup::bindThisThread(i);
|
||||
|
||||
// オーバーライドされている処理を実行
|
||||
// execute the overridden process
|
||||
this->thread_worker(i);
|
||||
|
||||
// スレッドが終了したので終了フラグを立てる
|
||||
// Set the end flag because the thread has ended
|
||||
this->thread_finished[i] = 1;
|
||||
}));
|
||||
}
|
||||
|
||||
// すべてのthreadの終了待ちを
|
||||
// for (auto& th : threads)
|
||||
// th.join();
|
||||
// のように書くとスレッドがまだ仕事をしている状態でここに突入するので、
|
||||
// その間、callback_func()が呼び出せず、セーブできなくなる。
|
||||
// そこで終了フラグを自前でチェックする必要がある。
|
||||
// wait for all threads to finish
|
||||
// for (auto& th :threads)
|
||||
// th.join();
|
||||
// If you write like, the thread will rush here while it is still working,
|
||||
// During that time, callback_func() cannot be called and you cannot save.
|
||||
// Therefore, you need to check the end flag yourself.
|
||||
|
||||
// すべてのスレッドが終了したかを判定する関数
|
||||
// function to determine if all threads have finished
|
||||
auto threads_done = [&]()
|
||||
{
|
||||
// ひとつでも終了していなければfalseを返す
|
||||
// returns false if no one is finished
|
||||
for (auto& f : thread_finished)
|
||||
if (!f)
|
||||
return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
// コールバック関数が設定されているならコールバックする。
|
||||
// Call back if the callback function is set.
|
||||
auto do_a_callback = [&]()
|
||||
{
|
||||
if (callback_func)
|
||||
@@ -80,44 +80,44 @@ void MultiThink::go_think()
|
||||
|
||||
for (uint64_t i = 0 ; ; )
|
||||
{
|
||||
// 全スレッドが終了していたら、ループを抜ける。
|
||||
// If all threads have finished, exit the loop.
|
||||
if (threads_done())
|
||||
break;
|
||||
|
||||
sleep(1000);
|
||||
|
||||
// callback_secondsごとにcallback_func()が呼び出される。
|
||||
// callback_func() is called every callback_seconds.
|
||||
if (++i == callback_seconds)
|
||||
{
|
||||
do_a_callback();
|
||||
// ↑から戻ってきてからカウンターをリセットしているので、
|
||||
// do_a_callback()のなかでsave()などにどれだけ時間がかかろうと
|
||||
// 次に呼び出すのは、そこから一定時間の経過を要する。
|
||||
// Since I am returning from ↑, I reset the counter, so
|
||||
// no matter how long it takes to save() etc. in do_a_callback()
|
||||
// The next call will take a certain amount of time.
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 最後の保存。
|
||||
// Last save.
|
||||
std::cout << std::endl << "finalize..";
|
||||
|
||||
// do_a_callback();
|
||||
// → 呼び出し元で保存するはずで、ここでは要らない気がする。
|
||||
// → It should be saved by the caller, so I feel that it is not necessary here.
|
||||
|
||||
// 終了したフラグは立っているがスレッドの終了コードの実行中であるということはありうるので
|
||||
// join()でその終了を待つ必要がある。
|
||||
// It is possible that the exit code of the thread is running but the exit code of the thread is running, so
|
||||
// We need to wait for the end with join().
|
||||
for (auto& th : threads)
|
||||
th.join();
|
||||
|
||||
// 全スレッドが終了しただけでfileの書き出しスレッドなどはまだ動いていて
|
||||
// 作業自体は完了していない可能性があるのでスレッドがすべて終了したことだけ出力する。
|
||||
// The file writing thread etc. are still running only when all threads are finished
|
||||
// Since the work itself may not have completed, output only that all threads have finished.
|
||||
std::cout << "all threads are joined." << std::endl;
|
||||
|
||||
// Optionsを書き換えたので復元。
|
||||
// 値を代入しないとハンドラが起動しないのでこうやって復元する。
|
||||
// Restored because Options were rewritten.
|
||||
// Restore the handler because the handler will not start unless you assign a value.
|
||||
for (auto& s : oldOptions)
|
||||
Options[s.first] = std::string(s.second);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // defined(EVAL_LEARN)
|
||||
#endif // defined(EVAL_LEARN)
|
||||
Reference in New Issue
Block a user