Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
kcenon::monitoring::simd_aggregator Class Reference

SIMD-accelerated statistical aggregator. More...

#include <simd_aggregator.h>

Collaboration diagram for kcenon::monitoring::simd_aggregator:
Collaboration graph

Public Member Functions

 simd_aggregator ()
 Default constructor with default configuration.
 
 simd_aggregator (const simd_config &config)
 Construct with configuration.
 
common::Result< double > sum (const std::vector< double > &data)
 Calculate sum of elements.
 
common::Result< double > mean (const std::vector< double > &data)
 Calculate mean of elements.
 
common::Result< double > min (const std::vector< double > &data)
 Find minimum value.
 
common::Result< double > max (const std::vector< double > &data)
 Find maximum value.
 
common::Result< double > variance (const std::vector< double > &data)
 Calculate variance of elements.
 
common::Result< statistical_summarycompute_summary (const std::vector< double > &data)
 Compute full statistical summary.
 
const simd_capabilitiesget_capabilities () const
 Get SIMD capabilities.
 
common::Result< bool > test_simd ()
 Self-test SIMD functionality.
 
const simd_aggregator_statisticsget_statistics () const
 Get aggregator statistics.
 
void reset_statistics ()
 Reset statistics.
 

Private Member Functions

bool should_use_simd (size_t data_size) const
 
double sum_scalar (const std::vector< double > &data) const
 
double sum_simd (const std::vector< double > &data) const
 
double min_scalar (const std::vector< double > &data) const
 
double min_simd (const std::vector< double > &data) const
 
double max_scalar (const std::vector< double > &data) const
 
double max_simd (const std::vector< double > &data) const
 

Private Attributes

simd_config config_
 
simd_capabilities capabilities_
 
simd_aggregator_statistics stats_
 

Detailed Description

SIMD-accelerated statistical aggregator.

This class provides high-performance statistical operations using SIMD (Single Instruction Multiple Data) instructions when available. Falls back to scalar operations when SIMD is not available or disabled.

Definition at line 189 of file simd_aggregator.h.

Constructor & Destructor Documentation

◆ simd_aggregator() [1/2]

kcenon::monitoring::simd_aggregator::simd_aggregator ( )
inline

Default constructor with default configuration.

Definition at line 194 of file simd_aggregator.h.

194: simd_aggregator(simd_config{}) {}
simd_aggregator()
Default constructor with default configuration.

◆ simd_aggregator() [2/2]

kcenon::monitoring::simd_aggregator::simd_aggregator ( const simd_config & config)
inlineexplicit

Construct with configuration.

Parameters
configAggregator configuration

Definition at line 200 of file simd_aggregator.h.

201 : config_(config)
static simd_capabilities detect()
Detect available SIMD features at runtime.

Member Function Documentation

◆ compute_summary()

common::Result< statistical_summary > kcenon::monitoring::simd_aggregator::compute_summary ( const std::vector< double > & data)
inline

Compute full statistical summary.

Parameters
dataInput data vector
Returns
common::Result<statistical_summary> containing statistics

Definition at line 335 of file simd_aggregator.h.

335 {
336 if (data.empty()) {
337 return common::Result<statistical_summary>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute summary of empty data").to_common_error());
338 }
339
340 statistical_summary summary;
341 summary.count = data.size();
342
343 // Compute sum
344 auto sum_result = sum(data);
345 if (sum_result.is_err()) {
346 return common::Result<statistical_summary>::err(error_info(monitoring_error_code::operation_failed, "Failed to compute sum").to_common_error());
347 }
348 summary.sum = sum_result.value();
349 summary.mean = summary.sum / static_cast<double>(summary.count);
350
351 // Compute min/max
352 auto min_result = min(data);
353 auto max_result = max(data);
354
355 if (min_result.is_err() || max_result.is_err()) {
356 return common::Result<statistical_summary>::err(error_info(monitoring_error_code::operation_failed, "Failed to compute min/max").to_common_error());
357 }
358
359 summary.min_val = min_result.value();
360 summary.max_val = max_result.value();
361
362 // Compute variance
363 if (summary.count > 1) {
364 auto var_result = variance(data);
365 if (var_result.is_ok()) {
366 summary.variance = var_result.value();
367 summary.std_dev = std::sqrt(summary.variance);
368 }
369 }
370
371 return common::ok(summary);
372 }
common::Result< double > sum(const std::vector< double > &data)
Calculate sum of elements.
common::Result< double > variance(const std::vector< double > &data)
Calculate variance of elements.
common::Result< double > min(const std::vector< double > &data)
Find minimum value.
common::Result< double > max(const std::vector< double > &data)
Find maximum value.
@ summary
Pre-calculated quantiles and count/sum.

