The following commit has been merged in the master branch:
commit c8061b5e13e1a96d54b151bd4755836cb702760a
Author: Andrei Zavada <[email protected]>
Date:   Fri Sep 28 03:18:11 2012 +0300

    make real use of omp; progress indication yet to sort out

diff --git a/configure.ac b/configure.ac
index cbb9605..2e6331a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 AC_COPYRIGHT([Copyright (c) 2008-12 Andrei Zavada <[email protected]>])
 
-AC_INIT([Aghermann], [0.7.1], [[email protected]])
+AC_INIT([Aghermann], [0.7.2], [[email protected]])
 AC_CONFIG_SRCDIR([src/main.cc])
 AC_CONFIG_MACRO_DIR([m4])
 AC_PREREQ(2.61)
diff --git a/src/expdesign/Makefile.am b/src/expdesign/Makefile.am
index e3edb49..53a76c0 100644
--- a/src/expdesign/Makefile.am
+++ b/src/expdesign/Makefile.am
@@ -1,5 +1,6 @@
 AM_CXXFLAGS = \
-       -Wall -std=c++0x
+       -Wall -std=c++0x \
+       $(OPENMP_CXXFLAGS)
 
 noinst_LIBRARIES = libexpdesign.a
 
diff --git a/src/expdesign/primaries-tree-scanner.cc 
b/src/expdesign/primaries-tree-scanner.cc
index 19365e5..28f4a28 100644
--- a/src/expdesign/primaries-tree-scanner.cc
+++ b/src/expdesign/primaries-tree-scanner.cc
@@ -305,8 +305,10 @@ scan_tree( TMsmtCollectProgressIndicatorFun 
user_progress_fun)
        only_progress_fun = user_progress_fun;
        __expdesign = this;
        nftw( "./", edf_file_processor, 10, 0);
+       printf( "CExpDesign::scan_tree(): recordings collected\n");
 
-       printf( "CExpDesign::scan_tree() completed\n");
+       compute_profiles(); // in an SMP fashion
+       printf( "CExpDesign::scan_tree() all computed\n");
 
       // find any subjects with incomplete episode sets
        list<string> complete_episode_set = enumerate_episodes();
@@ -342,4 +344,33 @@ scan_tree( TMsmtCollectProgressIndicatorFun 
user_progress_fun)
 }
 
 
+void
+agh::CExpDesign::
+compute_profiles()
+{
+       vector<CRecording*> v;
+       for ( auto &G : groups )
+               for ( auto &J : G.second )
+                       for ( auto &D : J.measurements )
+                               for ( auto &E : D.second.episodes )
+                                       for ( auto &R : E.recordings )
+                                               if ( R.second.signal_type() == 
sigfile::SChannel::TType::eeg )
+                                                       v.push_back( &R.second);
+       size_t global_i = 0;
+#pragma omp parallel for
+       for ( size_t i = 0; i < v.size(); ++i ) {
+#pragma omp critical
+               {
+                       auto& R = *v[i];
+                       only_progress_fun(
+                               (string ("Compute ") + R.F().filename() + 
":"+R.F().channel_by_id(R.h())).c_str(),
+                               v.size(), ++global_i);
+               }
+
+               v[i]->CBinnedPower::compute();
+               v[i]->CBinnedMC::compute();
+       }
+}
+
+
 // eof
