From 27f8521d899c2cd9a2f9fa22956185d7ab765f8b Mon Sep 17 00:00:00 2001 From: Jorge Blanco Alonso Date: Tue, 1 Nov 2022 13:29:59 +0100 Subject: [PATCH 1/3] Flush the buffer if the buffer will be full before the next spike exchange --- src/data/sonata_data.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/data/sonata_data.cpp b/src/data/sonata_data.cpp index ee1d6f0..2139c70 100644 --- a/src/data/sonata_data.cpp +++ b/src/data/sonata_data.cpp @@ -151,7 +151,6 @@ void SonataData::record_data(double step, const std::vector& node_ids) // Increase steps recorded when all nodes from specific rank has been already recorded if (nodes_recorded_.size() == nodes_->size()) { steps_recorded_++; - check_and_write(step * SonataReport::atomic_step_); } } @@ -205,8 +204,12 @@ void SonataData::check_and_write(double timestep) { last_step_recorded_ += reporting_period_ * steps_recorded_; nodes_recorded_.clear(); - // Write when buffer is full or we finish all remaining recordings - if (current_step_ == steps_to_write_ || current_step_ == remaining_steps_) { + bool write_before_spike_exchange = (current_step_ + SonataReport::min_steps_to_record_) > + steps_to_write_; + // Write when buffer is full, if it will be full before next spike_exchange or when we finish + // all remaining recordings + if (current_step_ == steps_to_write_ || current_step_ == remaining_steps_ || + write_before_spike_exchange) { if (SonataReport::rank_ == 0) { logger->trace( "Writing to file {}! population {} steps_to_write={}, current_step={}, " From 84d632fa88ec59435bb1084a7f7ea8c963883352 Mon Sep 17 00:00:00 2001 From: Jorge Blanco Alonso Date: Tue, 1 Nov 2022 14:30:26 +0100 Subject: [PATCH 2/3] Check if it is time to write --- src/data/sonata_data.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/data/sonata_data.cpp b/src/data/sonata_data.cpp index 2139c70..a21766f 100644 --- a/src/data/sonata_data.cpp +++ b/src/data/sonata_data.cpp @@ -151,6 +151,9 @@ void SonataData::record_data(double step, const std::vector& node_ids) // Increase steps recorded when all nodes from specific rank has been already recorded if (nodes_recorded_.size() == nodes_->size()) { steps_recorded_++; + if (current_step_ + steps_recorded_ == steps_to_write_) { + check_and_write(step * SonataReport::atomic_step_); + } } } From d38bd0fe5e62f82b52e5b76882051747c23a3ac0 Mon Sep 17 00:00:00 2001 From: Jorge Blanco Alonso Date: Thu, 3 Nov 2022 12:03:05 +0100 Subject: [PATCH 3/3] Clang-format --- src/data/sonata_data.cpp | 12 ++++++------ tests/integration/integration_test.cpp | 13 +++++-------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/data/sonata_data.cpp b/src/data/sonata_data.cpp index a21766f..3f26148 100644 --- a/src/data/sonata_data.cpp +++ b/src/data/sonata_data.cpp @@ -343,22 +343,22 @@ void SonataData::write_data(const std::vector& buffered_data, uint32_t st if (remaining_steps_ <= 0) { // Nothing left to write return; } - if (steps_to_write >= remaining_steps_) { // Avoid writing out of bounds - steps_to_write = remaining_steps_; + if (steps_to_write >= remaining_steps_) { // Avoid writing out of bounds + steps_to_write = remaining_steps_; } if (SonataReport::rank_ == 0) { logger->debug("WRITING timestep data to file {} in population {}", report_name_, population_name_); } - hdf5_writer_->write_2D(buffered_data, steps_to_write , total_elements_); - remaining_steps_ -= steps_to_write ; + hdf5_writer_->write_2D(buffered_data, steps_to_write, total_elements_); + remaining_steps_ -= steps_to_write; if (SonataReport::rank_ == 0) { - logger->debug("\t-Steps written: {}", steps_to_write ); + logger->debug("\t-Steps written: {}", steps_to_write); logger->debug("\t-Remaining steps: {}", remaining_steps_); } last_position_ = 0; - steps_to_write = 0; + steps_to_write = 0; } void SonataData::flush() { diff --git a/tests/integration/integration_test.cpp b/tests/integration/integration_test.cpp index a3a797e..a688525 100644 --- a/tests/integration/integration_test.cpp +++ b/tests/integration/integration_test.cpp @@ -228,17 +228,14 @@ int main() { } const char* buffered_soma_report = "buffered_soma_report"; - init(buffered_soma_report, - tstart, - tstop, - dt, - soma_neurons, - "soma", - units); + init(buffered_soma_report, tstart, tstop, dt, soma_neurons, "soma", units); sonata_setup_communicators(); sonata_prepare_datasets(); - sonata_write_buffered_data(buffered_soma_report, soma_buffered_data.data(), soma_buffered_data.size(), num_steps); + sonata_write_buffered_data(buffered_soma_report, + soma_buffered_data.data(), + soma_buffered_data.size(), + num_steps); sonata_clear(); const std::string output_dir = ".";