Skip to content

Commit

Permalink
- TranspositionTableのデストラクタでメモリ開放するように。
Browse files Browse the repository at this point in the history
- namespace Stockfishに入れるか…。
 ⇨ namespace Stockfishをすべてコメントアウトすることにした。
- KPPT,KPP_KKPTのメモリ確保修正。
- NNUE LEARNのメモリ確保、ビルド通ってなかったの修正。
- large pagesを使うときのメッセージは初回のみにする。
  • Loading branch information
yaneurao committed Oct 8, 2024
1 parent 9c7b3e0 commit 55bc03d
Show file tree
Hide file tree
Showing 10 changed files with 35 additions and 31 deletions.
8 changes: 4 additions & 4 deletions source/eval/evalhash.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@ struct HashTable

// ゼロクリアしておかないと、benchの結果が不安定になる。
// 気持ち悪いのでゼロクリアしておく。
entries_ = (T*)largeMemory.alloc(size * sizeof(T),alignof(T),true);
entries_ = (T*)aligned_large_pages_alloc(size * sizeof(T));
clear();
}
}

void release()
{
if (entries_)
{
largeMemory.free();
aligned_large_pages_free(entries_);
entries_ = nullptr;
}
}
Expand All @@ -44,7 +45,6 @@ struct HashTable

size_t size = 0;
T* entries_ = nullptr;
LargeMemory largeMemory;
};

#endif // EVALHASH_H_INCLUDED
#endif // EVALHASH_H_INCLUDED
8 changes: 5 additions & 3 deletions source/eval/kpp_kkpt/evaluate_kpp_kkpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 5 additions & 3 deletions source/eval/kppt/evaluate_kppt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "../../evaluate.h"
#include "../../position.h"
#include "../../misc.h"
#include "../../memory.h"
#include "../../usi.h"
#include "../../extra/bitop.h"

Expand Down Expand Up @@ -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)
Expand Down
2 changes: 0 additions & 2 deletions source/eval/nnue/evaluate_nnue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

#include "evaluate_nnue.h"

using namespace Stockfish;

namespace Eval {

namespace NNUE {
Expand Down
4 changes: 2 additions & 2 deletions source/eval/nnue/evaluate_nnue.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ namespace Eval::NNUE {
FeatureTransformer::GetHashValue() ^ Network::GetHashValue();

// 入力特徴量変換器
extern Stockfish::LargePagePtr<FeatureTransformer> feature_transformer;
extern LargePagePtr<FeatureTransformer> feature_transformer;

// 評価関数
extern Stockfish::AlignedPtr<Network> network;
extern AlignedPtr<Network> network;

// 評価関数ファイル名
extern const char* const kFileName;
Expand Down
7 changes: 2 additions & 5 deletions source/eval/nnue/trainer/trainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,14 +116,11 @@ std::shared_ptr<T> 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<ArgumentTypes>(arguments)...);
LargeMemoryDeleter<T> deleter;

//sync_cout << "trainer.alloc(" << sizeof(T) << "," << alignof(T) << ")" << sync_endl;

return std::shared_ptr<T>(ptr,deleter);
return std::shared_ptr<T>(ptr, LargePageDeleter<T>());

}

Expand Down
18 changes: 13 additions & 5 deletions source/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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されたメモリが返ることは保証されているので
Expand All @@ -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;
}
Expand Down Expand Up @@ -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
4 changes: 2 additions & 2 deletions source/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -198,6 +198,6 @@ T* align_ptr_up(T* ptr) {
}


} // namespace Stockfish
//} // namespace Stockfish

#endif // #ifndef MEMORY_H_INCLUDED
2 changes: 0 additions & 2 deletions source/tt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
// やねうら王独自拡張
#include "extra/key128.h"

using namespace Stockfish;

TranspositionTable TT; // 置換表をglobalに確保。

// 置換表のエントリーに対して与えられたデータを保存する。上書き動作
Expand Down
5 changes: 2 additions & 3 deletions source/tt.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
//#include <cstdint>
#include "types.h"
#include "misc.h"
#include "memory.h"

struct Key128;
struct Key256;
Expand Down Expand Up @@ -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"]の値を
Expand Down

0 comments on commit 55bc03d

Please sign in to comment.