DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
tpglibs::AVXRunSumProcessor Class Reference

AVX signal processor: Calculates the running sum of the signal. More...

#include <AVXRunSumProcessor.hpp>

Inheritance diagram for tpglibs::AVXRunSumProcessor:
[legend]
Collaboration diagram for tpglibs::AVXRunSumProcessor:
[legend]

Public Member Functions

__m256i process (const __m256i &signal) override
 Calculate and store the running sum.
 
void configure (const nlohmann::json &config, const int16_t *plane_numbers) override
 Configures the R factor and S factor according to plane.
 
- Public Member Functions inherited from tpglibs::AVXProcessor
- Public Member Functions inherited from tpglibs::AbstractProcessor< __m256i >
virtual ~AbstractProcessor ()=default
 
ProcessorInternalStateBufferManager< __m256i > * _get_internal_state_buffer_manager ()
 
ProcessorInternalStateNameRegistry< __m256i > * _get_internal_state_name_registry ()
 
virtual void configure_internal_state_collection (const nlohmann::json &config)
 Configure common internal state collection parameters.
 
void set_next_processor (std::shared_ptr< AbstractProcessor< __m256i > > next_processor)
 Setter for next processor.
 
std::shared_ptr< AbstractProcessor< __m256i > > get_next_processor ()
 Getter for next processor.
 
virtual std::vector< std::string > get_requested_internal_state_names () const
 Get the names of requested internal states (delegates to registry).
 
virtual ProcessorMetricArray< std::array< int16_t, 16 > > read_internal_states_as_integer_array ()
 

Private Attributes

__m256i m_memory_factor
 The R factor in the model equation.
 
__m256i m_scale_factor
 The S factor in the model equation.
 
__m256i m_running_sum
 The RS in the model equation.
 
__m256i m_scale_divisor
 The divisor for the S factor.
 
__m256i m_memory_divisor
 The divisor for the R factor.
 

Additional Inherited Members

- Public Types inherited from tpglibs::AbstractProcessor< __m256i >
using signal_type_t
 Signal type to process on. General __m256i.
 
- Protected Attributes inherited from tpglibs::AbstractProcessor< __m256i >
ProcessorInternalStateBufferManager< __m256i > m_internal_state_buffer_manager
 
ProcessorInternalStateNameRegistry< __m256i > m_internal_state_name_registry
 
std::atomic< uint64_t > m_samples
 
bool m_collect_internal_state_flag
 
uint64_t m_sample_period
 

Detailed Description

AVX signal processor: Calculates the running sum of the signal.

Calculates the running sum of the signal with some factors. This tries to model the following equation: RS = R * RS + S * signal, where

  • RS is the on-going running sum,
  • R is the memory factor of the on-going running sum,
  • S is the scale factor for the incoming signal to avoid overflowing,
  • signal is the incoming signal.

Definition at line 26 of file AVXRunSumProcessor.hpp.

Member Function Documentation

◆ configure()

void tpglibs::AVXRunSumProcessor::configure ( const nlohmann::json & config,
const int16_t * plane_numbers )
overridevirtual

Configures the R factor and S factor according to plane.

Parameters
configJSON of the R and S factors to use per plane.
plane_numbersArray of plane numbers. Gives the channels to apply the R and S factors.

Implements tpglibs::AbstractProcessor< __m256i >.

Definition at line 15 of file AVXRunSumProcessor.cpp.