References kcenon::monitoring::statistical_summary::count, kcenon::monitoring::invalid_argument, max(), min(), kcenon::monitoring::operation_failed, sum(), kcenon::monitoring::summary, and variance().

Referenced by TEST_F(), TEST_F(), TEST_F(), and TEST_F().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_capabilities()

const simd_capabilities & kcenon::monitoring::simd_aggregator::get_capabilities ( ) const
inline

Get SIMD capabilities.

Returns
Reference to detected capabilities

Definition at line 378 of file simd_aggregator.h.

378 {
379 return capabilities_;
380 }

References capabilities_.

Referenced by TEST_F(), and TEST_F().

Here is the caller graph for this function:

◆ get_statistics()

const simd_aggregator_statistics & kcenon::monitoring::simd_aggregator::get_statistics ( ) const
inline

Get aggregator statistics.

Returns
Reference to statistics

Definition at line 430 of file simd_aggregator.h.

430 {
431 return stats_;
432 }
simd_aggregator_statistics stats_

References stats_.

Referenced by TEST_F(), TEST_F(), and TEST_F().

Here is the caller graph for this function:

◆ max()

common::Result< double > kcenon::monitoring::simd_aggregator::max ( const std::vector< double > & data)
inline

Find maximum value.

Parameters
dataInput data vector
Returns
common::Result<double> containing maximum

Definition at line 279 of file simd_aggregator.h.

279 {
280 if (data.empty()) {
281 return common::Result<double>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute max of empty data").to_common_error());
282 }
283
285 stats_.total_elements_processed += data.size();
286
287 double result = 0.0;
288
289 if (should_use_simd(data.size())) {
290 result = max_simd(data);
292 } else {
293 result = max_scalar(data);
295 }
296
297 return common::ok(result);
298 }
bool should_use_simd(size_t data_size) const
double max_scalar(const std::vector< double > &data) const
double max_simd(const std::vector< double > &data) const

References kcenon::monitoring::invalid_argument, max_scalar(), max_simd(), kcenon::monitoring::simd_aggregator_statistics::scalar_operations, should_use_simd(), kcenon::monitoring::simd_aggregator_statistics::simd_operations, stats_, kcenon::monitoring::simd_aggregator_statistics::total_elements_processed, and kcenon::monitoring::simd_aggregator_statistics::total_operations.

Referenced by compute_summary(), TEST_F(), TEST_F(), and test_simd().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ max_scalar()

double kcenon::monitoring::simd_aggregator::max_scalar ( const std::vector< double > & data) const
inlineprivate

Definition at line 596 of file simd_aggregator.h.

596 {
597 return *std::max_element(data.begin(), data.end());
598 }

Referenced by max(), and max_simd().

Here is the caller graph for this function:

◆ max_simd()

double kcenon::monitoring::simd_aggregator::max_simd ( const std::vector< double > & data) const
inlineprivate

Definition at line 600 of file simd_aggregator.h.