diff --git a/src/expdesign/primaries.hh b/src/expdesign/primaries.hh
index d81d0d2..a0e068b 100644
--- a/src/expdesign/primaries.hh
+++ b/src/expdesign/primaries.hh
@@ -93,7 +93,7 @@ class CSubject {
                TRecordingSet
                        recordings; // one per channel, naturally
 
-               SEpisode( sigfile::CSource&& Fmc,
+               SEpisode (sigfile::CSource&& Fmc,
                          const sigfile::SFFTParamSet& fft_params,
                          const sigfile::SMCParamSet& ucont_params);
 
@@ -349,6 +349,7 @@ class CExpDesign {
        //               size_t now_processing)
        static TMsmtCollectProgressIndicatorFun progress_fun_stdout;
        void scan_tree( TMsmtCollectProgressIndicatorFun progress_fun = 
progress_fun_stdout);
+       void compute_profiles();
        void sync();
 
       // edf sources
diff --git a/src/expdesign/recording.cc b/src/expdesign/recording.cc
index 8f70bb7..bd6934b 100644
--- a/src/expdesign/recording.cc
+++ b/src/expdesign/recording.cc
@@ -28,16 +28,16 @@ CRecording (sigfile::CSource& F, int sig_no,
        CBinnedMC (F, sig_no, mc_params,
                   fft_params.pagesize),
        uc_params {NAN, NAN, NAN, NAN},
-       _status (0),
+       _status (0), // not computed
        _source (F), _sig_no (sig_no),
        _cached_metric (sigfile::TMetricType::invalid),
        _cached_freq_from (NAN),
        _cached_freq_upto (NAN)
 {
-       if ( F.signal_type(sig_no) == sigfile::SChannel::TType::eeg ) {
-               CBinnedPower::compute();
-               CBinnedMC::compute();
-       }
+       // if ( F.signal_type(sig_no) == sigfile::SChannel::TType::eeg ) {
+       //      CBinnedPower::compute();
+       //      CBinnedMC::compute();
+       // }
 }
 
 
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index 8ad67fa..f802b5c 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -59,15 +59,15 @@ class CEDFFile
                no_field_consistency_check      = 1<<4
        };
        // open existing
-       CEDFFile( const char *fname, int flags = 0);
+       CEDFFile (const char *fname, int flags = 0);
        // create new
-       CEDFFile( const char *fname, int flags,
+       CEDFFile (const char *fname, int flags,
                  const list<pair<string, size_t>>& channels,
                  size_t data_record_size = 1,
                  size_t n_data_records = 0);
-       CEDFFile( CEDFFile&& rv);
+       CEDFFile (CEDFFile&& rv);
       // dtor
-       ~CEDFFile();
+       ~CEDFFile ();
 
       // interface
        // status
diff --git a/src/libsigfile/mc.cc b/src/libsigfile/mc.cc
index 6911a1b..f464f63 100644
--- a/src/libsigfile/mc.cc
+++ b/src/libsigfile/mc.cc
@@ -90,7 +90,7 @@ reset()
 
 
 sigfile::CBinnedMC::
-CBinnedMC( const CSource& F, int sig_no,
+CBinnedMC (const CSource& F, int sig_no,
           const SMCParamSet &params,
           size_t pagesize)
       : CPageMetrics_base (F, sig_no,
diff --git a/src/libsigfile/page-metrics-base.hh 
b/src/libsigfile/page-metrics-base.hh
index 19ca2f6..cff0592 100644
--- a/src/libsigfile/page-metrics-base.hh
+++ b/src/libsigfile/page-metrics-base.hh
@@ -127,7 +127,10 @@ class CPageMetrics_base {
        virtual string fname_base() const = 0;
 
     protected:
-       enum TFlags : int { computed = 1 };
+       enum TFlags : int {
+               computed = (1<<0),
+               computable = (1<<1)
+       };
        int     _status;
 
        valarray<double>  // arrays in a given bin extracted by slices
diff --git a/src/libsigfile/psd.cc b/src/libsigfile/psd.cc
index 1946000..a96d459 100644
--- a/src/libsigfile/psd.cc
+++ b/src/libsigfile/psd.cc
@@ -208,38 +208,34 @@ compute( const SFFTParamSet& req_params,
       // 4. obtain power spectrum
        // prepare
 
-       static double
-               *fft_Ti = nullptr,
-               *fft_To = nullptr;
-       static valarray<double> // buffer for PSD
-               P;
+       double
+               *fft_Ti = (double*)fftw_malloc( sizeof(double) * spp * 2),
+               *fft_To = (double*)fftw_malloc( sizeof(double) * spp * 2);
+       valarray<double>        // buffer for PSD
+               P (spp+2);
+
        static fftw_plan fft_plan = NULL;
        static size_t saved_spp = 0;
-
-       if ( fft_plan == nullptr ) {
-#if defined(HAVE_LIBFFTW3_OMP) && defined(_OPENMP)
-               int n_procs = omp_get_max_threads();
-               fftw_init_threads();
-               fftw_plan_with_nthreads( n_procs);
-               printf( "Will use %d core(s)\n", n_procs);
-#endif
-       }
-       if ( fft_plan == nullptr || spp != saved_spp ) {
-
-               printf( "Preparing fftw plan for %zu samples...", spp);
-               saved_spp = spp;
-
-               fftw_free( fft_Ti);
-               fftw_free( fft_To);
-
-               fft_Ti = (double*) fftw_malloc( sizeof(double) * spp * 2);
-               fft_To = (double*) fftw_malloc( sizeof(double) * spp * 2);
-               P.resize( spp+2);
-               // and let them lie spare
-
-               memcpy( fft_Ti, &S[0], spp * sizeof(double));  // not necessary?
-               fft_plan = fftw_plan_dft_r2c_1d( spp, fft_Ti, 
(fftw_complex*)fft_To, 0 /* FFTW_PATIENT */);
-               printf( "done\n");
+#pragma omp single
+       {
+//             if ( fft_plan == nullptr ) {
+//#if defined(HAVE_LIBFFTW3_OMP) && defined(_OPENMP)
+//                     int n_procs = omp_get_max_threads();
+//                     fftw_init_threads();
+//                     fftw_plan_with_nthreads( n_procs);
+//                     fftw_plan();
+//                     printf( "Will use %d core(s)\n", n_procs);
+//#endif
+//             }
+               if ( fft_plan == nullptr || spp != saved_spp ) {
+
+                       printf( "Preparing fftw plan for %zu samples...", spp);
+                       saved_spp = spp;
+
+                       memcpy( fft_Ti, &S[0], spp * sizeof(double));  // not 
necessary?
+                       fft_plan = fftw_plan_dft_r2c_1d( spp, fft_Ti, 
(fftw_complex*)fft_To, 0 /* FFTW_PATIENT */);
+                       printf( "done\n");
+               }
        }
 
        // go
@@ -291,6 +287,9 @@ compute( const SFFTParamSet& req_params,
 
        if ( _mirror_enable( new_mirror_fname) ) {}
 
+       fftw_free( fft_Ti);
+       fftw_free( fft_To);
+
        _status |= TFlags::computed;
        return 0;
 }
diff --git a/src/ui/expdesign.cc b/src/ui/expdesign.cc
index 6a2042c..b50ca6b 100644
--- a/src/ui/expdesign.cc
+++ b/src/ui/expdesign.cc
@@ -191,8 +191,8 @@ SExpDesignUI (aghui::SSessionChooser *parent,
                                                        " Whatever the reason, 
this is really too bad: I can't fix it for you.");
                }
                ED = new agh::CExpDesign (dir,
-                                         {bind( 
&SExpDesignUI::sb_main_progress_indicator, this,
-                                                placeholders::_1, 
placeholders::_2, placeholders::_3)});
+                                         bind( 
&SExpDesignUI::sb_main_progress_indicator, this,
+                                               placeholders::_1, 
placeholders::_2, placeholders::_3));
                nodestroy_by_cb = false;
 
                fft_params_welch_window_type_saved      = 
ED->fft_params.welch_window_type;
@@ -413,8 +413,8 @@ do_rescan_tree( bool ensure)
        depopulate( false);
        ED -> sync();
        if ( ensure )
-               ED -> scan_tree( {bind 
(&SExpDesignUI::sb_main_progress_indicator, this,
-                                       placeholders::_1, placeholders::_2, 
placeholders::_3)});
+               ED -> scan_tree( bind 
(&SExpDesignUI::sb_main_progress_indicator, this,
+                                      placeholders::_1, placeholders::_2, 
placeholders::_3));
        else
                ED -> scan_tree();
        populate( false);
@@ -984,12 +984,10 @@ try_download()
 
 void
 aghui::SExpDesignUI::
-buf_on_main_status_bar( bool ensure)
+buf_on_main_status_bar()
 {
        gtk_statusbar_pop( sbMainStatusBar, sbMainContextIdGeneral);
        gtk_statusbar_push( sbMainStatusBar, sbMainContextIdGeneral, __buf__);
-       if ( ensure )
-               aghui::gtk_flush();
 }
 
 void
@@ -997,7 +995,8 @@ aghui::SExpDesignUI::
 sb_main_progress_indicator( const char* current, size_t n, size_t i)
 {
        snprintf_buf( "(%zu of %zu) %s", i, n, current);
-       buf_on_main_status_bar( true);
+       buf_on_main_status_bar();
+       gtk_flush();
 }
 
 
diff --git a/src/ui/expdesign.hh b/src/ui/expdesign.hh
index 551bc62..f6de102 100644
--- a/src/ui/expdesign.hh
+++ b/src/ui/expdesign.hh
@@ -160,7 +160,7 @@ class SExpDesignUI {
        void populate_1();  // measurements
        void populate_2();  // simulations
        void cleanup_2();
-       void do_rescan_tree( bool ensure = true); // with while ... 
gtk_main_iteration ...
+       void do_rescan_tree( bool with_progress_bar = true);
        void do_purge_computed();
        void do_detect_ultradian_cycle( agh::CRecording&);
 
@@ -286,7 +286,7 @@ class SExpDesignUI {
 
       // status bar bits
        void sb_main_progress_indicator( const char*, size_t n, size_t i);
-       void buf_on_main_status_bar( bool ensure = true);
+       void buf_on_main_status_bar();
        guint   sbMainContextIdGeneral;
 
       // dnd
diff --git a/src/ui/expdesign_cb.cc b/src/ui/expdesign_cb.cc
index 7b2e619..d19652e 100644
--- a/src/ui/expdesign_cb.cc
+++ b/src/ui/expdesign_cb.cc
@@ -96,7 +96,7 @@ void
 iExpRefresh_activate_cb( GtkMenuItem*, gpointer userdata)
 {
        auto& ED = *(SExpDesignUI*)userdata;
-       ED.do_rescan_tree( false);
+       ED.do_rescan_tree( false); // no progress bar
 }
 
 void
@@ -141,7 +141,7 @@ iExpBasicSADetectUltradianCycles_activate_cb( GtkMenuItem*, 
gpointer userdata)
                                                snprintf_buf(
                                                        "(%zu of %zu) 
%s/%s/%s", ++i, n,
                                                        G.first.c_str(), 
J.name(), E.name());
-                                               ED.buf_on_main_status_bar( 
true);
+                                               ED.buf_on_main_status_bar();
                                                gtk_widget_queue_draw( 
(GtkWidget*)ED.cMeasurements);
                                        }
 }

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to