tenflowers_core/simd/
mod.rs1use crate::Result;
24
25#[cfg(feature = "simd")]
27use scirs2_core::parallel_ops::{par_chunks, par_join, par_scope};
28
29pub mod activation_functions;
31pub mod basic_ops;
32pub mod benchmarks;
33pub mod capabilities;
34pub mod math_functions;
35pub mod matrix_ops;
36pub mod reduction_ops;
37
38pub mod advanced_kernels;
40pub mod cache_friendly_ops;
41pub mod ultra_simd_engine;
42
43pub use activation_functions::ActivationFunctions;
45pub use basic_ops::BasicOps;
46pub use benchmarks::{BenchmarkResult, Benchmarks};
47pub use capabilities::{Capabilities, PerformanceHints, SimdCapabilities};
48pub use math_functions::MathFunctions;
49pub use matrix_ops::MatrixOps;
50pub use reduction_ops::ReductionOps;
51
52pub use ultra_simd_engine::{
54 global_simd_engine, ConvolutionParams, CpuFeatures, ElementWiseOp, ReductionOp,
55 SimdEngineConfig, UltraSimdEngine,
56};
57
58pub use cache_friendly_ops::{CacheFriendlyMatMul, CacheOptimizedTensorOps, MemoryAccessPattern};
59
60pub use advanced_kernels::{AdvancedKernelRegistry, KernelOptimizationStrategy, SpecializedKernel};
61
62pub struct SimdOptimizer;
67
68impl SimdOptimizer {
69 #[inline(always)]
73 pub fn add_f32_unchecked(a: &[f32], b: &[f32], result: &mut [f32]) {
74 BasicOps::add_f32_unchecked(a, b, result)
75 }
76
77 pub fn add_f32_optimized(a: &[f32], b: &[f32], result: &mut [f32]) -> Result<()> {
79 BasicOps::add_f32_optimized(a, b, result)
80 }
81
82 pub fn add_f32_auto(a: &[f32], b: &[f32], result: &mut [f32]) -> Result<()> {
84 BasicOps::add_f32_auto(a, b, result)
85 }
86
87 #[inline(always)]
89 pub fn mul_f32_unchecked(a: &[f32], b: &[f32], result: &mut [f32]) {
90 BasicOps::mul_f32_unchecked(a, b, result)
91 }
92
93 pub fn mul_f32_optimized(a: &[f32], b: &[f32], result: &mut [f32]) -> Result<()> {
95 BasicOps::mul_f32_optimized(a, b, result)
96 }
97
98 pub fn sub_f32_optimized(a: &[f32], b: &[f32], result: &mut [f32]) -> Result<()> {
100 BasicOps::sub_f32_optimized(a, b, result)
101 }
102
103 pub fn relu_f32_optimized(input: &[f32], output: &mut [f32]) -> Result<()> {
105 ActivationFunctions::relu_f32_optimized(input, output)
106 }
107
108 pub fn sigmoid_f32_optimized(input: &[f32], output: &mut [f32]) -> Result<()> {
110 ActivationFunctions::sigmoid_f32_optimized(input, output)
111 }
112
113 pub fn matmul_f32_blocked(
115 a: &[f32],
116 b: &[f32],
117 c: &mut [f32],
118 m: usize,
119 n: usize,
120 k: usize,
121 block_size: usize,
122 ) -> Result<()> {
123 MatrixOps::matmul_f32_blocked(a, b, c, m, n, k, block_size)
124 }
125
126 pub fn dot_product_f32_optimized(a: &[f32], b: &[f32]) -> Result<f32> {
128 MatrixOps::dot_product_f32_optimized(a, b)
129 }
130
131 #[inline(always)]
133 pub fn sum_f32_unchecked(input: &[f32]) -> f32 {
134 ReductionOps::sum_f32_unchecked(input)
135 }
136
137 #[inline(always)]
139 pub fn max_f32_unchecked(input: &[f32]) -> f32 {
140 ReductionOps::max_f32_unchecked(input)
141 }
142
143 pub fn detect_capabilities() -> SimdCapabilities {
145 Capabilities::detect_capabilities()
146 }
147
148 pub fn reduce_sum_f32_optimized(input: &[f32]) -> Result<f32> {
150 ReductionOps::reduce_sum_f32_optimized(input)
151 }
152
153 pub fn reduce_min_max_f32_optimized(input: &[f32]) -> Result<(f32, f32)> {
155 ReductionOps::reduce_min_max_f32_optimized(input)
156 }
157
158 pub fn normalize_f32_optimized(input: &[f32], output: &mut [f32], eps: f32) -> Result<()> {
160 ReductionOps::normalize_f32_optimized(input, output, eps)
161 }
162}