600 {
601#if defined(SIMD_AVX2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && defined(__AVX2__)
602 const size_t simd_width = 4;
603 size_t simd_count = data.size() / simd_width;
604
605 __m256d max_vec = _mm256_set1_pd(std::numeric_limits<double>::lowest());
606
607 for (size_t i = 0; i < simd_count; ++i) {
608 __m256d vec = _mm256_loadu_pd(&data[i * simd_width]);
609 max_vec = _mm256_max_pd(max_vec, vec);
610 }
611
612 alignas(32) double temp[4];
613 _mm256_storeu_pd(temp, max_vec);
614 double result = std::max({temp[0], temp[1], temp[2], temp[3]});
615
616 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
617 result = std::max(result, data[i]);
618 }
619
620 return result;
621#elif defined(SIMD_SSE2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86))
622 const size_t simd_width = 2;
623 size_t simd_count = data.size() / simd_width;
624
625 __m128d max_vec = _mm_set1_pd(std::numeric_limits<double>::lowest());
626
627 for (size_t i = 0; i < simd_count; ++i) {
628 __m128d vec = _mm_loadu_pd(&data[i * simd_width]);
629 max_vec = _mm_max_pd(max_vec, vec);
630 }
631
632 alignas(16) double temp[2];
633 _mm_storeu_pd(temp, max_vec);
634 double result = std::max(temp[0], temp[1]);
635
636 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
637 result = std::max(result, data[i]);
638 }
639
640 return result;
641#elif defined(SIMD_NEON_AVAILABLE) && (defined(__aarch64__) || defined(_M_ARM64))
642 const size_t simd_width = 2;
643 size_t simd_count = data.size() / simd_width;
644
645 float64x2_t max_vec = vdupq_n_f64(std::numeric_limits<double>::lowest());
646
647 for (size_t i = 0; i < simd_count; ++i) {
648 float64x2_t vec = vld1q_f64(&data[i * simd_width]);
649 max_vec = vmaxq_f64(max_vec, vec);
650 }
651
652 double result = std::max(vgetq_lane_f64(max_vec, 0), vgetq_lane_f64(max_vec, 1));
653
654 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
655 result = std::max(result, data[i]);
656 }
657
658 return result;
659#else
660 return max_scalar(data);
661#endif
662 }

References max_scalar().

Referenced by max().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mean()

common::Result< double > kcenon::monitoring::simd_aggregator::mean ( const std::vector< double > & data)
inline

Calculate mean of elements.

Parameters
dataInput data vector
Returns
common::Result<double> containing mean

Definition at line 235 of file simd_aggregator.h.

235 {
236 if (data.empty()) {
237 return common::Result<double>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute mean of empty data").to_common_error());
238 }
239
240 auto sum_result = sum(data);
241 if (sum_result.is_err()) {
242 return sum_result;
243 }
244
245 return common::ok(sum_result.value() / static_cast<double>(data.size()));
246 }

References kcenon::monitoring::invalid_argument, and sum().

Referenced by TEST_F(), TEST_F(), TEST_F(), test_simd(), and variance().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ min()

common::Result< double > kcenon::monitoring::simd_aggregator::min ( const std::vector< double > & data)
inline

Find minimum value.

Parameters
dataInput data vector
Returns
common::Result<double> containing minimum

Definition at line 253 of file simd_aggregator.h.

253 {
254 if (data.empty()) {
255 return common::Result<double>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute min of empty data").to_common_error());
256 }
257
259 stats_.total_elements_processed += data.size();
260
261 double result = 0.0;
262
263 if (should_use_simd(data.size())) {
264 result = min_simd(data);
266 } else {
267 result = min_scalar(data);
269 }
270
271 return common::ok(result);
272 }
double min_scalar(const std::vector< double > &data) const
double min_simd(const std::vector< double > &data) const

References kcenon::monitoring::invalid_argument, min_scalar(), min_simd(), kcenon::monitoring::simd_aggregator_statistics::scalar_operations, should_use_simd(), kcenon::monitoring::simd_aggregator_statistics::simd_operations, stats_, kcenon::monitoring::simd_aggregator_statistics::total_elements_processed, and kcenon::monitoring::simd_aggregator_statistics::total_operations.

