diff options
-rw-r--r-- | include/gras/block.hpp | 43 | ||||
-rw-r--r-- | include/gras/block_config.hpp | 159 |
2 files changed, 174 insertions, 28 deletions
diff --git a/include/gras/block.hpp b/include/gras/block.hpp index 72ae9b9..f2f1b2b 100644 --- a/include/gras/block.hpp +++ b/include/gras/block.hpp @@ -28,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; @@ -380,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_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*/ |