15 {
16 // Configure common metric collection parameters
17 // Register pointers to the ACTUAL member variables, not copies
18 // Use shared_ptr with no-op deleter to avoid double-free
20 std::shared_ptr<__m256i>(&m_memory_factor, [](auto*){}));
22 std::shared_ptr<__m256i>(&m_scale_factor, [](auto*){}));
24 std::shared_ptr<__m256i>(&m_running_sum, [](auto*){}));
25
27
28 int16_t memory_factors[16];
29 int16_t plane_memory_factors[3] = {config["memory_factor_plane0"],
30 config["memory_factor_plane1"],
31 config["memory_factor_plane2"]};
32 int16_t memory_divisors[16];
33 int16_t plane_memory_divisors[3] = {config["memory_divisor_plane0"],
34 config["memory_divisor_plane1"],
35 config["memory_divisor_plane2"]};
36 int16_t scale_factors[16];
37 int16_t plane_scale_factors[3] = {config["scale_factor_plane0"],
38 config["scale_factor_plane1"],
39 config["scale_factor_plane2"]};
40 int16_t scale_divisors[16];
41 int16_t plane_scale_divisors[3] = {config["scale_divisor_plane0"],
42 config["scale_divisor_plane1"],
43 config["scale_divisor_plane2"]};
44
45 for (int i = 0; i < 16; i++) {
46 memory_factors[i] = plane_memory_factors[plane_numbers[i]];
47 memory_divisors[i] = 0x7FFF / plane_memory_divisors[plane_numbers[i]]; // Need to adjust for AVX2 usage.
48 scale_factors[i] = plane_scale_factors[plane_numbers[i]];
49 scale_divisors[i] = 0x7FFF / plane_scale_divisors[plane_numbers[i]]; // Need to adjust for AVX2 usage.
50 }
51
52 m_memory_factor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(memory_factors));
53 m_memory_divisor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(memory_divisors));
54 m_scale_factor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(scale_factors));
55 m_scale_divisor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(scale_divisors));
56}
__m256i m_memory_divisor
The divisor for the R factor.
__m256i m_memory_factor
The R factor in the model equation.
__m256i m_scale_divisor
The divisor for the S factor.
__m256i m_running_sum
The RS in the model equation.
__m256i m_scale_factor
The S factor in the model equation.
ProcessorInternalStateNameRegistry< __m256i > m_internal_state_name_registry
virtual void configure_internal_state_collection(const nlohmann::json &config)
void register_internal_state(std::string name, std::shared_ptr< signal_t > pointer_to_state)
Register an internal state.

◆ process()

__m256i tpglibs::AVXRunSumProcessor::process ( const __m256i & signal)
overridevirtual

Calculate and store the running sum.

Parameters
signalThe input signal to process on.
Returns
The calculated running sum.

Reimplemented from tpglibs::AVXProcessor.

Definition at line 58 of file AVXRunSumProcessor.cpp.

58 {
59 // Update sample counter and write internal states to buffer for harvesting
60 m_samples++;
63 }
64
65 __m256i scaled_rs = _mm256_mulhrs_epi16(m_running_sum, m_memory_divisor);
66 scaled_rs = _mm256_mullo_epi16(scaled_rs, m_memory_factor);
67
68 __m256i scaled_signal = _mm256_mulhrs_epi16(signal, m_scale_divisor);
69 scaled_signal = _mm256_mullo_epi16(scaled_signal, m_scale_factor);
70
71 m_running_sum = _mm256_adds_epi16(scaled_rs, scaled_signal);
73}
virtual __m256i process(const __m256i &signal) override
Simple signal pass-through on __m256i type.
ProcessorInternalStateBufferManager< __m256i > m_internal_state_buffer_manager

Member Data Documentation

◆ m_memory_divisor

__m256i tpglibs::AVXRunSumProcessor::m_memory_divisor
private

The divisor for the R factor.

Definition at line 40 of file AVXRunSumProcessor.hpp.

◆ m_memory_factor

__m256i tpglibs::AVXRunSumProcessor::m_memory_factor
private

The R factor in the model equation.

Definition at line 28 of file AVXRunSumProcessor.hpp.

◆ m_running_sum

__m256i tpglibs::AVXRunSumProcessor::m_running_sum
private

The RS in the model equation.

Definition at line 34 of file AVXRunSumProcessor.hpp.

◆ m_scale_divisor

__m256i tpglibs::AVXRunSumProcessor::m_scale_divisor
private

The divisor for the S factor.

Definition at line 37 of file AVXRunSumProcessor.hpp.

◆ m_scale_factor

__m256i tpglibs::AVXRunSumProcessor::m_scale_factor
private

The S factor in the model equation.

Definition at line 31 of file AVXRunSumProcessor.hpp.


The documentation for this class was generated from the following files: