DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
AVXRunSumProcessor.cpp
Go to the documentation of this file.
1
8
10
11namespace tpglibs {
12
14
15void
16AVXRunSumProcessor::configure(const nlohmann::json& config, const int16_t* plane_numbers)
17{
18#ifdef TPGLIBS_ENABLE_STATE_MONITORING
19 m_internal_state_name_registry.register_internal_state("r", std::shared_ptr<__m256i>(&m_memory_factor, [](auto*) {}));
20 m_internal_state_name_registry.register_internal_state("s", std::shared_ptr<__m256i>(&m_scale_factor, [](auto*) {}));
21 m_internal_state_name_registry.register_internal_state("rs", std::shared_ptr<__m256i>(&m_running_sum, [](auto*) {}));
23#endif
24
25 int16_t memory_factors[16];
26 int16_t plane_memory_factors[3] = { config["memory_factor_plane0"],
27 config["memory_factor_plane1"],
28 config["memory_factor_plane2"] };
29 int16_t memory_divisors[16];
30 int16_t plane_memory_divisors[3] = { config["memory_divisor_plane0"],
31 config["memory_divisor_plane1"],
32 config["memory_divisor_plane2"] };
33 int16_t scale_factors[16];
34 int16_t plane_scale_factors[3] = { config["scale_factor_plane0"],
35 config["scale_factor_plane1"],
36 config["scale_factor_plane2"] };
37 int16_t scale_divisors[16];
38 int16_t plane_scale_divisors[3] = { config["scale_divisor_plane0"],
39 config["scale_divisor_plane1"],
40 config["scale_divisor_plane2"] };
41
42 for (int i = 0; i < 16; i++) {
43 memory_factors[i] = plane_memory_factors[plane_numbers[i]];
44 memory_divisors[i] = 0x7FFF / plane_memory_divisors[plane_numbers[i]]; // Need to adjust for AVX2 usage.
45 scale_factors[i] = plane_scale_factors[plane_numbers[i]];
46 scale_divisors[i] = 0x7FFF / plane_scale_divisors[plane_numbers[i]]; // Need to adjust for AVX2 usage.
47 }
48
49 m_memory_factor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(memory_factors));
50 m_memory_divisor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(memory_divisors));
51 m_scale_factor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(scale_factors));
52 m_scale_divisor = _mm256_lddqu_si256(reinterpret_cast<__m256i*>(scale_divisors));
53}
54
55__m256i
56AVXRunSumProcessor::process(const __m256i& signal)
57{
58#ifdef TPGLIBS_ENABLE_STATE_MONITORING
59 m_samples++;
60 if (m_collect_internal_state_flag && (m_samples % m_sample_period == 0)) {
61 m_internal_state_buffer_manager.write_to_active_buffer();
62 }
63#endif
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}
74
75} // namespace tpglibs
#define REGISTER_AVXPROCESSOR_CREATOR(processor_name, processor_class)
Factory registration macro.
virtual __m256i process(const __m256i &signal) override
Simple signal pass-through on __m256i type.
AVX signal processor: Calculates the running sum of the signal.
__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.
__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.
virtual void configure_internal_state_collection(const nlohmann::json &)