Skip to content

Commit

Permalink
- エンジンオプションのThreads(探索スレッド数)の最大を1024に変更。
Browse files Browse the repository at this point in the history
- Tools::memclearに__EMSCRIPTEN__のコード移動させた。
- tt.h / tt.cpp 、型castの書き方など修正。
- indent揃ってなかったところ微修正。
  • Loading branch information
yaneurao committed Oct 13, 2023
1 parent 6647eda commit b25b50e
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 56 deletions.
6 changes: 5 additions & 1 deletion source/engine/yaneuraou-engine/yaneuraou-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ void USI::extra_option(USI::OptionsMap & o)
// NNUEのFV_SCALEの値
o["FV_SCALE"] << Option(16, 1, 128);
#endif

// Stockfishには、Eloレーティングを指定して棋力調整するためのエンジンオプションがあるようだが…。
// o["UCI_Elo"] << Option(1320, 1320, 3190);

}

// パラメーターのランダム化のときには、
Expand Down Expand Up @@ -498,7 +502,7 @@ void MainThread::search()
rootMoves[0].score = mated_in(0);

if (!Limits.silent)
sync_cout << USI::pv(rootPos, 1) << sync_endl;
sync_cout << USI::pv(rootPos, Depth(1)) << sync_endl;

goto SKIP_SEARCH;
}
Expand Down
2 changes: 1 addition & 1 deletion source/eval/deep/nn_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ namespace Eval::dlshogi

#if defined(TRT_NN_FP16)
const DType dtype_zero = __float2half(0.0f);
const DType dtype_one = __float2half(1.0f);
const DType dtype_one = __float2half(1.0f);
#endif

#if 0 // dlshogiに忠実に書かれたコード
Expand Down
30 changes: 24 additions & 6 deletions source/misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -916,15 +916,15 @@ namespace Tools
// ※ Stockfishのtt.cppのTranspositionTable::clear()にあるコードと同等のコード。
void memclear(const char* name_, void* table, size_t size)
{
#if !defined(EVAL_LEARN) && !defined(__EMSCRIPTEN__)

// Windows10では、このゼロクリアには非常に時間がかかる。
// malloc()時点ではメモリを実メモリに割り当てられておらず、
// 初回にアクセスするときにその割当てがなされるため。
// ゆえに、分割してゼロクリアして、一定時間ごとに進捗を出力する。

// memset(table, 0, size);

// Options["Threads"]が使用できるスレッド数とは限らない(ふかうら王など)
auto thread_num = (size_t)Threads.size(); // Options["Threads"];
auto thread_num = size_t(Threads.size()); // Options["Threads"];

if (name_ != nullptr)
sync_cout << "info string " + std::string(name_) + " : Start clearing with " << thread_num << " threads , Hash size = " << size / (1024 * 1024) << "[MB]" << sync_endl;
Expand All @@ -944,10 +944,15 @@ namespace Tools
WinProcGroup::bindThisThread(idx);

// それぞれのスレッドがhash tableの各パートをゼロ初期化する。
// start : このスレッドによるゼロクリア開始位置
// stride : 各スレッドのゼロクリアするサイズ
// len : このスレッドによるゼロクリアするサイズ。
// strideと等しいが、最後のスレッドだけは端数を考慮し、
// size - start のサイズだけクリアする必要がある。
const size_t stride = size / thread_num,
start = stride * idx,
len = idx != thread_num - 1 ?
stride : size - start;
start = stride * idx,
len = idx != thread_num - 1 ?
stride : size - start;

std::memset((uint8_t*)table + start, 0, len);
}));
Expand All @@ -958,6 +963,19 @@ namespace Tools

if (name_ != nullptr)
sync_cout << "info string " + std::string(name_) + " : Finish clearing." << sync_endl;

#else
// yaneuraou.wasm
// pthread_joinによってブラウザのメインスレッドがブロックされるため、単一スレッドでメモリをクリアする処理に変更

// LEARN版のときは、
// 単一スレッドでメモリをクリアする。(他のスレッドは仕事をしているので..)
// 教師生成を行う時は、対局の最初にスレッドごとのTTに対して、
// このclear()が呼び出されるものとする。
// 例) th->tt.clear();
std::memset(table, 0, size);
#endif

}