Referenced by compute_summary(), TEST_F(), TEST_F(), and test_simd().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ min_scalar()

double kcenon::monitoring::simd_aggregator::min_scalar ( const std::vector< double > & data) const
inlineprivate

Definition at line 528 of file simd_aggregator.h.

528 {
529 return *std::min_element(data.begin(), data.end());
530 }

Referenced by min(), and min_simd().

Here is the caller graph for this function:

◆ min_simd()

double kcenon::monitoring::simd_aggregator::min_simd ( const std::vector< double > & data) const
inlineprivate

Definition at line 532 of file simd_aggregator.h.

532 {
533#if defined(SIMD_AVX2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && defined(__AVX2__)
534 const size_t simd_width = 4;
535 size_t simd_count = data.size() / simd_width;
536
537 __m256d min_vec = _mm256_set1_pd(std::numeric_limits<double>::max());
538
539 for (size_t i = 0; i < simd_count; ++i) {
540 __m256d vec = _mm256_loadu_pd(&data[i * simd_width]);
541 min_vec = _mm256_min_pd(min_vec, vec);
542 }
543
544 alignas(32) double temp[4];
545 _mm256_storeu_pd(temp, min_vec);
546 double result = std::min({temp[0], temp[1], temp[2], temp[3]});
547
548 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
549 result = std::min(result, data[i]);
550 }
551
552 return result;
553#elif defined(SIMD_SSE2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86))
554 const size_t simd_width = 2;
555 size_t simd_count = data.size() / simd_width;
556
557 __m128d min_vec = _mm_set1_pd(std::numeric_limits<double>::max());
558
559 for (size_t i = 0; i < simd_count; ++i) {
560 __m128d vec = _mm_loadu_pd(&data[i * simd_width]);
561 min_vec = _mm_min_pd(min_vec, vec);
562 }
563
564 alignas(16) double temp[2];
565 _mm_storeu_pd(temp, min_vec);
566 double result = std::min(temp[0], temp[1]);
567
568 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
569 result = std::min(result, data[i]);
570 }
571
572 return result;
573#elif defined(SIMD_NEON_AVAILABLE) && (defined(__aarch64__) || defined(_M_ARM64))
574 const size_t simd_width = 2;
575 size_t simd_count = data.size() / simd_width;
576
577 float64x2_t min_vec = vdupq_n_f64(std::numeric_limits<double>::max());
578
579 for (size_t i = 0; i < simd_count; ++i) {
580 float64x2_t vec = vld1q_f64(&data[i * simd_width]);
581 min_vec = vminq_f64(min_vec, vec);
582 }
583
584 double result = std::min(vgetq_lane_f64(min_vec, 0), vgetq_lane_f64(min_vec, 1));
585
586 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
587 result = std::min(result, data[i]);
588 }
589
590 return result;
591#else
592 return min_scalar(data);
593#endif
594 }

References min_scalar().

Referenced by min().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reset_statistics()

void kcenon::monitoring::simd_aggregator::reset_statistics ( )
inline

Reset statistics.

Definition at line 437 of file simd_aggregator.h.

437 {
438 stats_.reset();
439 }

References kcenon::monitoring::simd_aggregator_statistics::reset(), and stats_.

Here is the call graph for this function:

◆ should_use_simd()

bool kcenon::monitoring::simd_aggregator::should_use_simd ( size_t data_size) const
inlineprivate

Definition at line 442 of file simd_aggregator.h.

442 {
443 if (!config_.enable_simd) {
444 return false;
445 }
446
447 // Use SIMD only for sufficiently large datasets
448 if (data_size < config_.vector_size * 2) {
449 return false;
450 }
451
452 // Check if any SIMD is available
456 }
bool enable_simd
Enable SIMD acceleration.
size_t vector_size
SIMD vector width for processing.

