Skip to content

Commit

Permalink
#170: [ccore.nnet.sync] Multi-core implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
annoviko committed Feb 13, 2018
1 parent b4a1032 commit 9057c85
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 18 deletions.
7 changes: 6 additions & 1 deletion ccore/src/nnet/sync.cpp
Expand Up @@ -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());

Expand Down Expand Up @@ -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<void *> argv(1, nullptr);
Expand Down
10 changes: 10 additions & 0 deletions ccore/src/nnet/sync.hpp
Expand Up @@ -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.
Expand Down
69 changes: 52 additions & 17 deletions ccore/tst/utest-sync.cpp
Expand Up @@ -26,6 +26,9 @@
#include <cmath>


#define SEQUENTIAL std::size_t (-1)


using namespace ccore::nnet;


Expand Down Expand Up @@ -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);

Expand All @@ -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<sync_ensemble> ensembles;
output_dynamic.allocate_sync_ensembles(0.1, ensembles);
Expand All @@ -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);
}


Expand Down

0 comments on commit 9057c85

Please sign in to comment.