diff --git a/CMakeLists.txt b/CMakeLists.txt index 71a5d5e..553445b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt5 REQUIRED COMPONENTS Core) find_package(Qt5 REQUIRED COMPONENTS Gui Widgets) +find_package(OpenMP) add_executable(samplebrain WIN32 MACOSX_BUNDLE app/MainWindow.cpp app/MainWindow.h @@ -64,6 +65,11 @@ target_link_libraries(samplebrain PRIVATE sndfile ) +if(OpenMP_CXX_FOUND) + target_link_libraries(samplebrain PUBLIC OpenMP::OpenMP_CXX) +endif() + + # Resources: set(samplebrain_resource_files "app/images/at.png" diff --git a/brain/src/brain.cpp b/brain/src/brain.cpp index 73af15d..7426232 100644 --- a/brain/src/brain.cpp +++ b/brain/src/brain.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -245,10 +246,12 @@ void brain::build_synapses_thresh(search_params ¶ms, double thresh) { m_average_error = calc_average_diff(params)*thresh; double err = m_average_error*thresh; u32 brain_size = m_blocks.size(); - u32 outer_index = 0; - for (auto &i : m_blocks) { + std::atomic progress{0}; + #pragma omp parallel for + for (u32 outer_index = 0; outer_index < brain_size; ++outer_index) { + auto &i = m_blocks[outer_index]; u32 index = 0; - status::update("building synapses %d%%",(int)(outer_index/(float)brain_size*100)); + status::update("building synapses %d%%",(int)(progress/(float)brain_size*100)); for (auto &j : m_blocks) { if (index!=outer_index) { // collect connections that are under threshold in closeness @@ -259,7 +262,7 @@ void brain::build_synapses_thresh(search_params ¶ms, double thresh) { } ++index; } - ++outer_index; + ++progress; } } */ @@ -267,23 +270,25 @@ void brain::build_synapses_thresh(search_params ¶ms, double thresh) { void brain::build_synapses_fixed(search_params ¶ms) { //m_average_error = calc_average_diff(params)*thresh; u32 brain_size = m_blocks.size(); - u32 outer_index = 0; u32 num_synapses = NUM_FIXED_SYNAPSES; if (num_synapses>=m_blocks.size()) num_synapses=m_blocks.size()-1; // need to stop the progress updates flooding osc u32 update_period = 100; - u32 update_tick = 0; - - for (auto &i:m_blocks) { + std::atomic update_tick{0}; + std::atomic progress{0}; + #pragma omp parallel for + for (u32 outer_index = 0; outer_index < brain_size; ++outer_index) { + auto &i = m_blocks[outer_index]; if (update_tick>update_period) { - status::update("building synapses %d%%",(int)(outer_index/(float)brain_size*100)); + status::update("building synapses %d%%",(int)(progress/(float)brain_size*100)); update_tick=0; } update_tick++; u32 index = 0; vector> collect; + collect.reserve(brain_size); // collect comparisons to all other blocks for (auto &j:m_blocks) { @@ -308,7 +313,7 @@ void brain::build_synapses_fixed(search_params ¶ms) { i.get_synapse().push_back(collect[n].first); } - ++outer_index; + ++progress; } status::update("Done: %d synapses grown for %d blocks",num_synapses*brain_size,brain_size); }