References kcenon::monitoring::simd_capabilities::avx2_available, capabilities_, config_, kcenon::monitoring::simd_config::enable_simd, kcenon::monitoring::simd_capabilities::neon_available, kcenon::monitoring::simd_capabilities::sse2_available, and kcenon::monitoring::simd_config::vector_size.

Referenced by max(), min(), and sum().

Here is the caller graph for this function:

◆ sum()

common::Result< double > kcenon::monitoring::simd_aggregator::sum ( const std::vector< double > & data)
inline

Calculate sum of elements.

Parameters
dataInput data vector
Returns
common::Result<double> containing sum

Definition at line 209 of file simd_aggregator.h.

209 {
210 if (data.empty()) {
211 return common::Result<double>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute sum of empty data").to_common_error());
212 }
213
215 stats_.total_elements_processed += data.size();
216
217 double result = 0.0;
218
219 if (should_use_simd(data.size())) {
220 result = sum_simd(data);
222 } else {
223 result = sum_scalar(data);
225 }
226
227 return common::ok(result);
228 }
double sum_simd(const std::vector< double > &data) const
double sum_scalar(const std::vector< double > &data) const

References kcenon::monitoring::invalid_argument, kcenon::monitoring::simd_aggregator_statistics::scalar_operations, should_use_simd(), kcenon::monitoring::simd_aggregator_statistics::simd_operations, stats_, sum_scalar(), sum_simd(), kcenon::monitoring::simd_aggregator_statistics::total_elements_processed, and kcenon::monitoring::simd_aggregator_statistics::total_operations.

Referenced by compute_summary(), mean(), TEST_F(), TEST_F(), TEST_F(), and test_simd().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sum_scalar()

double kcenon::monitoring::simd_aggregator::sum_scalar ( const std::vector< double > & data) const
inlineprivate

Definition at line 458 of file simd_aggregator.h.

458 {
459 return std::accumulate(data.begin(), data.end(), 0.0);
460 }

Referenced by sum(), and sum_simd().

Here is the caller graph for this function:

◆ sum_simd()

double kcenon::monitoring::simd_aggregator::sum_simd ( const std::vector< double > & data) const
inlineprivate

Definition at line 462 of file simd_aggregator.h.

462 {
463#if defined(SIMD_AVX2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && defined(__AVX2__)
464 const size_t simd_width = 4; // AVX processes 4 doubles at a time
465 size_t simd_count = data.size() / simd_width;
466
467 __m256d sum_vec = _mm256_setzero_pd();
468
469 for (size_t i = 0; i < simd_count; ++i) {
470 __m256d vec = _mm256_loadu_pd(&data[i * simd_width]);
471 sum_vec = _mm256_add_pd(sum_vec, vec);
472 }
473
474 // Horizontal sum
475 alignas(32) double temp[4];
476 _mm256_storeu_pd(temp, sum_vec);
477 double result = temp[0] + temp[1] + temp[2] + temp[3];
478
479 // Handle remaining elements
480 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
481 result += data[i];
482 }
483
484 return result;
485#elif defined(SIMD_SSE2_AVAILABLE) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86))
486 const size_t simd_width = 2; // SSE processes 2 doubles at a time
487 size_t simd_count = data.size() / simd_width;
488
489 __m128d sum_vec = _mm_setzero_pd();
490
491 for (size_t i = 0; i < simd_count; ++i) {
492 __m128d vec = _mm_loadu_pd(&data[i * simd_width]);
493 sum_vec = _mm_add_pd(sum_vec, vec);
494 }
495
496 alignas(16) double temp[2];
497 _mm_storeu_pd(temp, sum_vec);
498 double result = temp[0] + temp[1];
499
500 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
501 result += data[i];
502 }
503
504 return result;
505#elif defined(SIMD_NEON_AVAILABLE) && (defined(__aarch64__) || defined(_M_ARM64))
506 const size_t simd_width = 2; // NEON processes 2 doubles at a time
507 size_t simd_count = data.size() / simd_width;
508
509 float64x2_t sum_vec = vdupq_n_f64(0.0);
510
511 for (size_t i = 0; i < simd_count; ++i) {
512 float64x2_t vec = vld1q_f64(&data[i * simd_width]);
513 sum_vec = vaddq_f64(sum_vec, vec);
514 }
515
516 double result = vgetq_lane_f64(sum_vec, 0) + vgetq_lane_f64(sum_vec, 1);
517
518 for (size_t i = simd_count * simd_width; i < data.size(); ++i) {
519 result += data[i];
520 }
521
522 return result;
523#else
524 return sum_scalar(data);
525#endif
526 }

