Skip to content

Commit

Permalink
- TTData導入。
Browse files Browse the repository at this point in the history
- extract_ponder_from_ttでiteration 2回目で取得したponder設定するのやめる。(こんなの該当するケースが稀)
- TT.probe()でTTの内部状態が変更されないことは保証されるようになった。
- USI::pv() → searchのほうに移動
- TODO : LEARN版のTTの初期化と確保のコード、あとで書く。
- TODO : 色々壊してしまっているのでむっちゃ弱い。修正作業中。
  • Loading branch information
yaneurao committed Oct 12, 2024
1 parent 249b524 commit 67ce794
Show file tree
Hide file tree
Showing 10 changed files with 820 additions and 814 deletions.
508 changes: 354 additions & 154 deletions source/engine/yaneuraou-engine/yaneuraou-search.cpp

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions source/position.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1288,7 +1288,7 @@ void Position::do_move_impl(Move m, StateInfo& new_st, bool givesCheck)
// なるべく早い段階でのTTに対するprefetch
// 駒打ちのときはこの時点でTT entryのアドレスが確定できる
const HASH_KEY key = k + h;
prefetch(TT.first_entry(key));
prefetch(thisThread->tt.first_entry(key));
#if defined(USE_EVAL_HASH)
Eval::prefetch_evalhash(hash_key_to_key(key));
#endif
Expand Down Expand Up @@ -1471,7 +1471,7 @@ void Position::do_move_impl(Move m, StateInfo& new_st, bool givesCheck)

// 駒打ちでないときはprefetchはこの時点まで延期される。
const HASH_KEY key = k + h;
prefetch(TT.first_entry(key));
prefetch(thisThread->tt.first_entry(key));
#if defined(USE_EVAL_HASH)
Eval::prefetch_evalhash(hash_key_to_key(key));
#endif
Expand Down Expand Up @@ -1897,7 +1897,7 @@ void Position::do_null_move(StateInfo& newSt) {
// CPUによっては有効なので一応やっておく。

const HASH_KEY key = st->hash_key();
prefetch(TT.first_entry(key));
prefetch(thisThread->tt.first_entry(key));

// これは、さっきアクセスしたところのはずなので意味がない。
// Eval::prefetch_evalhash(key);
Expand Down
23 changes: 18 additions & 5 deletions source/search.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,17 @@ struct RootMove
// pv[0]には、このコンストラクタの引数で渡されたmを設定する。
explicit RootMove(Move m) : pv(1, m) {}

// ponderの指し手がないときにponderの指し手を置換表からひねり出す。pv[1]に格納する。
// ponder_candidateが2手目の局面で合法手なら、それをpv[1]に格納する。
// それすらなかった場合はfalseを返す。
// ※ Stockfishにはこの関数に第二引数はない。やねうら王が独自に追加した。
bool extract_ponder_from_tt(Position& pos, Move ponder_candidate);
// Called in case we have no ponder move before exiting the search,
// for instance, in case we stop the search during a fail high at root.
// We try hard to have a ponder move to return to the GUI,
// otherwise in case of 'ponder on' we have nothing to think about.

// 探索を終了する前にponder moveがない場合に呼び出されます。
// 例えば、rootでfail highが発生して探索を中断した場合などです。
// GUIに返すponder moveをできる限り準備しようとしますが、
// そうでない場合、「ponder on」の際に考えるべきものが何もなくなります。

bool extract_ponder_from_tt(const TranspositionTable& tt, Position& pos);

// std::count(),std::find()などで指し手と比較するときに必要。
bool operator==(const Move& m) const { return pv[0] == m; }
Expand Down Expand Up @@ -258,6 +264,13 @@ void init();
// 置換表のクリアなど時間のかかる探索の初期化処理をここでやる。isreadyに対して呼び出される。
void clear();

// pv(読み筋)をUSIプロトコルに基いて出力する。
// pos : 局面
// tt : このスレッドに属する置換表
// depth : 反復深化のiteration深さ。
std::string pv(const Position& pos, const TranspositionTable& tt, Depth depth);


} // end of namespace Search

#endif // _SEARCH_H_INCLUDED_
Expand Down
22 changes: 14 additions & 8 deletions source/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@

#include "thread.h"
#include "usi.h"
#include "tt.h"

ThreadPool Threads; // Global object

Thread::Thread(size_t n) : idx(n) , stdThread(&Thread::idle_loop, this)
// global TTここに置いておく。あとで修正する。
TranspositionTable TT;

Thread::Thread(TranspositionTable& tt, size_t n) : tt(tt), idx(n) , stdThread(&Thread::idle_loop, this)
{
#if !defined(__EMSCRIPTEN__)
// スレッドはsearching == trueで開始するので、このままworkerのほう待機状態にさせておく
Expand Down Expand Up @@ -159,10 +163,10 @@ void ThreadPool::set(size_t requested)

if (requested > 0) { // 要求された数だけのスレッドを生成
#if !defined(__EMSCRIPTEN__)
threads.push_back(new MainThread(0));
threads.push_back(new MainThread(TT, 0));

while (size() < requested)
threads.push_back(new Thread(size()));
threads.push_back(new Thread(TT, size()));
#else
// yaneuraou.wasm
while (size() < requested)
Expand All @@ -179,11 +183,13 @@ void ThreadPool::set(size_t requested)
//TT.resize(size_t(Options["USI_Hash"]));
}

#if defined(EVAL_LEARN)
// 学習用の実行ファイルでは、スレッド数が変更になったときに各ThreadごとのTTに
// メモリを再割り当てする必要がある。
TT.init_tt_per_thread();
#endif
//#if defined(EVAL_LEARN)
// // 学習用の実行ファイルでは、スレッド数が変更になったときに各ThreadごとのTTに
// // メモリを再割り当てする必要がある。
// TT.init_tt_per_thread();
//#endif

// TODO : LEARN版のTTの初期化と確保のコード、あとで書く。

}

Expand Down
9 changes: 4 additions & 5 deletions source/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class Thread
public:

// ThreadPoolで何番目のthreadであるかをコンストラクタで渡すこと。この値は、idx(スレッドID)となる。
explicit Thread(size_t n);
explicit Thread(TranspositionTable& tt , size_t n);
virtual ~Thread();

// slaveは、main threadから
Expand Down Expand Up @@ -215,10 +215,9 @@ class Thread
// MainThreadなら0、slaveなら1,2,3,...
size_t thread_id() const { return idx; }

#if defined(EVAL_LEARN)
// 学習用の実行ファイルでは、スレッドごとに置換表を持ちたい。
TranspositionTable tt;
#endif
// 置換表への参照。
// ※ 学習用の実行ファイルでは、スレッドごとに置換表を持ちたい。
TranspositionTable& tt;
};


Expand Down
Loading

0 comments on commit 67ce794

Please sign in to comment.