diff --git a/brain/src/brain.cpp b/brain/src/brain.cpp index b57db1b..0f4d2e8 100644 --- a/brain/src/brain.cpp +++ b/brain/src/brain.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -242,10 +243,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 @@ -256,30 +259,32 @@ void brain::build_synapses_thresh(search_params ¶ms, double thresh) { } ++index; } - ++outer_index; + ++progress; } } 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) { @@ -304,7 +309,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); } diff --git a/samplebrain.pro b/samplebrain.pro index d3c10b7..7f956ac 100644 --- a/samplebrain.pro +++ b/samplebrain.pro @@ -43,9 +43,9 @@ SOURCES += app/MainWindow.cpp \ INCLUDEPATH += brain/src INCLUDEPATH += /usr/local/include INCLUDEPATH += /opt/local/include -LIBS += -L.. -L/usr/local/lib -L/opt/local/lib -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm +LIBS += -L.. -L/usr/local/lib -L/opt/local/lib -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm -fopenmp -QMAKE_CXXFLAGS += -O3 -march=core2 -Wall -Wno-unused -std=c++11 +QMAKE_CXXFLAGS += -O3 -march=core2 -fopenmp -Wall -Wno-unused -std=c++11 # assets RESOURCES = app/samplebrain.qrc