diff options
-rw-r--r-- | gnuradio-runtime/include/gnuradio/block.h | 5 | ||||
-rw-r--r-- | gnuradio-runtime/include/gnuradio/block_detail.h | 5 | ||||
-rw-r--r-- | gnuradio-runtime/lib/block.cc | 10 | ||||
-rw-r--r-- | gnuradio-runtime/lib/block_detail.cc | 13 | ||||
-rw-r--r-- | gnuradio-runtime/swig/block.i | 1 |
5 files changed, 34 insertions, 0 deletions
diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h index 3affb6f25b..4a534b7f46 100644 --- a/gnuradio-runtime/include/gnuradio/block.h +++ b/gnuradio-runtime/include/gnuradio/block.h @@ -504,6 +504,11 @@ namespace gr { float pc_work_time_total(); /*! + * \brief Gets average throughput. + */ + float pc_throughput_avg(); + + /*! * \brief Resets the performance counters */ void reset_perf_counters(); diff --git a/gnuradio-runtime/include/gnuradio/block_detail.h b/gnuradio-runtime/include/gnuradio/block_detail.h index 41568c8ab3..916c0a46c1 100644 --- a/gnuradio-runtime/include/gnuradio/block_detail.h +++ b/gnuradio-runtime/include/gnuradio/block_detail.h @@ -219,6 +219,7 @@ namespace gr { float pc_output_buffers_full_avg(size_t which); std::vector<float> pc_output_buffers_full_avg(); float pc_work_time_avg(); + float pc_throughput_avg(); float pc_noutput_items_var(); float pc_nproduced_var(); @@ -246,6 +247,9 @@ namespace gr { float d_ins_noutput_items; float d_avg_noutput_items; float d_var_noutput_items; + float d_total_noutput_items; + gr::high_res_timer_type d_pc_start_time; + gr::high_res_timer_type d_pc_last_work_time; float d_ins_nproduced; float d_avg_nproduced; float d_var_nproduced; @@ -260,6 +264,7 @@ namespace gr { float d_avg_work_time; float d_var_work_time; float d_total_work_time; + float d_avg_throughput; float d_pc_counter; block_detail(unsigned int ninputs, unsigned int noutputs); diff --git a/gnuradio-runtime/lib/block.cc b/gnuradio-runtime/lib/block.cc index a15fb89c85..2cc868e844 100644 --- a/gnuradio-runtime/lib/block.cc +++ b/gnuradio-runtime/lib/block.cc @@ -682,6 +682,16 @@ namespace gr { } } + float + block::pc_throughput_avg() { + if(d_detail) { + return d_detail->pc_throughput_avg(); + } + else { + return 0; + } + } + void block::reset_perf_counters() { diff --git a/gnuradio-runtime/lib/block_detail.cc b/gnuradio-runtime/lib/block_detail.cc index 77c457cf7f..9463e8d13b 100644 --- a/gnuradio-runtime/lib/block_detail.cc +++ b/gnuradio-runtime/lib/block_detail.cc @@ -46,6 +46,7 @@ namespace gr { d_ins_noutput_items(0), d_avg_noutput_items(0), d_var_noutput_items(0), + d_total_noutput_items(0), d_ins_nproduced(0), d_avg_nproduced(0), d_var_nproduced(0), @@ -58,9 +59,11 @@ namespace gr { d_ins_work_time(0), d_avg_work_time(0), d_var_work_time(0), + d_avg_throughput(0), d_pc_counter(0) { s_ncurrently_allocated++; + d_pc_start_time = gr::high_res_timer_now(); } block_detail::~block_detail() @@ -279,6 +282,8 @@ namespace gr { d_ins_noutput_items = noutput_items; d_avg_noutput_items = noutput_items; d_var_noutput_items = 0; + d_total_noutput_items = noutput_items; + d_pc_start_time = (float)gr::high_res_timer_now(); for(size_t i=0; i < d_input.size(); i++) { gr::thread::scoped_lock guard(*d_input[i]->mutex()); float pfull = static_cast<float>(d_input[i]->items_available()) / @@ -312,6 +317,10 @@ namespace gr { d_ins_noutput_items = noutput_items; d_avg_noutput_items = d_avg_noutput_items + d/d_pc_counter; d_var_noutput_items = d_var_noutput_items + d*d; + d_total_noutput_items += noutput_items; + d_pc_last_work_time = gr::high_res_timer_now(); + float monitor_time = (float)(d_pc_last_work_time - d_pc_start_time) / (float)gr::high_res_timer_tps(); + d_avg_throughput = d_total_noutput_items / monitor_time; for(size_t i=0; i < d_input.size(); i++) { gr::thread::scoped_lock guard(*d_input[i]->mutex()); @@ -501,4 +510,8 @@ namespace gr { return d_total_work_time; } + float + block_detail::pc_throughput_avg() { + return d_avg_throughput; + } } /* namespace gr */ diff --git a/gnuradio-runtime/swig/block.i b/gnuradio-runtime/swig/block.i index 9f3f374d78..945cea79b2 100644 --- a/gnuradio-runtime/swig/block.i +++ b/gnuradio-runtime/swig/block.i @@ -96,6 +96,7 @@ class gr::block : public gr::basic_block float pc_work_time_avg(); float pc_work_time_var(); float pc_work_time_total(); + float pc_throughput_avg(); // Methods to manage processor affinity. void set_processor_affinity(const std::vector<int> &mask); |