On Wed, Jun 29, 2011 at 09:24, Marcus D. Leech <mle...@ripnet.com> wrote:

> **
> On 29/06/2011 12:12 PM, Johnathan Corgan wrote:
>
> GNU Radio achieves its streaming performance in part due to a circular
> buffer design that maps the same physical memory twice in the virtual memory
> map for the process, directly adjacent to each other.  This allows work
> function code to avoid doing any bounds checking or modular index arithmetic
> operations when reading and writing its input and output buffers.  Going
> "off the end" of the buffer just results in accessing the start of the
> buffer which is mapped into the next block of memory.  Not only does this
> make the code and I/O much faster, but the work function code gets a lot
> simpler.
>
> I wonder if that assertion is generally true, or only in some cases?
> Increment and test shouldn't be *that* expensive.
>

I'm sure the benefit varies depending on the situation, including some where
there is no benefit.  But modulo increments add a conditional operation for
every pointer increment, which can cause a processor pipeline stall, and
takes up register file space to hold the array boundaries for every input
and output stream.  It also forces the author of the work() function to know
about how GNU Radio handles circular buffers.  The double-mapped circular
buffer lets the work() function treat all its inputs and outputs as linear
arrays in memory, no matter the actual case.


>  My recollection is that sizes get ballooned outwards based on the degree
> of decimation downstream from the source block, which is
>   a policy I've never quite gotten my head around.  The FFT in my
> flow-graph might get decimated by a factor of 10 or more, which given
>   the policy I mentioned, might lead to chunky allocations.
>

Ah, I think I remember this discussion a while back.  It's the
gr.keep_one_in_n block used to decimate the sample stream into blocks that
update the FFT sink at the requested screen update rate.  Decimator blocks
tell the runtime their decimation ratio via set_relative_rate().  Knowing
this, GNU Radio expands the buffer allocation by twice the decimation rate,
to allow enough room for the upstream block thread to be simultaneously
writing a full set of inputs and the downstream block thread to be reading a
full set of inputs:

http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/master/annotate/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc#L106

>
Since gr.keep_one_in_n is simply discarding n-1 input items, and doesn't
need to actually process them like most decimators would, there may be an
alternative way to handle this for this particular block.

Johnathan
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to