mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 13:17:44 +00:00
Move gensfen progress reporting from sfen writer to gensfen
This commit is contained in:
+60
-33
@@ -134,20 +134,6 @@ namespace Learner
|
|||||||
// Dedicated thread to write to file
|
// Dedicated thread to write to file
|
||||||
void file_write_worker()
|
void file_write_worker()
|
||||||
{
|
{
|
||||||
auto startTime = now();
|
|
||||||
|
|
||||||
auto output_status = [&]()
|
|
||||||
{
|
|
||||||
// Also output the current time to console.
|
|
||||||
const auto nowTime = now();
|
|
||||||
const TimePoint elapsed = nowTime - startTime + 1;
|
|
||||||
|
|
||||||
sync_cout << endl
|
|
||||||
<< sfen_write_count << " sfens, "
|
|
||||||
<< sfen_write_count * 1000 / elapsed << " sfens/second, "
|
|
||||||
<< "at " << now_string() << sync_endl;
|
|
||||||
};
|
|
||||||
|
|
||||||
while (!finished || sfen_buffers_pool.size())
|
while (!finished || sfen_buffers_pool.size())
|
||||||
{
|
{
|
||||||
vector<std::unique_ptr<PSVector>> buffers;
|
vector<std::unique_ptr<PSVector>> buffers;
|
||||||
@@ -190,28 +176,9 @@ namespace Learner
|
|||||||
output_file_stream = create_new_sfen_output(new_filename, sfen_output_type);
|
output_file_stream = create_new_sfen_output(new_filename, sfen_output_type);
|
||||||
cout << endl << "output sfen file = " << new_filename << endl;
|
cout << endl << "output sfen file = " << new_filename << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output '.' every time when writing a game record.
|
|
||||||
std::cout << ".";
|
|
||||||
|
|
||||||
// Output the number of phases processed
|
|
||||||
// every STATUS_OUTPUT_PERIOD times
|
|
||||||
// Finally, the remainder of the teacher phase
|
|
||||||
// of each thread is written out,
|
|
||||||
// so halfway numbers are displayed, but is it okay?
|
|
||||||
// If you overuse the threads to the maximum number
|
|
||||||
// of logical cores, the console will be clogged,
|
|
||||||
// so it may be beneficial to increase that value.
|
|
||||||
if ((++batch_counter % STATUS_OUTPUT_PERIOD) == 0)
|
|
||||||
{
|
|
||||||
output_status();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output the status again after whole processing is done.
|
|
||||||
output_status();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_save_interval(uint64_t v)
|
void set_save_interval(uint64_t v)
|
||||||
@@ -267,6 +234,10 @@ namespace Learner
|
|||||||
// It must be 2**N because it will be used as the mask to calculate hash_index.
|
// It must be 2**N because it will be used as the mask to calculate hash_index.
|
||||||
static_assert((GENSFEN_HASH_SIZE& (GENSFEN_HASH_SIZE - 1)) == 0);
|
static_assert((GENSFEN_HASH_SIZE& (GENSFEN_HASH_SIZE - 1)) == 0);
|
||||||
|
|
||||||
|
static constexpr uint64_t REPORT_DOT_EVERY = 5000;
|
||||||
|
static constexpr uint64_t REPORT_STATS_EVERY = 200000;
|
||||||
|
static_assert(REPORT_STATS_EVERY % REPORT_DOT_EVERY == 0);
|
||||||
|
|
||||||
MultiThinkGenSfen(int search_depth_min_, int search_depth_max_, SfenWriter& sw_, const std::string& seed) :
|
MultiThinkGenSfen(int search_depth_min_, int search_depth_max_, SfenWriter& sw_, const std::string& seed) :
|
||||||
prng(seed),
|
prng(seed),
|
||||||
search_depth_min(search_depth_min_),
|
search_depth_min(search_depth_min_),
|
||||||
@@ -296,6 +267,10 @@ namespace Learner
|
|||||||
|
|
||||||
bool was_seen_before(const Position& pos);
|
bool was_seen_before(const Position& pos);
|
||||||
|
|
||||||
|
void report(uint64_t done, uint64_t new_done);
|
||||||
|
|
||||||
|
void maybe_report(uint64_t done);
|
||||||
|
|
||||||
bool commit_psv(
|
bool commit_psv(
|
||||||
Thread& th,
|
Thread& th,
|
||||||
PSVector& sfens,
|
PSVector& sfens,
|
||||||
@@ -351,6 +326,9 @@ namespace Learner
|
|||||||
int write_minply;
|
int write_minply;
|
||||||
int write_maxply;
|
int write_maxply;
|
||||||
|
|
||||||
|
std::mutex stats_mutex;
|
||||||
|
TimePoint last_stats_report_time;
|
||||||
|
|
||||||
// sfen exporter
|
// sfen exporter
|
||||||
SfenWriter& sfen_writer;
|
SfenWriter& sfen_writer;
|
||||||
|
|
||||||
@@ -359,11 +337,20 @@ namespace Learner
|
|||||||
|
|
||||||
void MultiThinkGenSfen::gensfen(uint64_t limit)
|
void MultiThinkGenSfen::gensfen(uint64_t limit)
|
||||||
{
|
{
|
||||||
|
last_stats_report_time = 0;
|
||||||
|
|
||||||
std::atomic<uint64_t> counter{0};
|
std::atomic<uint64_t> counter{0};
|
||||||
Threads.execute_with_workers([&counter, limit, this](Thread& th) {
|
Threads.execute_with_workers([&counter, limit, this](Thread& th) {
|
||||||
thread_worker(th, counter, limit);
|
thread_worker(th, counter, limit);
|
||||||
});
|
});
|
||||||
Threads.wait_for_workers_finished();
|
Threads.wait_for_workers_finished();
|
||||||
|
|
||||||
|
if (limit % REPORT_STATS_EVERY != 0)
|
||||||
|
{
|
||||||
|
report(limit, limit % REPORT_STATS_EVERY);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<int8_t> MultiThinkGenSfen::get_current_game_result(
|
optional<int8_t> MultiThinkGenSfen::get_current_game_result(
|
||||||
@@ -484,6 +471,43 @@ namespace Learner
|
|||||||
return nullopt;
|
return nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MultiThinkGenSfen::report(uint64_t done, uint64_t new_done)
|
||||||
|
{
|
||||||
|
const auto now_time = now();
|
||||||
|
const TimePoint elapsed = now_time - last_stats_report_time + 1;
|
||||||
|
|
||||||
|
sync_cout
|
||||||
|
<< endl
|
||||||
|
<< done << " sfens, "
|
||||||
|
<< new_done * 1000 / elapsed << " sfens/second, "
|
||||||
|
<< "at " << now_string() << sync_endl;
|
||||||
|
|
||||||
|
last_stats_report_time = now_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiThinkGenSfen::maybe_report(uint64_t done)
|
||||||
|
{
|
||||||
|
if (done % REPORT_DOT_EVERY == 0)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(stats_mutex);
|
||||||
|
|
||||||
|
if (last_stats_report_time == 0)
|
||||||
|
{
|
||||||
|
last_stats_report_time = now();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (done != 0)
|
||||||
|
{
|
||||||
|
std::cout << '.';
|
||||||
|
|
||||||
|
if (done % REPORT_STATS_EVERY == 0)
|
||||||
|
{
|
||||||
|
report(done, REPORT_STATS_EVERY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Write out the phases loaded in sfens to a file.
|
// Write out the phases loaded in sfens to a file.
|
||||||
// lastTurnIsWin: win/loss in the next phase after the final phase in sfens
|
// lastTurnIsWin: win/loss in the next phase after the final phase in sfens
|
||||||
// 1 when winning. -1 when losing. Pass 0 for a draw.
|
// 1 when winning. -1 when losing. Pass 0 for a draw.
|
||||||
@@ -521,6 +545,9 @@ namespace Learner
|
|||||||
if (iter >= limit)
|
if (iter >= limit)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// because `iter` was done, now we do one more
|
||||||
|
maybe_report(iter + 1);
|
||||||
|
|
||||||
// Write out one sfen.
|
// Write out one sfen.
|
||||||
sfen_writer.write(th.thread_idx(), sfen);
|
sfen_writer.write(th.thread_idx(), sfen);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user