From 9057c8551b66cde20b85d18927014849a9878a05 Mon Sep 17 00:00:00 2001 From: annoviko Date: Tue, 13 Feb 2018 11:12:59 +0300 Subject: [PATCH] #170: [ccore.nnet.sync] Multi-core implementation. --- ccore/src/nnet/sync.cpp | 7 +++- ccore/src/nnet/sync.hpp | 10 ++++++ ccore/tst/utest-sync.cpp | 69 ++++++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/ccore/src/nnet/sync.cpp b/ccore/src/nnet/sync.cpp index 3001bd8a..7a0a0c27 100644 --- a/ccore/src/nnet/sync.cpp +++ b/ccore/src/nnet/sync.cpp @@ -272,6 +272,11 @@ void sync_network::simulate_dynamic(const double order, const double step, const } +void sync_network::set_parallel_processing_trigger(const std::size_t p_network_size) { + m_parallel_trigger = p_network_size; +} + + void sync_network::store_dynamic(const double time, const bool collect_dynamic, sync_dynamic & output_dynamic) const { sync_network_state state(size()); @@ -341,7 +346,7 @@ void sync_network::calculate_phases(const solve_type solver, { std::size_t number_int_steps = (std::size_t) (step / int_step); - for (iterator iter = p_begin; iter != p_end; iter++) { + for (iterator iter = p_begin; iter != p_end; ++iter) { std::size_t index = std::distance(m_oscillators.begin(), iter); std::vector argv(1, nullptr); diff --git a/ccore/src/nnet/sync.hpp b/ccore/src/nnet/sync.hpp index abd2cd2f..a0a2d0e0 100644 --- a/ccore/src/nnet/sync.hpp +++ b/ccore/src/nnet/sync.hpp @@ -441,6 +441,16 @@ class sync_network { const bool collect_dynamic, sync_dynamic & output_dynamic); + /** + * + * @brief Set custom trigger (that is defined by network size) for parallel processing, + * by default this value is defined by static constant DEFAULT_DATA_SIZE_PARALLEL_PROCESSING. + * + * @param[in] p_data_size: network size that triggers parallel processing. + * + */ + virtual void set_parallel_processing_trigger(const std::size_t p_network_size); + /** * * @brief Returns size of the oscillatory network that is defined by amount of oscillators. diff --git a/ccore/tst/utest-sync.cpp b/ccore/tst/utest-sync.cpp index 79fec602..90523fbf 100644 --- a/ccore/tst/utest-sync.cpp +++ b/ccore/tst/utest-sync.cpp @@ -26,6 +26,9 @@ #include +#define SEQUENTIAL std::size_t (-1) + + using namespace ccore::nnet; @@ -77,9 +80,13 @@ TEST(utest_sync, create_delete_none_gaussian) { } -static void template_dynamic_convergence(const unsigned int number_oscillators, const solve_type solver, const connection_t type, const initial_type initial) { +static void template_dynamic_convergence(const unsigned int number_oscillators, const solve_type solver, const connection_t type, const initial_type initial, const std::size_t p_trigger) { sync_network network(number_oscillators, 1, 0, type, initial); + if (p_trigger != SEQUENTIAL) { + network.set_parallel_processing_trigger(p_trigger); + } + sync_dynamic output_dynamic; network.simulate_dynamic(0.998, 0.1, solver, false, output_dynamic); @@ -90,31 +97,46 @@ static void template_dynamic_convergence(const unsigned int number_oscillators, } TEST(utest_sync, dynamic_convergance_10_oscillators_all_to_all) { - template_dynamic_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_dynamic_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_convergance_20_oscillators_all_to_all) { - template_dynamic_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_dynamic_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_convergance_16_oscillators_grid_four) { - template_dynamic_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION); + template_dynamic_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_convergance_16_oscillators_grid_eight) { - template_dynamic_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_EIGHT, initial_type::EQUIPARTITION); + template_dynamic_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_EIGHT, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_convergance_5_oscillators_list_bidir) { - template_dynamic_convergence(5, solve_type::FORWARD_EULER, connection_t::CONNECTION_LIST_BIDIRECTIONAL, initial_type::EQUIPARTITION); + template_dynamic_convergence(5, solve_type::FORWARD_EULER, connection_t::CONNECTION_LIST_BIDIRECTIONAL, initial_type::EQUIPARTITION, SEQUENTIAL); } +TEST(utest_sync, dynamic_convergance_16_oscillators_grid_four_parallel) { + template_dynamic_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, 0); +} + +TEST(utest_sync, dynamic_convergance_25_oscillators_grid_four_parallel) { + template_dynamic_convergence(25, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, 0); +} + +TEST(utest_sync, dynamic_convergance_36_oscillators_grid_four_parallel) { + template_dynamic_convergence(36, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, 0); +} -static void template_static_convergence(const unsigned int number_oscillators, const solve_type solver, const connection_t type, const initial_type initial) { +static void template_static_convergence(const unsigned int number_oscillators, const solve_type solver, const connection_t type, const initial_type initial, const std::size_t p_trigger) { sync_network network(number_oscillators, 1.0, 0, type, initial); + if (p_trigger != SEQUENTIAL) { + network.set_parallel_processing_trigger(p_trigger); + } + sync_dynamic output_dynamic; - network.simulate_static(25, 10, solver, false, output_dynamic); + network.simulate_static(50, 10, solver, false, output_dynamic); ensemble_data ensembles; output_dynamic.allocate_sync_ensembles(0.1, ensembles); @@ -123,40 +145,53 @@ static void template_static_convergence(const unsigned int number_oscillators, c } TEST(utest_sync, static_convergance_10_oscillators_all_to_all) { - template_static_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_static_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, static_convergance_20_oscillators_all_to_all) { - template_static_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_static_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, static_convergance_9_oscillators_grid_four) { - template_static_convergence(9, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION); + template_static_convergence(9, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, static_convergance_9_oscillators_grid_eight) { - template_static_convergence(9, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_EIGHT, initial_type::EQUIPARTITION); + template_static_convergence(9, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_EIGHT, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, static_convergance_3_oscillators_list_bidir) { - template_static_convergence(3, solve_type::FORWARD_EULER, connection_t::CONNECTION_LIST_BIDIRECTIONAL, initial_type::EQUIPARTITION); + template_static_convergence(3, solve_type::FORWARD_EULER, connection_t::CONNECTION_LIST_BIDIRECTIONAL, initial_type::EQUIPARTITION, SEQUENTIAL); } +TEST(utest_sync, static_convergance_10_oscillators_all_to_all_parallel) { + template_static_convergence(10, solve_type::FORWARD_EULER, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, 0); +} + +TEST(utest_sync, static_convergance_9_oscillators_grid_four_parallel) { + template_static_convergence(9, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, 0); +} + +TEST(utest_sync, static_convergance_16_oscillators_grid_four_parallel) { + template_static_convergence(16, solve_type::FORWARD_EULER, connection_t::CONNECTION_GRID_FOUR, initial_type::EQUIPARTITION, 0); +} + + TEST(utest_sync, static_simulation_runge_kutta_4) { - template_static_convergence(2, solve_type::RUNGE_KUTTA_4, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_static_convergence(2, solve_type::RUNGE_KUTTA_4, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, static_simulation_runge_kutta_fehlberg_45) { - template_static_convergence(2, solve_type::RUNGE_KUTTA_FEHLBERG_45, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_static_convergence(2, solve_type::RUNGE_KUTTA_FEHLBERG_45, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_simulation_runge_kutta_4) { - template_dynamic_convergence(2, solve_type::RUNGE_KUTTA_4, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_dynamic_convergence(2, solve_type::RUNGE_KUTTA_4, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); } TEST(utest_sync, dynamic_simulation_runge_kutta_fehlberg_45) { - template_dynamic_convergence(2, solve_type::RUNGE_KUTTA_FEHLBERG_45, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION); + template_dynamic_convergence(2, solve_type::RUNGE_KUTTA_FEHLBERG_45, connection_t::CONNECTION_ALL_TO_ALL, initial_type::EQUIPARTITION, SEQUENTIAL); }