// 途中での終了処理のためのwrapper
Expand Down
24 changes: 12 additions & 12 deletions source/movegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,17 +378,17 @@ template <Color Us> struct GenerateDropMoves {
// そのため、手駒から香・桂を除いた駒と、桂を除いた駒が必要となる。

int num = 0;
if (hand_exists(hand, KNIGHT)) drops[num++] = make_move_drop(KNIGHT, SQ_ZERO , Us);
if (hand_exists(hand, KNIGHT)) drops[num++] = make_move_drop(KNIGHT, SQ_ZERO, Us);

int nextToKnight = num; // 桂を除いたdropsのindex
if (hand_exists(hand, LANCE )) drops[num++] = make_move_drop(LANCE, SQ_ZERO , Us);
if (hand_exists(hand, LANCE )) drops[num++] = make_move_drop(LANCE , SQ_ZERO, Us);

int nextToLance = num; // 香・桂を除いたdropsのindex
int nextToLance = num; // 香・桂を除いたdropsのindex

if (hand_exists(hand, SILVER)) drops[num++] = make_move_drop(SILVER, SQ_ZERO , Us);
if (hand_exists(hand, GOLD) ) drops[num++] = make_move_drop(GOLD , SQ_ZERO , Us);
if (hand_exists(hand, BISHOP)) drops[num++] = make_move_drop(BISHOP, SQ_ZERO , Us);
if (hand_exists(hand, ROOK) ) drops[num++] = make_move_drop(ROOK , SQ_ZERO , Us);
if (hand_exists(hand, SILVER)) drops[num++] = make_move_drop(SILVER, SQ_ZERO, Us);
if (hand_exists(hand, GOLD )) drops[num++] = make_move_drop(GOLD , SQ_ZERO, Us);
if (hand_exists(hand, BISHOP)) drops[num++] = make_move_drop(BISHOP, SQ_ZERO, Us);
if (hand_exists(hand, ROOK )) drops[num++] = make_move_drop(ROOK , SQ_ZERO, Us);


// 以下、コードが膨れ上がるが、dropは比較的、数が多く時間がわりとかかるので展開しておく価値があるかと思う。
Expand Down Expand Up @@ -568,12 +568,12 @@ ExtMove* generate_general(const Position& pos, ExtMove* mlist, Square recapSq =

// 歩以外の駒の移動先
const Bitboard target =
(GenType == NON_CAPTURES) ? pos.empties() : // 捕獲しない指し手 = 移動先の升は駒のない升
(GenType == CAPTURES) ? pos.pieces(Them) : // 捕獲する指し手 = 移動先の升は敵駒のある升
(GenType == NON_CAPTURES ) ? pos.empties() : // 捕獲しない指し手 = 移動先の升は駒のない升
(GenType == CAPTURES ) ? pos.pieces(Them) : // 捕獲する指し手 = 移動先の升は敵駒のある升
(GenType == NON_CAPTURES_PRO_MINUS) ? pos.empties() : // 捕獲しない指し手 - 歩の成る指し手 = 移動先の升は駒のない升 - 敵陣(歩のときのみ)
(GenType == CAPTURES_PRO_PLUS) ? pos.pieces(Them) : // 捕獲 + 歩の成る指し手 = 移動先の升は敵駒のある升 + 敵陣(歩のときのみ)
(GenType == NON_EVASIONS) ? ~pos.pieces(Us) : // すべて = 移動先の升は自駒のない升
(GenType == RECAPTURES) ? Bitboard(recapSq) : // リキャプチャー用の升(直前で相手の駒が移動したわけだからここには移動できるはず)
(GenType == CAPTURES_PRO_PLUS ) ? pos.pieces(Them) : // 捕獲 + 歩の成る指し手 = 移動先の升は敵駒のある升 + 敵陣(歩のときのみ)
(GenType == NON_EVASIONS ) ? ~pos.pieces(Us) : // すべて = 移動先の升は自駒のない升
(GenType == RECAPTURES ) ? Bitboard(recapSq) : // リキャプチャー用の升(直前で相手の駒が移動したわけだからここには移動できるはず)
Bitboard(1); // error

// 歩の移動先(↑のtargetと違う部分のみをオーバーライド)
Expand Down
39 changes: 18 additions & 21 deletions source/tt.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
#include <cstring> // std::memset()
#include "tt.h"

//#include <cassert>
//#include <cstdlib>
//#include <cstring>
//#include <iostream>
//#include <thread>
//#include <vector>

#include "misc.h"
#include "thread.h"
#include "tt.h"

// やねうら王独自拡張
#include "extra/key128.h"

TranspositionTable TT; // 置換表をglobalに確保。
Expand Down Expand Up @@ -45,7 +54,7 @@ void TTEntry::save_(TTEntry::KEY_TYPE key_for_ttentry, Value v, bool pv , Bound
// ケースが考えられる。ゆえに、今回の指し手のほうが、いまの置換表の指し手より価値があると考えられる。

if (m || key_for_ttentry != key)
move16 = (uint16_t)m;
move16 = uint16_t(m);

// このエントリーの現在の内容のほうが価値があるなら上書きしない。
// 1. hash keyが違うということはTT::probeでここを使うと決めたわけだから、このEntryは無条件に潰して良い
Expand All @@ -63,10 +72,10 @@ void TTEntry::save_(TTEntry::KEY_TYPE key_for_ttentry, Value v, bool pv , Bound
ASSERT_LV3(d < 256 + DEPTH_OFFSET);

key = key_for_ttentry;
depth8 = (uint8_t)(d - DEPTH_OFFSET); // DEPTH_OFFSETだけ下駄履きさせてある。
genBound8 = (uint8_t)(TT.generation8 | uint8_t(pv) << 2 | b);
value16 = (int16_t)v;
eval16 = (int16_t)ev;
depth8 = uint8_t(d - DEPTH_OFFSET); // DEPTH_OFFSETだけ下駄履きさせてある。
genBound8 = uint8_t(TT.generation8 | uint8_t(pv) << 2 | b);
value16 = int16_t(v);
eval16 = int16_t(ev);
}
}

Expand Down Expand Up @@ -134,21 +143,9 @@ void TranspositionTable::clear()

auto size = clusterCount * sizeof(Cluster);

#if !defined(EVAL_LEARN) && !defined(__EMSCRIPTEN__)
// 進捗を表示しながら並列化してゼロクリア
// Stockfishのここにあったコードは、独自の置換表を実装した時にも使いたいため、tt.cppに移動させた。
Tools::memclear("USI_Hash" , table, size);
#else
// yaneuraou.wasm
// pthread_joinによってブラウザのメインスレッドがブロックされるため、単一スレッドでメモリをクリアする処理に変更

// LEARN版のときは、
// 単一スレッドでメモリをクリアする。(他のスレッドは仕事をしているので..)
// 教師生成を行う時は、対局の最初にスレッドごとのTTに対して、
// このclear()が呼び出されるものとする。
// 例) th->tt.clear();
std::memset(table, 0, size);
#endif
Tools::memclear("USI_Hash", table, size);
}

// probe()の内部実装用。
Expand Down Expand Up @@ -190,7 +187,7 @@ TTEntry* TranspositionTable::probe(const Key key_for_index, const TTEntry::KEY_T
{
tte[i].genBound8 = uint8_t(generation8 | (tte[i].genBound8 & (GENERATION_DELTA - 1))); // Refresh

return found = (bool)tte[i].depth8, &tte[i];
return found = bool(tte[i].depth8), &tte[i];
}
}

Expand Down
13 changes: 8 additions & 5 deletions source/tt.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef TT_H_INCLUDED
#define TT_H_INCLUDED

#include <cstddef>
#include <cstdint>

#include "types.h"
#include "misc.h"

Expand Down Expand Up @@ -31,11 +34,11 @@ struct Key256;
struct TTEntry {

Move16 move() const { return Move16(move16); }
Value value() const { return (Value)value16; }
Value eval() const { return (Value)eval16; }
Depth depth() const { return (Depth)depth8 + DEPTH_OFFSET; }
bool is_pv() const { return (bool )(genBound8 & 0x4); }
Bound bound() const { return (Bound)(genBound8 & 0x3); }
Value value() const { return Value(value16); }
Value eval() const { return Value(eval16 ); }
Depth depth() const { return Depth(depth8 + DEPTH_OFFSET); }
bool is_pv() const { return bool (genBound8 & 0x4); }
Bound bound() const { return Bound(genBound8 & 0x3); }

// 置換表のエントリーに対して与えられたデータを保存する。上書き動作
// v : 探索のスコア
Expand Down
3 changes: 2 additions & 1 deletion source/usi.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ namespace USI
// 起動時に設定を代入する。
void operator<<(const Option&);

// s64型への暗黙の変換子
// s64型への暗黙の変換子。
// Stockfishでは、intになっているが、やねうら王ではs64に拡張している。
operator s64() const;

// string型への暗黙の変換子
Expand Down
34 changes: 25 additions & 9 deletions source/usi_option.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
#include "thread.h"
#include "tt.h"
#include "usi.h"

//#include "evaluate.h"
#include "misc.h"
//#include "search.h
//#include "syzygy/tbprobe.h"
#include "thread.h"
//#include "tt.h"
#include "usi.h"

using std::string;

Expand All @@ -10,6 +14,16 @@ USI::OptionsMap Options;

namespace USI {

/// 'On change' actions, triggered by an option's value change
// オプションの値が変更された時に呼び出されるOn changeアクション。

//static void on_clear_hash(const Option&) { Search::clear(); }
//static void on_hash_size(const Option& o) { TT.resize(size_t(o)); }
static void on_logger(const Option& o) { start_logger(o); }
//static void on_threads(const Option& o) { Threads.set(size_t(o)); }
//static void on_tb_path(const Option& o) { Tablebases::init(o); }
//static void on_eval_file(const Option&) { Eval::NNUE::init(); }

// --- やねうら王独自拡張分の前方宣言

// 入玉ルールのUSI文字列
Expand Down Expand Up @@ -57,18 +71,18 @@ namespace USI {
// Stockfishもこうすべきだと思う。

#if !defined(__EMSCRIPTEN__)
o["Threads"] << Option(4, 1, 512, [](const Option& o) { /* Threads.set(o); */ });
o["Threads"] << Option(4, 1, 1024, [](const Option& o) { /* on_threads(o); */ });
#else
// yaneuraou.wasm
// スレッド数などの調整
// stockfish.wasmの数値を基本的に使用している
o["Threads"] << Option(1, 1, 32, [](const Option& o) { /* Threads.set(o); */ });
o["Threads"] << Option(1, 1, 32, [](const Option& o) { /* on_threads(o); */ });
#endif
#endif

#if !defined(TANUKI_MATE_ENGINE) && !defined(YANEURAOU_MATE_ENGINE)
// 置換表のサイズ。[MB]で指定。
o["USI_Hash"] << Option(1024, 1, MaxHashMB, [](const Option& o) { /* TT.resize(o); */ });
o["USI_Hash"] << Option(1024, 1, MaxHashMB, [](const Option& o) { /* on_hash_size(o); */ });

#if defined(USE_EVAL_HASH)
// 評価値用のcacheサイズ。[MB]で指定。
Expand All @@ -81,6 +95,9 @@ namespace USI {
#endif // defined(FOR_TOURNAMENT)
#endif // defined(USE_EVAL_HASH)

// Stockfishには、探索部を初期化するエンジンオプションがあるが使わないので未サポートとする。
//o["Clear Hash"] << Option(on_clear_hash);

// ponderの有無
o["USI_Ponder"] << Option(false);

Expand Down Expand Up @@ -165,7 +182,7 @@ namespace USI {
#endif // !defined(TANUKI_MATE_ENGINE) && !defined(YANEURAOU_MATE_ENGINE)

// cin/coutの入出力をファイルにリダイレクトする
o["WriteDebugLog"] << Option("", [](const Option& o) { start_logger(o); });
o["WriteDebugLog"] << Option("", [](const Option& o) { on_logger(o); });

// 読みの各局面ですべての合法手を生成する
// (普通、歩の2段目での不成などは指し手自体を生成しないが、
Expand Down Expand Up @@ -293,10 +310,9 @@ namespace USI {
defaultValue = currentValue = v;
}

// Stockfishでは、これdoubleになっているが、あまりいいと思えないので数値型はs64のみのサポートにする。
Option::operator s64() const {
ASSERT_LV1(type == "check" || type == "spin");
return (type == "spin" ? stoll(currentValue) : currentValue == "true");
return (type == "spin" ? std::stoll(currentValue) : currentValue == "true");
}

Option::operator std::string() const {
Expand Down

0 comments on commit b25b50e

Please sign in to comment.