DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
tpglibs
src
AVXRunSumProcessor.cpp
Go to the documentation of this file.
1
8
9
#include "
tpglibs/AVXRunSumProcessor.hpp
"
10
11
namespace
tpglibs
{
12
13
REGISTER_AVXPROCESSOR_CREATOR
(
"AVXRunSumProcessor"
,
AVXRunSumProcessor
)
14
15
void
AVXRunSumProcessor
::
configure
(const nlohmann::json& config, const int16_t* plane_numbers) {
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
19
m_internal_state_name_registry
.register_internal_state(
"r"
,
20
std::shared_ptr<__m256i>(&
m_memory_factor
, [](
auto
*){}));
21
m_internal_state_name_registry
.register_internal_state(
"s"
,
22
std::shared_ptr<__m256i>(&
m_scale_factor
, [](
auto
*){}));
23
m_internal_state_name_registry
.register_internal_state(
"rs"
,
24
std::shared_ptr<__m256i>(&
m_running_sum
, [](
auto
*){}));
25
26
configure_internal_state_collection
(config);
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
}
57
58
__m256i
AVXRunSumProcessor::process
(
const
__m256i& signal) {
59
// Update sample counter and write internal states to buffer for harvesting
60
m_samples
++;
61
if
(
m_collect_internal_state_flag
&& (
m_samples
%
m_sample_period
== 0)) {
62
m_internal_state_buffer_manager
.write_to_active_buffer();
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);
72
return
AVXProcessor::process
(
m_running_sum
);
73
}
74
75
}
// namespace tpglibs
REGISTER_AVXPROCESSOR_CREATOR
#define REGISTER_AVXPROCESSOR_CREATOR(processor_name, processor_class)
Factory registration macro.
Definition
AVXFactory.hpp:16
tpglibs::AVXProcessor::process
virtual __m256i process(const __m256i &signal) override
Simple signal pass-through on __m256i type.
Definition
AVXProcessor.hpp:26
tpglibs::AVXRunSumProcessor
AVX signal processor: Calculates the running sum of the signal.
Definition
AVXRunSumProcessor.hpp:26
tpglibs::AVXRunSumProcessor::process
__m256i process(const __m256i &signal) override
Calculate and store the running sum.
Definition
AVXRunSumProcessor.cpp:58
tpglibs::AVXRunSumProcessor::configure
void configure(const nlohmann::json &config, const int16_t *plane_numbers) override
Configures the R factor and S factor according to plane.
Definition
AVXRunSumProcessor.cpp:15
tpglibs::AVXRunSumProcessor::m_memory_divisor
__m256i m_memory_divisor
The divisor for the R factor.
Definition
AVXRunSumProcessor.hpp:40
tpglibs::AVXRunSumProcessor::m_memory_factor
__m256i m_memory_factor
The R factor in the model equation.
Definition
AVXRunSumProcessor.hpp:28
tpglibs::AVXRunSumProcessor::m_scale_divisor
__m256i m_scale_divisor
The divisor for the S factor.
Definition
AVXRunSumProcessor.hpp:37
tpglibs::AVXRunSumProcessor::m_running_sum
__m256i m_running_sum
The RS in the model equation.
Definition
AVXRunSumProcessor.hpp:34
tpglibs::AVXRunSumProcessor::m_scale_factor
__m256i m_scale_factor
The S factor in the model equation.
Definition
AVXRunSumProcessor.hpp:31
tpglibs::AbstractProcessor< __m256i >::m_internal_state_buffer_manager
ProcessorInternalStateBufferManager< __m256i > m_internal_state_buffer_manager
Definition
AbstractProcessor.hpp:32
tpglibs::AbstractProcessor< __m256i >::m_samples
std::atomic< uint64_t > m_samples
Definition
AbstractProcessor.hpp:36
tpglibs::AbstractProcessor< __m256i >::m_internal_state_name_registry
ProcessorInternalStateNameRegistry< __m256i > m_internal_state_name_registry
Definition
AbstractProcessor.hpp:33
tpglibs::AbstractProcessor< __m256i >::m_sample_period
uint64_t m_sample_period
Definition
AbstractProcessor.hpp:38
tpglibs::AbstractProcessor< __m256i >::configure_internal_state_collection
virtual void configure_internal_state_collection(const nlohmann::json &config)
Definition
AbstractProcessor.hpp:63
tpglibs::AbstractProcessor< __m256i >::m_collect_internal_state_flag
bool m_collect_internal_state_flag
Definition
AbstractProcessor.hpp:37
tpglibs
Definition
AbstractFactory.hpp:20
AVXRunSumProcessor.hpp
Generated on
for DUNE-DAQ by
1.17.0