diff options
author | Josh Blum | 2013-06-06 14:31:32 -0700 |
---|---|---|
committer | Josh Blum | 2013-06-06 14:31:32 -0700 |
commit | 40a32665929ac46e272cb68a2043fde5ca9782b3 (patch) | |
tree | 96d0a1eee805ef761737ddd3fba19293a2062756 /include | |
parent | b7c8f27d47ca78d2b07e7a4cb53d1c8df6eb32d6 (diff) | |
parent | 8a44539fde046d0229c3dcf6654de01934714246 (diff) | |
download | sandhi-40a32665929ac46e272cb68a2043fde5ca9782b3.tar.gz sandhi-40a32665929ac46e272cb68a2043fde5ca9782b3.tar.bz2 sandhi-40a32665929ac46e272cb68a2043fde5ca9782b3.zip |
Merge branch 'block_config'
Diffstat (limited to 'include')
-rw-r--r-- | include/gras/CMakeLists.txt | 1 | ||||
-rw-r--r-- | include/gras/block.hpp | 150 | ||||
-rw-r--r-- | include/gras/block.i | 1 | ||||
-rw-r--r-- | include/gras/block_config.hpp | 159 | ||||
-rw-r--r-- | include/gras/hier_block.i | 1 | ||||
-rw-r--r-- | include/gras/top_block.hpp | 23 |
6 files changed, 179 insertions, 156 deletions
diff --git a/include/gras/CMakeLists.txt b/include/gras/CMakeLists.txt index 7f37b1a..d0e3cfa 100644 --- a/include/gras/CMakeLists.txt +++ b/include/gras/CMakeLists.txt @@ -6,6 +6,7 @@ install(FILES exception.i chrono.hpp block.hpp + block_config.hpp block.i element.hpp element.i diff --git a/include/gras/block.hpp b/include/gras/block.hpp index 5a6e5e2..f2f1b2b 100644 --- a/include/gras/block.hpp +++ b/include/gras/block.hpp @@ -3,6 +3,7 @@ #ifndef INCLUDED_GRAS_BLOCK_HPP #define INCLUDED_GRAS_BLOCK_HPP +#include <gras/block_config.hpp> #include <gras/element.hpp> #include <gras/sbuffer.hpp> #include <gras/thread_pool.hpp> @@ -16,112 +17,6 @@ namespace gras { -//! Configuration parameters for an input port -struct GRAS_API InputPortConfig -{ - InputPortConfig(void); - - //! The size of an item in bytes - size_t item_size; - - /*! - * Set an input reserve requirement such that work is called - * with an input buffer at least reserve items in size. - * - * Default = 1. - */ - size_t reserve_items; - - /*! - * Constrain the input buffer allocation size: - * The scheduler may accumulate multiple buffers - * into a single larger buffer under failure conditions. - * The maximum size of this accumulated buffer - * is constrained by this maximum_items setting. - * - * Default = 0 aka disabled. - */ - size_t maximum_items; - - /*! - * Set buffer inlining for this port config. - * Inlining means that the input buffer can be used as an output buffer. - * The goal is to make better use of cache and memory bandwidth. - * - * By default, inlining is disabled on all input ports. - * The user should enable inlining on an input port - * when it is understood that the work function will read - * before writting to a particular section of the buffer. - * - * The scheduler will inline a buffer when - * * inlining is enabled on the particular input port - * * block holds the only buffer reference aka unique - * * the input buffer has the same affinity as the block - * * the input port has a buffer look-ahead of 0 - * - * Default = false. - */ - bool inline_buffer; - - /*! - * Preload the input queue with num preload items. - * All items preloaded into the buffer will be 0. - * This is used to implement zero-padding for - * things like sliding dot products/FIR filters. - * - * - Increasing the preload at runtime will - * inject more items into the input queue. - * - Decreasing the preload at runtime will - * consume random items from the input queue. - * - * Default = 0. - */ - size_t preload_items; - - /*! - * Force this block done when input port is done. - * When the upstream feeding this port declares done, - * this block will mark done once upstream notifies. - * The primary usage is to modify the done logic - * for the purposes of unit test confiruability. - * - * If the force done option is false, the block will - * not mark done when this port's upstream is done. - * However, this block will mark done when all - * input ports are done, reguardless of this setting. - * - * Default = true. - */ - bool force_done; -}; - -//! Configuration parameters for an output port -struct GRAS_API OutputPortConfig -{ - OutputPortConfig(void); - - //! The size of an item in bytes - size_t item_size; - - /*! - * Set an output reserve requirement such that work is called - * with an output buffer at least reserve items in size. - * - * Default = 1. - */ - size_t reserve_items; - - /*! - * Constrain the output buffer allocation size: - * The user might set a small maximum items - * to reduce the amount of buffered items - * waiting for processing in downstream queues. - * - * Default = 0 aka disabled. - */ - size_t maximum_items; -}; - struct GRAS_API Block : Element { //! Contruct an empty/null block @@ -133,9 +28,22 @@ struct GRAS_API Block : Element virtual ~Block(void); /******************************************************************* - * Deal with input and output port configuration + * Deal with block configuration configuration ******************************************************************/ + /*! + * Set the thread pool of this block. + * Every block is created in the default active thread pool. + * This call will migrate the block to a new specified pool. + */ + void set_thread_pool(const ThreadPool &thread_pool); + + //! Get the global block config settings + const GlobalBlockConfig &global_config(void) const; + + //! Get the global block config settings + GlobalBlockConfig &global_config(void); + //! Get the configuration rules of an input port const InputPortConfig &input_config(const size_t which_input) const; @@ -485,36 +393,10 @@ struct GRAS_API Block : Element virtual void notify_topology(const size_t num_inputs, const size_t num_outputs); /******************************************************************* - * routines related to affinity and allocation + * custom buffer queue API ******************************************************************/ /*! - * Set the thread pool of this block. - * Every block is created in the default active thread pool. - * This call will migrate the block to a new specified pool. - */ - void set_thread_pool(const ThreadPool &thread_pool); - - /*! - * Set if the work call should be interruptible by stop(). - * Some work implementations block with the expectation of - * getting a boost thread interrupt in a blocking call. - * Set set_interruptible_work(true) if this is the case. - * By default, work implementations are not interruptible. - */ - void set_interruptible_work(const bool enb); - - /*! - * Set the node affinity of this block. - * This call affects how output buffers are allocated. - * By default memory is allocated by malloc. - * When the affinity is set, virtual memory - * will be locked to a physical CPU/memory node. - * \param affinity a memory node on the system - */ - void set_buffer_affinity(const long affinity); - - /*! * The output buffer allocator method. * This method is called by the scheduler to allocate output buffers. * The user may overload this method to create a custom allocator. diff --git a/include/gras/block.i b/include/gras/block.i index 5c62f7e..6ac1d5c 100644 --- a/include/gras/block.i +++ b/include/gras/block.i @@ -13,6 +13,7 @@ %import <gras/sbuffer.i> %include <gras/buffer_queue.hpp> %include <gras/thread_pool.hpp> +%include <gras/block_config.hpp> %include <gras/block.hpp> //////////////////////////////////////////////////////////////////////// diff --git a/include/gras/block_config.hpp b/include/gras/block_config.hpp new file mode 100644 index 0000000..c026cba --- /dev/null +++ b/include/gras/block_config.hpp @@ -0,0 +1,159 @@ +// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information. + +#ifndef INCLUDED_GRAS_BLOCK_CONFIG_HPP +#define INCLUDED_GRAS_BLOCK_CONFIG_HPP + +#include <gras/gras.hpp> +#include <cstddef> + +namespace gras +{ + +//! Configuration parameters for a block +struct GRAS_API GlobalBlockConfig +{ + GlobalBlockConfig(void); + + /*! + * Constrain the maximum number of items that + * work can be called with for all output ports. + * + * Default = 0 aka disabled. + */ + size_t maximum_output_items; + + /*! + * Set the global memory node affinity. + * Blocks that have not been explicitly set, + * will take on this new buffer_affinity. + * + * This param affects how buffers are allocated. + * By default memory is allocated by malloc. + * When the affinity is set, virtual memory + * will be locked to a physical CPU/memory node. + * + * Default = -1 aka no affinity. + */ + long buffer_affinity; + + /*! + * True if the work call should be interruptible by stop(). + * Some work implementations block with the expectation of + * getting a boost thread interrupt in a blocking call. + * If this is the case, this parameter should be set true. + * By default, work implementations are not interruptible. + * + * Default = false. + */ + bool interruptible_work; +}; + +//! Configuration parameters for an input port +struct GRAS_API InputPortConfig +{ + InputPortConfig(void); + + //! The size of an item in bytes + size_t item_size; + + /*! + * Set an input reserve requirement such that work is called + * with an input buffer at least reserve items in size. + * + * Default = 1. + */ + size_t reserve_items; + + /*! + * Constrain the input buffer allocation size: + * The scheduler may accumulate multiple buffers + * into a single larger buffer under failure conditions. + * The maximum size of this accumulated buffer + * is constrained by this maximum_items setting. + * + * Default = 0 aka disabled. + */ + size_t maximum_items; + + /*! + * Set buffer inlining for this port config. + * Inlining means that the input buffer can be used as an output buffer. + * The goal is to make better use of cache and memory bandwidth. + * + * By default, inlining is disabled on all input ports. + * The user should enable inlining on an input port + * when it is understood that the work function will read + * before writting to a particular section of the buffer. + * + * The scheduler will inline a buffer when + * * inlining is enabled on the particular input port + * * block holds the only buffer reference aka unique + * * the input buffer has the same affinity as the block + * * the input port has a buffer look-ahead of 0 + * + * Default = false. + */ + bool inline_buffer; + + /*! + * Preload the input queue with num preload items. + * All items preloaded into the buffer will be 0. + * This is used to implement zero-padding for + * things like sliding dot products/FIR filters. + * + * - Increasing the preload at runtime will + * inject more items into the input queue. + * - Decreasing the preload at runtime will + * consume random items from the input queue. + * + * Default = 0. + */ + size_t preload_items; + + /*! + * Force this block done when input port is done. + * When the upstream feeding this port declares done, + * this block will mark done once upstream notifies. + * The primary usage is to modify the done logic + * for the purposes of unit test confiruability. + * + * If the force done option is false, the block will + * not mark done when this port's upstream is done. + * However, this block will mark done when all + * input ports are done, reguardless of this setting. + * + * Default = true. + */ + bool force_done; +}; + +//! Configuration parameters for an output port +struct GRAS_API OutputPortConfig +{ + OutputPortConfig(void); + + //! The size of an item in bytes + size_t item_size; + + /*! + * Set an output reserve requirement such that work is called + * with an output buffer at least reserve items in size. + * + * Default = 1. + */ + size_t reserve_items; + + /*! + * Constrain the output buffer allocation size: + * The user might set a small maximum items + * to reduce the amount of buffered items + * waiting for processing in downstream queues. + * + * Default = 0 aka disabled. + */ + size_t maximum_items; +}; + +} //namespace gras + +#endif /*INCLUDED_GRAS_BLOCK_CONFIG_HPP*/ diff --git a/include/gras/hier_block.i b/include/gras/hier_block.i index da57e3d..376bbf4 100644 --- a/include/gras/hier_block.i +++ b/include/gras/hier_block.i @@ -8,6 +8,7 @@ %} %import <gras/element.i> +%include <gras/block_config.hpp> %include <gras/hier_block.hpp> #endif /*INCLUDED_GRAS_HIER_BLOCK_I*/ diff --git a/include/gras/top_block.hpp b/include/gras/top_block.hpp index 17f1e30..415c03e 100644 --- a/include/gras/top_block.hpp +++ b/include/gras/top_block.hpp @@ -3,33 +3,12 @@ #ifndef INCLUDED_GRAS_TOP_BLOCK_HPP #define INCLUDED_GRAS_TOP_BLOCK_HPP +#include <gras/block_config.hpp> #include <gras/hier_block.hpp> namespace gras { -struct GRAS_API GlobalBlockConfig -{ - GlobalBlockConfig(void); - - /*! - * Constrain the maximum number of items that - * work can be called with for all output ports. - * - * Default = 0 aka disabled. - */ - size_t maximum_output_items; - - /*! - * Set the global memory node affinity. - * Blocks that have not been explicitly set, - * will take on this new buffer_affinity. - * - * Default = -1 aka no affinity. - */ - long buffer_affinity; -}; - struct GRAS_API TopBlock : HierBlock { TopBlock(void); |