[med-svn] [SCM] aghermann branch, master, updated. 4f7a3b774136ffffbaf9b05d90bd568347bc5461
andrei zavada
johnhommer at gmail.com
Fri Nov 16 00:50:25 UTC 2012
The following commit has been merged in the master branch:
commit 9422b1e7fb7b7d150160736194cd56ce1c1d0990
Author: andrei zavada <johnhommer at gmail.com>
Date: Sun Oct 21 03:22:20 2012 +0300
WIP
diff --git a/data/main.glade b/data/main.glade
index ccc085b..9745216 100644
--- a/data/main.glade
+++ b/data/main.glade
@@ -349,7 +349,6 @@
<property name="page_increment">0.5</property>
</object>
<object class="GtkAdjustment" id="jMsmtOpFreqFrom">
- <property name="lower">0.25</property>
<property name="upper">60</property>
<property name="value">2</property>
<property name="step_increment">0.25</property>
@@ -374,6 +373,11 @@
<property name="step_increment">1</property>
<property name="page_increment">5</property>
</object>
+ <object class="GtkAdjustment" id="jSMPMaxThreads">
+ <property name="upper">16</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
<object class="GtkAdjustment" id="jUltradianCycleDetectionAccuracy">
<property name="lower">0.5</property>
<property name="upper">20</property>
@@ -693,7 +697,6 @@ rm */*/*/.*.{psd,mc}</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="iMontageSetDefaults">
- <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Set _defaults...</property>
<property name="use_underline">True</property>
@@ -1601,9 +1604,6 @@ rm */*/*/.*.{psd,mc}</property>
<placeholder/>
</child>
<child>
- <placeholder/>
- </child>
- <child>
<object class="GtkFrame" id="fFreqConventionalRanges">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -2376,6 +2376,80 @@ rm */*/*/.*.{psd,mc}</property>
<property name="bottom_attach">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkFrame" id="fSMP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkTable" id="table29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">10</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">10</property>
+ <property name="row_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Max threads to use: </property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">eArtifDampenFactor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="eSMPMaxThreads">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_frame">False</property>
+ <property name="invisible_char">•</property>
+ <property name="xalign">1</property>
+ <property name="shadow_type">none</property>
+ <property name="invisible_char_set">True</property>
+ <property name="adjustment">jSMPMaxThreads</property>
+ <property name="numeric">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">(0 = all available)</property>
+ <attributes>
+ <attribute name="scale" value="0.90000000000000002"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"><b><big>SMP</big></b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
</object>
</child>
<child type="tab">
@@ -6692,6 +6766,12 @@ EEG microcontinuity algorithm. Read more <a href="http://johnhommer.com/acade
<child>
<placeholder/>
</child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
</object>
</child>
<child>
diff --git a/src/common/globals.hh b/src/common/globals.hh
index d6de34c..37148b2 100644
--- a/src/common/globals.hh
+++ b/src/common/globals.hh
@@ -27,6 +27,7 @@ namespace global {
extern gsl_rng *rng;
void init_rng();
+extern int num_procs;
// typedef std::valarray<TFloat> VAF;
diff --git a/src/common/libcommon.cc b/src/common/libcommon.cc
index 3f2ca43..b7a1bed 100644
--- a/src/common/libcommon.cc
+++ b/src/common/libcommon.cc
@@ -210,4 +210,9 @@ init_rng()
rng = gsl_rng_alloc( T);
}
+
+
+
+int agh::global::num_procs = 1;
+
// eof
diff --git a/src/expdesign/primaries.cc b/src/expdesign/primaries.cc
index d5cc114..ceb43f9 100644
--- a/src/expdesign/primaries.cc
+++ b/src/expdesign/primaries.cc
@@ -16,7 +16,11 @@
#include <string>
#include <fstream>
-//#include "../common/lang.hh"
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
+#include "../common/globals.hh"
#include "../common/config-validate.hh"
#include "primaries.hh"
@@ -29,7 +33,8 @@ using namespace agh;
agh::CExpDesign::
CExpDesign (const string& session_dir_,
TMsmtCollectProgressIndicatorFun progress_fun)
- : af_dampen_window_type (sigfile::SFFTParamSet::TWinType::welch),
+ : num_threads (0),
+ af_dampen_window_type (sigfile::SFFTParamSet::TWinType::welch),
af_dampen_factor (.95),
tunables0 (tstep, tlo, thi),
_id_pool (0),
@@ -48,6 +53,7 @@ CExpDesign (const string& session_dir_,
confval::SValidator<double>("mcparam.iir_backpolate", &mc_params.iir_backpolate, confval::SValidator<double>::SVFRangeIn( 0., 1.)),
}),
config_keys_d ({
+ confval::SValidator<int>("smp.num_threads", &num_threads, confval::SValidator<int>::SVFRangeIn( 0, 20)),
confval::SValidator<int>("fftparam.WelchWindowType", (int*)&fft_params.welch_window_type, confval::SValidator<int>::SVFRangeIn( 0, (int)sigfile::SFFTParamSet::TWinType::_total - 1)),
confval::SValidator<int>("artifacts.DampenWindowType", (int*)&af_dampen_window_type, confval::SValidator<int>::SVFRangeIn( 0, (int)sigfile::SFFTParamSet::TWinType::_total - 1)),
confval::SValidator<int>("ctlparam.ItersFixedT", &ctl_params0.siman_params.iters_fixed_T, confval::SValidator<int>::SVFRangeIn( 1, 1000000)),
@@ -89,6 +95,10 @@ CExpDesign (const string& session_dir_,
mc_params.scope = fft_params.pagesize;
+#ifdef _OPENMP
+ omp_set_num_threads( (num_threads == 0) ? agh::global::num_procs : num_threads);
+ printf( "SMP enabled with %d threads\n", omp_get_max_threads());
+#endif
scan_tree( progress_fun);
}
@@ -126,16 +136,22 @@ for_all_subjects( const TSubjectOpFun& F, const TSubjectReportFun& report, const
if ( filter(J) )
v.emplace_back( make_tuple(&G.second, &J));
size_t global_i = 0;
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for ( size_t i = 0; i < v.size(); ++i ) {
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
report( *get<0>(v[i]), *get<1>(v[i]),
++global_i, v.size());
}
F( *get<1>(v[i]));
}
+#ifdef _OPENMP
#pragma omp barrier
+#endif
}
@@ -154,16 +170,22 @@ for_all_episodes( const TEpisodeOpFun& F, const TEpisodeReportFun& report, const
if ( filter(E) )
v.emplace_back( make_tuple(&G.second, &J, &M.first, &E));
size_t global_i = 0;
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for ( size_t i = 0; i < v.size(); ++i ) {
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
report( *get<0>(v[i]), *get<1>(v[i]), *get<2>(v[i]), *get<3>(v[i]),
++global_i, v.size());
}
F( *get<3>(v[i]));
}
+#ifdef _OPENMP
#pragma omp barrier
+#endif
}
@@ -187,16 +209,22 @@ for_all_recordings( const TRecordingOpFun& F, const TRecordingReportFun& report,
&E,
&R.second));
size_t global_i = 0;
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for ( size_t i = 0; i < v.size(); ++i ) {
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
report( *get<0>(v[i]), *get<1>(v[i]), *get<2>(v[i]), *get<3>(v[i]), *get<4>(v[i]),
++global_i, v.size());
}
F( *get<4>(v[i]));
}
+#ifdef _OPENMP
#pragma omp barrier
+#endif
}
void
@@ -225,16 +253,22 @@ for_all_modruns( const TModelRunOpFun& F, const TModelRunReportFun& report, cons
&Q.first,
&Q.second));
size_t global_i = 0;
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for ( size_t i = 0; i < v.size(); ++i ) {
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
report( *get<0>(v[i]), *get<1>(v[i]), *get<2>(v[i]), *get<3>(v[i]), *get<4>(v[i]), *get<5>(v[i]), *get<6>(v[i]),
++global_i, v.size());
}
F( *get<6>(v[i]));
}
+#ifdef _OPENMP
#pragma omp barrier
+#endif
}
diff --git a/src/expdesign/primaries.hh b/src/expdesign/primaries.hh
index 51437bb..c1a81b1 100644
--- a/src/expdesign/primaries.hh
+++ b/src/expdesign/primaries.hh
@@ -427,6 +427,7 @@ class CExpDesign {
for_all_modruns( const TModelRunOpFun&, const TModelRunReportFun&, const TModelRunFilterFun&);
// inventory
+ int num_threads;
sigfile::SFFTParamSet
fft_params;
sigfile::SMCParamSet
diff --git a/src/main.cc b/src/main.cc
index 3b287cd..daa41d0 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -12,6 +12,9 @@
+#ifdef _OPENMP
+#include <omp.h>
+#endif
#include <gtk/gtk.h>
#include <unique/unique.h>
@@ -84,6 +87,9 @@ main( int argc, char **argv)
NULL);
agh::global::init_rng();
+#ifdef _OPENMP
+ agh::global::num_procs = omp_get_max_threads();
+#endif
if ( aghui::prepare_for_expdesign() ) {
aghui::pop_ok_message( NULL, "UI failed to initialize", "Your install is broken.");
return 2;
diff --git a/src/ui/Makefile.am b/src/ui/Makefile.am
index 025eccc..fc31bd8 100644
--- a/src/ui/Makefile.am
+++ b/src/ui/Makefile.am
@@ -1,7 +1,8 @@
AM_CXXFLAGS = \
-std=c++0x -Wdeprecated-declarations \
$(GTK_CFLAGS) $(LIBCONFIGXX_CFLAGS) \
- -DPACKAGE_DATADIR=\"$(datadir)\"
+ -DPACKAGE_DATADIR=\"$(datadir)\" \
+ $(OPENMP_CXXFLAGS)
noinst_LIBRARIES = libaghui.a
diff --git a/src/ui/ed-construct.cc b/src/ui/ed-construct.cc
index 583849f..80f8f8b 100644
--- a/src/ui/ed-construct.cc
+++ b/src/ui/ed-construct.cc
@@ -387,7 +387,7 @@ SExpDesignUIWidgets ()
!AGH_GBGETOBJ (GtkLabel, lSimulationsSession) )
throw runtime_error ("Failed to construct widgets");
- // ======= statusbar
+ // ------- statusbar
if ( !AGH_GBGETOBJ (GtkStatusbar, sbMainStatusBar) )
throw runtime_error ("Failed to construct widgets");
@@ -401,11 +401,12 @@ SExpDesignUIWidgets ()
// free? unref? leak some?
// ****************** settings
- // ------------- fFFTParams
- if ( !AGH_GBGETOBJ (GtkSpinButton, eUltradianCycleDetectionAccuracy) )
+ if ( !AGH_GBGETOBJ (GtkSpinButton, eSMPMaxThreads) )
throw runtime_error ("Failed to construct widgets");
- if ( !AGH_GBGETOBJ (GtkComboBox, eFFTParamsBinSize) ||
+ // ------------- fFFTParams
+ if ( !AGH_GBGETOBJ (GtkSpinButton, eUltradianCycleDetectionAccuracy) ||
+ !AGH_GBGETOBJ (GtkComboBox, eFFTParamsBinSize) ||
!AGH_GBGETOBJ (GtkComboBox, eFFTParamsPageSize) ||
!AGH_GBGETOBJ (GtkComboBox, eFFTParamsWindowType) )
throw runtime_error ("Failed to construct widgets");
diff --git a/src/ui/ed-populate.cc b/src/ui/ed-populate.cc
index 0999358..c421b16 100644
--- a/src/ui/ed-populate.cc
+++ b/src/ui/ed-populate.cc
@@ -59,7 +59,7 @@ populate( bool do_load)
printf( "* single common EEG samplerate: %zu\n", used_eeg_samplerates.front());
else
printf( "* multiple EEG samplerates (%zu)\n", used_eeg_samplerates.size());
- printf( "* global AD profils: %zu\n", global_artifact_detection_profiles.size());
+ printf( "* global AD profiles: %zu\n", global_artifact_detection_profiles.size());
if ( do_load ) {
if ( load_settings() )
diff --git a/src/ui/ed-settings_cb.cc b/src/ui/ed-settings_cb.cc
index ec0c96c..9a856ef 100644
--- a/src/ui/ed-settings_cb.cc
+++ b/src/ui/ed-settings_cb.cc
@@ -11,6 +11,11 @@
*/
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
+#include "../common/globals.hh"
#include "../common/string.hh"
#include "misc.hh"
#include "ed.hh"
@@ -55,6 +60,10 @@ tDesign_switch_page_cb( GtkNotebook*, gpointer, guint page_num, gpointer userdat
ED.adjust_op_freq_spinbuttons();
+#ifdef _OPENMP
+ omp_set_num_threads( (ED.ED->num_threads == 0) ? agh::global::num_procs : ED.ED->num_threads);
+ printf( "SMP enabled with %d thread(s)\n", omp_get_max_threads());
+#endif
// scan as necessary
if ( ED.pagesize_item_saved != ED.pagesize_item ||
ED.binsize_item_saved != ED.binsize_item ||
diff --git a/src/ui/ed-widgets.hh b/src/ui/ed-widgets.hh
index aafff37..b2e217e 100644
--- a/src/ui/ed-widgets.hh
+++ b/src/ui/ed-widgets.hh
@@ -145,6 +145,8 @@ struct SExpDesignUIWidgets {
// settings
GtkSpinButton
+ *eSMPMaxThreads;
+ GtkSpinButton
*eUltradianCycleDetectionAccuracy;
GtkComboBox
*eFFTParamsWindowType,
diff --git a/src/ui/ed.cc b/src/ui/ed.cc
index 9bbe43e..8d98457 100644
--- a/src/ui/ed.cc
+++ b/src/ui/ed.cc
@@ -20,6 +20,7 @@
#include "../common/config-validate.hh"
#include "../libsigfile/page-metrics-base.hh"
#include "../expdesign/primaries.hh"
+#include "../libsigfile/artifacts.hh"
#include "../model/beersma.hh"
#include "misc.hh"
#include "sf.hh"
@@ -193,17 +194,19 @@ SExpDesignUI (aghui::SSessionChooser *parent,
// bind fields to widgets
// tab 1
- W_V1.reg( eUltradianCycleDetectionAccuracy, &uc_accuracy_factor);
+ W_V1.reg( eSMPMaxThreads, &ED->num_threads);
W_V1.reg( eArtifDampenWindowType, (int*)&ED->af_dampen_window_type);
W_V1.reg( eArtifDampenFactor, &ED->af_dampen_factor);
- W_V1.reg( eFFTParamsPageSize, &pagesize_item);
- W_V1.reg( eFFTParamsBinSize, &binsize_item);
W_V1.reg( eFFTParamsWindowType, (int*)&ED->fft_params.welch_window_type);
- for ( size_t i = 0; i < sigfile::SPage::TScore::_total; ++i )
- W_V1.reg( eScoreCode[i], &ext_score_codes[i]);
W_V1.reg( eMCParamIIRBackpolate, &ED->mc_params.iir_backpolate);
W_V1.reg( eMCParamMCGain, &ED->mc_params.mc_gain);
W_V1.reg( eMCParamBandWidth, &ED->mc_params.bandwidth);
+
+ W_V1.reg( eFFTParamsPageSize, &pagesize_item);
+ W_V1.reg( eFFTParamsBinSize, &binsize_item);
+ W_V1.reg( eUltradianCycleDetectionAccuracy, &uc_accuracy_factor);
+ for ( size_t i = 0; i < sigfile::SPage::TScore::_total; ++i )
+ W_V1.reg( eScoreCode[i], &ext_score_codes[i]);
for ( size_t i = 0; i < sigfile::TBand::_total; ++i ) {
W_V1.reg( eBand[i][0], &freq_bands[i][0]);
W_V1.reg( eBand[i][1], &freq_bands[i][1]);
@@ -262,7 +265,7 @@ load_artifact_detection_profiles()
FILE *domien = fopen( (ED->session_dir() + "/.AD_profiles").c_str(), "r");
if ( domien ) {
while ( !feof (domien) ) {
- SDetectArtifactsParamPack P;
+ sigfile::SArtifactDetectionPP P;
DEF_UNIQUE_CHARP (_);
int int_estimate_E, int_use_range;
if ( 16 ==
diff --git a/src/ui/ed_cb.cc b/src/ui/ed_cb.cc
index d3bfd44..ba3ad51 100644
--- a/src/ui/ed_cb.cc
+++ b/src/ui/ed_cb.cc
@@ -180,7 +180,7 @@ iExpGloballyDetectArtifacts_activate_cb( GtkMenuItem*, gpointer userdata)
if ( not keep_existing )
af.clear_all();
auto marked
- = sigfile::detect_artifacts( signal_original, sr, P);P
+ = sigfile::detect_artifacts( signal_original, sr, P);
for ( size_t p = 0; p < marked.size(); ++p )
af.mark_artifact(
marked[p] * P.scope * sr,
diff --git a/src/ui/sf-channel.cc b/src/ui/sf-channel.cc
index a007608..343f24a 100644
--- a/src/ui/sf-channel.cc
+++ b/src/ui/sf-channel.cc
@@ -340,38 +340,10 @@ calculate_dirty_percent()
void
aghui::SScoringFacility::SChannel::
-detect_artifacts( const aghui::SExpDesignUI::SDetectArtifactsParamPack& P)
+detect_artifacts( const sigfile::SArtifactDetectionPP& P)
{
- auto sssu =
- sigfile::CBinnedMC::do_sssu_reduction(
- signal_original,
- samplerate(), P.scope,
- P.mc_gain, P.iir_backpolate,
- P.f0, P.fc, P.bandwidth);
- valarray<TFloat>
- sssu_diff =
- {sssu.first - sssu.second};
-
- sigproc::smooth( sssu_diff, P.smooth_side);
-
- double E;
- if ( P.estimate_E )
- E = P.use_range
- ? sigfile::CBinnedMC::estimate_E(
- sssu_diff,
- P.sssu_hist_size,
- P.dmin, P.dmax)
- : sigfile::CBinnedMC::estimate_E(
- sssu_diff,
- P.sssu_hist_size);
- else
- E = P.E;
-
auto marked =
- sigfile::CBinnedMC::detect_artifacts(
- sssu_diff,
- P.upper_thr, P.lower_thr,
- E);
+ sigfile::detect_artifacts( signal_original, samplerate(), P);
for ( size_t p = 0; p < marked.size(); ++p )
crecording.F().artifacts(_h).mark_artifact(
marked[p] * P.scope * samplerate(), (marked[p]+1) * P.scope * samplerate());
--
Sleep experiment manager
More information about the debian-med-commit
mailing list