This comes from how Suscan delivers data to the channelizer. There is some potential bottleneck for high-rate signal sources, in which whatever is read from the source is copied back to a private buffer in both the channelizer and the smoothpsd. This can be improved by using zero-copy buffers, which should enable the following algorithm:
Create certain object named sample_buffer_pool, with two atomic operations, acquire() and give(). acquire() must wait if too many buffers have been allocated. Perhaps use message pools?
Give the possibility to add virtual circularity by means of mmap(), if the underlying architecture supports it.
In the source worker, acquire a buffer by means of acquire() and populate it.
Once the buffer is fully populated, apply the baseband filters, the smoothpsd, etc in the source worker
Deliver the filtered buffer to the inspector worker and repeat from 1. This is actually an ownership transfer to the inspector worker.
Remove the infamous inspsched barrier
In the inspector worker:
The callback has ownership on the inspector worker. Deliver it to a new channelizer method, which will FFT it directly. If halfsize is lesser than PAGE_SIZE, copy last third. If halfsize is greater or equal than PAGE_SIZE and the architecture supports it, rely on virtual circularity. If the FFT buffer does not match the channelizer buffer, that is a bug
Feed the inspectors accordingly.
Release the buffer.
Requirements of sample_buffer_pool
Adjusting the size of the subsequent acquired buffers, without affecting the already acquired ones.
Virtual circularity, if the machine supports it.
Inspecting the properties of the acquired buffers.
This comes from how Suscan delivers data to the channelizer. There is some potential bottleneck for high-rate signal sources, in which whatever is read from the source is copied back to a private buffer in both the channelizer and the smoothpsd. This can be improved by using zero-copy buffers, which should enable the following algorithm:
sample_buffer_pool
, with two atomic operations,acquire()
andgive()
.acquire()
must wait if too many buffers have been allocated. Perhaps use message pools?acquire()
and populate it.In the inspector worker:
halfsize
is lesser thanPAGE_SIZE
, copy last third. Ifhalfsize
is greater or equal thanPAGE_SIZE
and the architecture supports it, rely on virtual circularity. If the FFT buffer does not match the channelizer buffer, that is a bugRequirements of
sample_buffer_pool