diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-02-07 13:49:58 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-02-07 17:34:34 -0500 |
commit | 308051abeb515b52c4fb906bdfb2622ac6183508 (patch) | |
tree | 69a667d5fb56e8965c432ed325eef03593e8985e | |
parent | 8585cd0d10ba82c9f4dd1c2b4397346c5a874d43 (diff) |
sched: added ControlPort interface to setup and access perf counters.
Conflicts:
gnuradio-core/src/lib/runtime/gr_block.h
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block.cc | 38 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block.h | 19 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block_detail.h | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc | 12 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h | 6 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_top_block_impl.cc | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/nop_impl.cc | 1 |
7 files changed, 78 insertions, 2 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc b/gnuradio-core/src/lib/runtime/gr_block.cc index fd82ab580e..33c460e1a0 100644 --- a/gnuradio-core/src/lib/runtime/gr_block.cc +++ b/gnuradio-core/src/lib/runtime/gr_block.cc @@ -44,6 +44,7 @@ gr_block::gr_block (const std::string &name, d_max_noutput_items_set(false), d_max_noutput_items(0), d_tag_propagation_policy(TPP_ALL_TO_ALL), + d_pc_rpc_set(false), d_max_output_buffer(std::max(output_signature->max_streams(),1), -1), d_min_output_buffer(std::max(output_signature->max_streams(),1), -1) { @@ -346,6 +347,43 @@ gr_block::pc_work_time() } } +void +gr_block::setup_pc_rpc() +{ + d_pc_rpc_set = true; +#ifdef GR_CTRLPORT + d_rpc_vars.push_back( + rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>( + alias(), "noutput_items", &gr_block::pc_noutput_items, + pmt::mp(0), pmt::mp(32768), pmt::mp(0), + "", "Average noutput items", RPC_PRIVLVL_MIN, DISPTIMESERIESF))); + + d_rpc_vars.push_back( + rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>( + alias(), "nproduced", &gr_block::pc_nproduced, + pmt::mp(0), pmt::mp(32768), pmt::mp(0), + "", "Average items produced", RPC_PRIVLVL_MIN, DISPTIMESERIESF))); + + d_rpc_vars.push_back( + rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>( + alias(), "work time", &gr_block::pc_work_time, + pmt::mp(0), pmt::mp(1e9), pmt::mp(0), + "", "Average clock cycles in call to work", RPC_PRIVLVL_MIN, DISPTIMESERIESF))); + + d_rpc_vars.push_back( + rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >( + alias(), "input \% full", &gr_block::pc_input_buffers_full, + pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0), + "", "Average of how full input buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF))); + + d_rpc_vars.push_back( + rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >( + alias(), "output \% full", &gr_block::pc_output_buffers_full, + pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0), + "", "Average of how full output buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF))); +#endif /* GR_CTRLPORT */ +} + std::ostream& operator << (std::ostream& os, const gr_block *m) { diff --git a/gnuradio-core/src/lib/runtime/gr_block.h b/gnuradio-core/src/lib/runtime/gr_block.h index c9d2d8f530..96e07439ef 100644 --- a/gnuradio-core/src/lib/runtime/gr_block.h +++ b/gnuradio-core/src/lib/runtime/gr_block.h @@ -395,6 +395,24 @@ class GR_CORE_API gr_block : public gr_basic_block { */ float pc_work_time(); + /*! + * \brief Sets up export of perf. counters to ControlPort. Only + * called by the scheduler. + */ + void setup_pc_rpc(); + + /*! + * \brief Checks if this block is already exporting perf. counters + * to ControlPort. + */ + bool is_pc_rpc_set() { return d_pc_rpc_set; } + + /*! + * \brief If the block calls this in its constructor, it's + * perf. counters will not be exported. + */ + void no_pc_rpc() { d_pc_rpc_set = true; } + // ---------------------------------------------------------------------------- // Functions to handle thread affinity @@ -432,6 +450,7 @@ class GR_CORE_API gr_block : public gr_basic_block { int d_max_noutput_items; // value of max_noutput_items for this block tag_propagation_policy_t d_tag_propagation_policy; // policy for moving tags downstream std::vector<unsigned int> d_affinity; // thread affinity proc. mask + bool d_pc_rpc_set; protected: gr_block (void){} //allows pure virtual interface sub-classes diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.h b/gnuradio-core/src/lib/runtime/gr_block_detail.h index a8ed8da908..dd8be71c9c 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_detail.h +++ b/gnuradio-core/src/lib/runtime/gr_block_detail.h @@ -182,7 +182,7 @@ class GR_CORE_API gr_block_detail { float pc_output_buffers_full(size_t which); std::vector<float> pc_output_buffers_full(); float pc_work_time(); - + gr_tpb_detail d_tpb; // used by thread-per-block scheduler int d_produce_or; diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc index e7b75d95cd..79b0b0f59d 100644 --- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc +++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc @@ -401,3 +401,15 @@ void gr_flat_flowgraph::replace_endpoint(const gr_msg_endpoint &e, const gr_msg_ } } +void +gr_flat_flowgraph::enable_pc_rpc() +{ +#ifdef GR_PERFORMANCE_COUNTERS + gr_basic_block_viter_t p; + for(p = d_blocks.begin(); p != d_blocks.end(); p++) { + gr_block_sptr block = cast_to_block_sptr(*p); + if(!block->is_pc_rpc_set()) + block->setup_pc_rpc(); + } +#endif /* GR_PERFORMANCE_COUNTERS */ +} diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h index 5c8268d7df..031564f2ec 100644 --- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h +++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h @@ -60,6 +60,12 @@ public: void replace_endpoint(const gr_msg_endpoint &e, const gr_msg_endpoint &r, bool is_src); void clear_endpoint(const gr_msg_endpoint &e, bool is_src); + /*! + * Enables export of perf. counters to ControlPort on all blocks in + * the flowgraph. + */ + void enable_pc_rpc(); + private: gr_flat_flowgraph(); diff --git a/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc b/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc index 4a3694163b..e563fbadb8 100644 --- a/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc +++ b/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc @@ -108,6 +108,8 @@ gr_top_block_impl::start(int max_noutput_items) d_ffg->validate(); d_ffg->setup_connections(); + d_ffg->enable_pc_rpc(); + d_scheduler = make_scheduler(d_ffg, d_max_noutput_items); d_state = RUNNING; } diff --git a/gnuradio-core/src/lib/runtime/nop_impl.cc b/gnuradio-core/src/lib/runtime/nop_impl.cc index 1aaba1b0cd..b6764c2257 100644 --- a/gnuradio-core/src/lib/runtime/nop_impl.cc +++ b/gnuradio-core/src/lib/runtime/nop_impl.cc @@ -45,7 +45,6 @@ namespace gr { { set_a(a); set_b(b); - setup_rpc(); } nop_impl::~nop_impl() |