diff --git a/source/eval/evalhash.h b/source/eval/evalhash.h index fd45f8fd8..3b9e12e91 100644 --- a/source/eval/evalhash.h +++ b/source/eval/evalhash.h @@ -22,7 +22,8 @@ struct HashTable // ゼロクリアしておかないと、benchの結果が不安定になる。 // 気持ち悪いのでゼロクリアしておく。 - entries_ = (T*)largeMemory.alloc(size * sizeof(T),alignof(T),true); + entries_ = (T*)aligned_large_pages_alloc(size * sizeof(T)); + clear(); } } @@ -30,7 +31,7 @@ struct HashTable { if (entries_) { - largeMemory.free(); + aligned_large_pages_free(entries_); entries_ = nullptr; } } @@ -44,7 +45,6 @@ struct HashTable size_t size = 0; T* entries_ = nullptr; - LargeMemory largeMemory; }; -#endif // EVALHASH_H_INCLUDED \ No newline at end of file +#endif // EVALHASH_H_INCLUDED diff --git a/source/eval/kpp_kkpt/evaluate_kpp_kkpt.cpp b/source/eval/kpp_kkpt/evaluate_kpp_kkpt.cpp index 16376f22d..c968a9a13 100644 --- a/source/eval/kpp_kkpt/evaluate_kpp_kkpt.cpp +++ b/source/eval/kpp_kkpt/evaluate_kpp_kkpt.cpp @@ -12,6 +12,7 @@ #include "../../evaluate.h" #include "../../position.h" #include "../../misc.h" +#include "../../memory.h" #include "../../usi.h" #include "../../extra/bitop.h" #include "../evaluate_io.h" @@ -108,16 +109,17 @@ namespace Eval } // 評価関数テーブルの読み込み用のメモリ - LargeMemory eval_memory; + void* eval_memory; void eval_malloc() { // benchコマンドなどでOptionsを保存して復元するのでこのときEvalDirが変更されたことになって、 // 評価関数の再読込の必要があるというフラグを立てるため、この関数は2度呼び出されることがある。 - // その場合でもLargeMemoryクラスが前のを開放してくれるので安全。 // メモリ確保は一回にして、連続性のある確保にする。 - eval_assign(eval_memory.alloc(size_of_eval)); + aligned_large_pages_free(eval_memory); + eval_memory = aligned_large_pages_alloc(size_of_eval); + eval_assign(eval_memory); } #if defined (USE_SHARED_MEMORY_IN_EVAL) && defined(_WIN32) diff --git a/source/eval/kppt/evaluate_kppt.cpp b/source/eval/kppt/evaluate_kppt.cpp index a751cadaf..a546ec303 100644 --- a/source/eval/kppt/evaluate_kppt.cpp +++ b/source/eval/kppt/evaluate_kppt.cpp @@ -22,6 +22,7 @@ #include "../../evaluate.h" #include "../../position.h" #include "../../misc.h" +#include "../../memory.h" #include "../../usi.h" #include "../../extra/bitop.h" @@ -167,16 +168,17 @@ namespace Eval } // 評価関数テーブルの読み込み用のメモリ - LargeMemory eval_memory; + void* eval_memory = nullptr; void eval_malloc() { // benchコマンドなどでOptionsを保存して復元するのでこのときEvalDirが変更されたことになって、 // 評価関数の再読込の必要があるというフラグを立てるため、この関数は2度呼び出されることがある。 - // その場合でもLargeMemoryクラスが前のを開放してくれるので安全。 // メモリ確保は一回にして、連続性のある確保にする。 - eval_assign(eval_memory.alloc(size_of_eval)); + aligned_large_pages_free(eval_memory); + eval_memory = aligned_large_pages_alloc(size_of_eval); + eval_assign(eval_memory); } #if defined (USE_SHARED_MEMORY_IN_EVAL) && defined(_WIN32) diff --git a/source/eval/nnue/evaluate_nnue.cpp b/source/eval/nnue/evaluate_nnue.cpp index f2b785ab4..8a2e376c5 100644 --- a/source/eval/nnue/evaluate_nnue.cpp +++ b/source/eval/nnue/evaluate_nnue.cpp @@ -17,8 +17,6 @@ #include "evaluate_nnue.h" -using namespace Stockfish; - namespace Eval { namespace NNUE { diff --git a/source/eval/nnue/evaluate_nnue.h b/source/eval/nnue/evaluate_nnue.h index f8cec9273..62e1af506 100644 --- a/source/eval/nnue/evaluate_nnue.h +++ b/source/eval/nnue/evaluate_nnue.h @@ -31,10 +31,10 @@ namespace Eval::NNUE { FeatureTransformer::GetHashValue() ^ Network::GetHashValue(); // 入力特徴量変換器 - extern Stockfish::LargePagePtr feature_transformer; + extern LargePagePtr feature_transformer; // 評価関数 - extern Stockfish::AlignedPtr network; + extern AlignedPtr network; // 評価関数ファイル名 extern const char* const kFileName; diff --git a/source/eval/nnue/trainer/trainer.h b/source/eval/nnue/trainer/trainer.h index 1b07dc80d..ccda282ad 100644 --- a/source/eval/nnue/trainer/trainer.h +++ b/source/eval/nnue/trainer/trainer.h @@ -116,14 +116,11 @@ std::shared_ptr MakeAlignedSharedPtr(ArgumentTypes&&... arguments) { // Trainerクラスのほうでゼロ初期化するのでここではゼロ初期化はされていないメモリで良い。 - void* ptr_ = LargeMemory::static_alloc(sizeof(T), alignof(T)); + void* ptr_ = aligned_large_pages_alloc(sizeof(T)); const auto ptr = new(ptr_) T(std::forward(arguments)...); - LargeMemoryDeleter deleter; - //sync_cout << "trainer.alloc(" << sizeof(T) << "," << alignof(T) << ")" << sync_endl; - - return std::shared_ptr(ptr,deleter); + return std::shared_ptr(ptr, LargePageDeleter()); } diff --git a/source/memory.cpp b/source/memory.cpp index 0c105b96b..180b04296 100644 --- a/source/memory.cpp +++ b/source/memory.cpp @@ -47,7 +47,7 @@ using AdjustTokenPrivileges_t = #endif -namespace Stockfish { +//namespace Stockfish { // Wrappers for systems where the c++17 implementation does not guarantee the // availability of aligned_alloc(). Memory allocated with std_aligned_alloc() @@ -177,6 +177,8 @@ static void* aligned_large_pages_alloc_windows([[maybe_unused]] size_t allocSize #endif } +bool first_large_pages_allocation = true; + void* aligned_large_pages_alloc(size_t allocSize) { // ※ ここでは4KB単位でalignされたメモリが返ることは保証されているので @@ -190,11 +192,17 @@ void* aligned_large_pages_alloc(size_t allocSize) { // ⇨ LargePage非対応の環境であれば、std::aligned_alloc()を用いて確保しておく。 // 最低でも4KBでalignされたメモリが返るので、引数でalign sizeを指定できるようにする必要はない。 - if (!mem) + if (!mem) mem = VirtualAlloc(nullptr, allocSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); else - // Large Pagesを確保した旨を出力。 - sync_cout << "info string Hash table allocation: Windows Large Pages used." << sync_endl; + { + if (first_large_pages_allocation) + { + // Large Pagesを確保した旨を出力。 + sync_cout << "info string Large Pages are used." << sync_endl; + first_large_pages_allocation = false; + } + } return mem; } @@ -273,4 +281,4 @@ void aligned_large_pages_free(void* mem) { void aligned_large_pages_free(void* mem) { std_aligned_free(mem); } #endif -} // namespace Stockfish +//} // namespace Stockfish diff --git a/source/memory.h b/source/memory.h index c46774588..31b82747a 100644 --- a/source/memory.h +++ b/source/memory.h @@ -11,7 +11,7 @@ #include "types.h" -namespace Stockfish { +//namespace Stockfish { void* std_aligned_alloc(size_t alignment, size_t size); void std_aligned_free(void* ptr); @@ -198,6 +198,6 @@ T* align_ptr_up(T* ptr) { } -} // namespace Stockfish +//} // namespace Stockfish #endif // #ifndef MEMORY_H_INCLUDED diff --git a/source/tt.cpp b/source/tt.cpp index 04ab79fa6..9a6dd83b1 100644 --- a/source/tt.cpp +++ b/source/tt.cpp @@ -14,8 +14,6 @@ // やねうら王独自拡張 #include "extra/key128.h" -using namespace Stockfish; - TranspositionTable TT; // 置換表をglobalに確保。 // 置換表のエントリーに対して与えられたデータを保存する。上書き動作 diff --git a/source/tt.h b/source/tt.h index d7f5213e8..bb7069848 100644 --- a/source/tt.h +++ b/source/tt.h @@ -5,6 +5,7 @@ //#include #include "types.h" #include "misc.h" +#include "memory.h" struct Key128; struct Key256; @@ -136,9 +137,7 @@ struct TranspositionTable { static constexpr int GENERATION_MASK = (0xFF << GENERATION_BITS) & 0xFF; public: - //~TranspositionTable() { aligned_ttmem_free(mem); } - // メモリの開放は、LargeMemoryクラスが勝手にやってくれるので、やねうら王では、 - // このclassのデストラクタでメモリを明示的に開放しなくて良い。 + ~TranspositionTable() { aligned_large_pages_free(table); } // 新しい探索ごとにこの関数を呼び出す。(generationを加算する。) // USE_GLOBAL_OPTIONSが有効のときは、このタイミングで、Options["Threads"]の値を