References sum_scalar().

Referenced by sum().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ test_simd()

common::Result< bool > kcenon::monitoring::simd_aggregator::test_simd ( )
inline

Self-test SIMD functionality.

Returns
common::Result<bool> indicating if SIMD is working correctly

Definition at line 386 of file simd_aggregator.h.

386 {
387 // Create test data
388 std::vector<double> test_data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
389
390 // Test sum
391 auto sum_result = sum(test_data);
392 if (sum_result.is_err()) {
393 return common::ok(false);
394 }
395
396 if (std::abs(sum_result.value() - 36.0) > 1e-10) {
397 return common::ok(false);
398 }
399
400 // Test mean
401 auto mean_result = mean(test_data);
402 if (mean_result.is_err()) {
403 return common::ok(false);
404 }
405
406 if (std::abs(mean_result.value() - 4.5) > 1e-10) {
407 return common::ok(false);
408 }
409
410 // Test min/max
411 auto min_result = min(test_data);
412 auto max_result = max(test_data);
413
414 if (min_result.is_err() || max_result.is_err()) {
415 return common::ok(false);
416 }
417
418 if (std::abs(min_result.value() - 1.0) > 1e-10 ||
419 std::abs(max_result.value() - 8.0) > 1e-10) {
420 return common::ok(false);
421 }
422
423 return common::ok(true);
424 }
common::Result< double > mean(const std::vector< double > &data)
Calculate mean of elements.

References max(), mean(), min(), and sum().

Referenced by TEST_F().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ variance()

common::Result< double > kcenon::monitoring::simd_aggregator::variance ( const std::vector< double > & data)
inline

Calculate variance of elements.

Parameters
dataInput data vector
Returns
common::Result<double> containing variance

Definition at line 305 of file simd_aggregator.h.

305 {
306 if (data.empty()) {
307 return common::Result<double>::err(error_info(monitoring_error_code::invalid_argument, "Cannot compute variance of empty data").to_common_error());
308 }
309
310 if (data.size() == 1) {
311 return common::ok(0.0);
312 }
313
314 auto mean_result = mean(data);
315 if (mean_result.is_err()) {
316 return mean_result;
317 }
318
319 double data_mean = mean_result.value();
320 double sum_sq_diff = 0.0;
321
322 for (const auto& val : data) {
323 double diff = val - data_mean;
324 sum_sq_diff += diff * diff;
325 }
326
327 return common::ok(sum_sq_diff / static_cast<double>(data.size() - 1));
328 }

References kcenon::monitoring::invalid_argument, and mean().

Referenced by compute_summary(), TEST_F(), TEST_F(), and TEST_F().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ capabilities_

simd_capabilities kcenon::monitoring::simd_aggregator::capabilities_
private

Definition at line 665 of file simd_aggregator.h.

Referenced by get_capabilities(), and should_use_simd().

◆ config_

simd_config kcenon::monitoring::simd_aggregator::config_
private

Definition at line 664 of file simd_aggregator.h.

Referenced by should_use_simd().

◆ stats_

simd_aggregator_statistics kcenon::monitoring::simd_aggregator::stats_
mutableprivate

Definition at line 666 of file simd_aggregator.h.

Referenced by get_statistics(), max(), min(), reset_statistics(), and sum().


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