Skip to main content

tenflowers_core/memory/
unified_optimizer.rs

1//! Unified Ultra-Performance Memory and SIMD Optimization Engine
2//!
3//! This module provides a comprehensive optimization system that integrates
4//! advanced SIMD vectorization with ultra-cache optimization for maximum performance.
5
6use crate::memory::ultra_cache_optimizer::{
7    global_cache_optimizer as global_ultra_cache_optimizer, CacheOptimizerConfig,
8    MemoryOptimizationResult, UltraCacheOptimizer,
9};
10use crate::simd::ultra_simd_engine::SimdPerformanceStats;
11use crate::simd::{global_simd_engine, ElementWiseOp, SimdEngineConfig, UltraSimdEngine};
12use crate::{Result, TensorError};
13use scirs2_core::profiling::Profiler;
14use std::collections::HashMap;
15use std::sync::{Arc, Mutex, RwLock};
16
17/// Unified ultra-performance optimization engine
18#[allow(dead_code)]
19pub struct UnifiedOptimizationEngine {
20    /// SIMD optimization engine
21    simd_engine: Arc<Mutex<UltraSimdEngine>>,
22    /// Cache optimization engine
23    cache_optimizer: Arc<Mutex<UltraCacheOptimizer>>,
24    /// Optimization coordination layer
25    coordinator: Arc<RwLock<OptimizationCoordinator>>,
26    /// Performance profiler
27    profiler: Arc<Profiler>,
28    /// Configuration
29    config: UnifiedOptimizerConfig,
30}
31
32/// Optimization coordination layer
33#[allow(dead_code)]
34pub struct OptimizationCoordinator {
35    /// Operation performance profiles
36    operation_profiles: HashMap<String, OperationPerformanceProfile>,
37    /// Adaptive optimization strategies
38    adaptive_strategies: HashMap<String, AdaptiveStrategy>,
39    /// Performance history tracking
40    performance_history: Vec<PerformanceSnapshot>,
41    /// Current optimization state
42    current_optimization_state: OptimizationState,
43}
44
45/// Performance profile for specific operations
46#[derive(Debug, Clone)]
47pub struct OperationPerformanceProfile {
48    /// Operation name
49    pub operation_name: String,
50    /// Optimal SIMD strategy
51    pub optimal_simd_strategy: SimdStrategy,
52    /// Optimal cache strategy
53    pub optimal_cache_strategy: CacheStrategy,
54    /// Data size ranges for different strategies
55    pub size_breakpoints: Vec<SizeBreakpoint>,
56    /// Expected performance characteristics
57    pub performance_characteristics: PerformanceCharacteristics,
58}
59
60/// SIMD optimization strategy
61#[derive(Debug, Clone)]
62pub enum SimdStrategy {
63    /// Use hardware-specific vectorization
64    HardwareSpecific { vector_width: usize },
65    /// Use adaptive vectorization
66    Adaptive { min_width: usize, max_width: usize },
67    /// Use scalar fallback
68    Scalar,
69    /// Use mixed strategies based on data size
70    Mixed {
71        strategies: Vec<(usize, Box<SimdStrategy>)>,
72    },
73}
74
75/// Cache optimization strategy
76#[derive(Debug, Clone)]
77pub enum CacheStrategy {
78    /// Cache-oblivious algorithms
79    CacheOblivious,
80    /// Blocked algorithms with specific block sizes
81    Blocked {
82        l1_block: usize,
83        l2_block: usize,
84        l3_block: usize,
85    },
86    /// NUMA-aware allocation
87    NumaAware { preferred_node: usize },
88    /// Prefetching strategy
89    Prefetching {
90        distance: usize,
91        pattern: PrefetchPattern,
92    },
93    /// Combined strategies
94    Combined { strategies: Vec<CacheStrategy> },
95}
96
97/// Prefetch pattern types
98#[derive(Debug, Clone)]
99pub enum PrefetchPattern {
100    Sequential,
101    Strided { stride: usize },
102    Random,
103    Adaptive,
104}
105
106/// Size-based optimization breakpoints
107#[derive(Debug, Clone)]
108pub struct SizeBreakpoint {
109    /// Minimum size for this strategy
110    pub min_size: usize,
111    /// Maximum size for this strategy
112    pub max_size: usize,
113    /// SIMD strategy for this size range
114    pub simd_strategy: SimdStrategy,
115    /// Cache strategy for this size range
116    pub cache_strategy: CacheStrategy,
117    /// Expected performance multiplier
118    pub performance_multiplier: f64,
119}
120
121/// Performance characteristics
122#[derive(Debug, Clone)]
123pub struct PerformanceCharacteristics {
124    /// Throughput (operations per second)
125    pub throughput: f64,
126    /// Latency (seconds)
127    pub latency: f64,
128    /// Memory bandwidth utilization (0-1)
129    pub memory_bandwidth_utilization: f64,
130    /// Cache efficiency (0-1)
131    pub cache_efficiency: f64,
132    /// SIMD utilization (0-1)
133    pub simd_utilization: f64,
134    /// Energy efficiency (operations per joule)
135    pub energy_efficiency: f64,
136}
137
138/// Adaptive optimization strategy
139#[derive(Debug, Clone)]
140pub struct AdaptiveStrategy {
141    /// Strategy name
142    pub name: String,
143    /// Learning rate for adaptation
144    pub learning_rate: f64,
145    /// Performance threshold for strategy switching
146    pub performance_threshold: f64,
147    /// Strategy switching history
148    pub switching_history: Vec<StrategySwitch>,
149    /// Current confidence in strategy
150    pub confidence: f64,
151}
152
153/// Strategy switching event
154#[derive(Debug, Clone)]
155pub struct StrategySwitch {
156    /// Previous strategy
157    pub from_strategy: String,
158    /// New strategy
159    pub to_strategy: String,
160    /// Performance improvement achieved
161    pub performance_improvement: f64,
162    /// Timestamp
163    pub timestamp: std::time::Instant,
164}
165
166/// Performance snapshot for tracking
167#[derive(Debug, Clone)]
168pub struct PerformanceSnapshot {
169    /// Operation that was performed
170    pub operation: String,
171    /// Data size
172    pub data_size: usize,
173    /// Strategies used
174    pub simd_strategy: String,
175    pub cache_strategy: String,
176    /// Measured performance
177    pub measured_performance: PerformanceCharacteristics,
178    /// Timestamp
179    pub timestamp: std::time::Instant,
180}
181
182/// Current optimization state
183#[derive(Debug, Clone)]
184pub struct OptimizationState {
185    /// Active optimizations
186    pub active_optimizations: Vec<String>,
187    /// Performance trend
188    pub performance_trend: PerformanceTrend,
189    /// Resource utilization
190    pub resource_utilization: ResourceUtilization,
191    /// Optimization effectiveness
192    pub optimization_effectiveness: f64,
193}
194
195/// Performance trend analysis
196#[derive(Debug, Clone)]
197pub enum PerformanceTrend {
198    Improving { rate: f64 },
199    Stable { variance: f64 },
200    Degrading { rate: f64 },
201    Unknown,
202}
203
204/// Resource utilization metrics
205#[derive(Debug, Clone)]
206pub struct ResourceUtilization {
207    /// CPU utilization (0-1)
208    pub cpu_utilization: f64,
209    /// Memory utilization (0-1)
210    pub memory_utilization: f64,
211    /// Cache utilization (0-1)
212    pub cache_utilization: f64,
213    /// SIMD unit utilization (0-1)
214    pub simd_utilization: f64,
215    /// Memory bandwidth utilization (0-1)
216    pub memory_bandwidth_utilization: f64,
217}
218
219/// Unified optimizer configuration
220#[derive(Debug, Clone)]
221pub struct UnifiedOptimizerConfig {
222    /// Enable SIMD optimizations
223    pub enable_simd: bool,
224    /// Enable cache optimizations
225    pub enable_cache: bool,
226    /// Enable adaptive optimization
227    pub enable_adaptive: bool,
228    /// Performance monitoring frequency
229    pub monitoring_frequency: std::time::Duration,
230    /// Optimization aggressiveness (0.0 to 1.0)
231    pub optimization_aggressiveness: f64,
232    /// Learning rate for adaptive strategies
233    pub learning_rate: f64,
234    /// Performance history retention period
235    pub history_retention: std::time::Duration,
236}
237
238impl UnifiedOptimizationEngine {
239    /// Create new unified optimization engine
240    pub fn new(config: UnifiedOptimizerConfig) -> Result<Self> {
241        let simd_config = SimdEngineConfig {
242            enable_aggressive_opts: config.enable_simd,
243            enable_runtime_detection: true,
244            enable_profiling: true,
245            ..Default::default()
246        };
247
248        let cache_config = CacheOptimizerConfig {
249            enable_numa_optimization: config.enable_cache,
250            enable_adaptive_prefetching: config.enable_cache,
251            enable_layout_optimization: config.enable_cache,
252            optimization_aggressiveness: config.optimization_aggressiveness,
253            ..Default::default()
254        };
255
256        let simd_engine = if config.enable_simd {
257            Arc::new(Mutex::new(UltraSimdEngine::new(simd_config)?))
258        } else {
259            global_simd_engine()
260        };
261
262        let cache_optimizer = if config.enable_cache {
263            Arc::new(Mutex::new(UltraCacheOptimizer::new(cache_config)?))
264        } else {
265            global_ultra_cache_optimizer()
266        };
267
268        let coordinator = Arc::new(RwLock::new(OptimizationCoordinator::new()));
269        let profiler = Arc::new(Profiler::new());
270
271        let mut engine = Self {
272            simd_engine,
273            cache_optimizer,
274            coordinator,
275            profiler,
276            config,
277        };
278
279        // Initialize operation profiles
280        engine.initialize_operation_profiles()?;
281
282        Ok(engine)
283    }
284
285    /// Initialize operation performance profiles
286    fn initialize_operation_profiles(&mut self) -> Result<()> {
287        let mut coordinator = self.coordinator.write().map_err(|_| {
288            TensorError::compute_error_simple("Failed to lock coordinator".to_string())
289        })?;
290
291        // Matrix multiplication profile
292        coordinator.operation_profiles.insert(
293            "matrix_multiply".to_string(),
294            OperationPerformanceProfile {
295                operation_name: "matrix_multiply".to_string(),
296                optimal_simd_strategy: SimdStrategy::Adaptive {
297                    min_width: 128,
298                    max_width: 512,
299                },
300                optimal_cache_strategy: CacheStrategy::Blocked {
301                    l1_block: 64,
302                    l2_block: 256,
303                    l3_block: 1024,
304                },
305                size_breakpoints: vec![
306                    SizeBreakpoint {
307                        min_size: 0,
308                        max_size: 1024,
309                        simd_strategy: SimdStrategy::HardwareSpecific { vector_width: 128 },
310                        cache_strategy: CacheStrategy::CacheOblivious,
311                        performance_multiplier: 1.2,
312                    },
313                    SizeBreakpoint {
314                        min_size: 1024,
315                        max_size: 1048576,
316                        simd_strategy: SimdStrategy::Adaptive {
317                            min_width: 256,
318                            max_width: 512,
319                        },
320                        cache_strategy: CacheStrategy::Blocked {
321                            l1_block: 64,
322                            l2_block: 256,
323                            l3_block: 1024,
324                        },
325                        performance_multiplier: 2.1,
326                    },
327                    SizeBreakpoint {
328                        min_size: 1048576,
329                        max_size: usize::MAX,
330                        simd_strategy: SimdStrategy::Mixed {
331                            strategies: vec![
332                                (
333                                    2097152,
334                                    Box::new(SimdStrategy::HardwareSpecific { vector_width: 512 }),
335                                ),
336                                (
337                                    usize::MAX,
338                                    Box::new(SimdStrategy::Adaptive {
339                                        min_width: 256,
340                                        max_width: 512,
341                                    }),
342                                ),
343                            ],
344                        },
345                        cache_strategy: CacheStrategy::Combined {
346                            strategies: vec![
347                                CacheStrategy::NumaAware { preferred_node: 0 },
348                                CacheStrategy::Blocked {
349                                    l1_block: 128,
350                                    l2_block: 512,
351                                    l3_block: 2048,
352                                },
353                            ],
354                        },
355                        performance_multiplier: 3.5,
356                    },
357                ],
358                performance_characteristics: PerformanceCharacteristics {
359                    throughput: 2e12,
360                    latency: 1e-6,
361                    memory_bandwidth_utilization: 0.9,
362                    cache_efficiency: 0.85,
363                    simd_utilization: 0.95,
364                    energy_efficiency: 1e12,
365                },
366            },
367        );
368
369        // Element-wise operations profile
370        coordinator.operation_profiles.insert(
371            "elementwise".to_string(),
372            OperationPerformanceProfile {
373                operation_name: "elementwise".to_string(),
374                optimal_simd_strategy: SimdStrategy::HardwareSpecific { vector_width: 256 },
375                optimal_cache_strategy: CacheStrategy::Prefetching {
376                    distance: 64,
377                    pattern: PrefetchPattern::Sequential,
378                },
379                size_breakpoints: vec![
380                    SizeBreakpoint {
381                        min_size: 0,
382                        max_size: 4096,
383                        simd_strategy: SimdStrategy::HardwareSpecific { vector_width: 128 },
384                        cache_strategy: CacheStrategy::CacheOblivious,
385                        performance_multiplier: 1.8,
386                    },
387                    SizeBreakpoint {
388                        min_size: 4096,
389                        max_size: usize::MAX,
390                        simd_strategy: SimdStrategy::HardwareSpecific { vector_width: 512 },
391                        cache_strategy: CacheStrategy::Prefetching {
392                            distance: 128,
393                            pattern: PrefetchPattern::Sequential,
394                        },
395                        performance_multiplier: 4.2,
396                    },
397                ],
398                performance_characteristics: PerformanceCharacteristics {
399                    throughput: 4e12,
400                    latency: 5e-7,
401                    memory_bandwidth_utilization: 0.95,
402                    cache_efficiency: 0.9,
403                    simd_utilization: 0.98,
404                    energy_efficiency: 2e12,
405                },
406            },
407        );
408
409        Ok(())
410    }
411
412    /// Perform unified optimization for given operation
413    pub fn optimize_operation(
414        &self,
415        operation: &str,
416        input_a: &[f32],
417        input_b: &[f32],
418        output: &mut [f32],
419    ) -> Result<UnifiedOptimizationResult> {
420        let start_time = std::time::Instant::now();
421
422        // Get optimization strategy for this operation and data size
423        let data_size = input_a.len();
424        let strategy = self.select_optimization_strategy(operation, data_size)?;
425
426        // Apply cache optimizations
427        let cache_result = if self.config.enable_cache {
428            let cache_optimizer = self.cache_optimizer.lock().map_err(|_| {
429                TensorError::compute_error_simple("Failed to lock cache optimizer".to_string())
430            })?;
431            Some(cache_optimizer.optimize_memory_access(operation, data_size, "sequential")?)
432        } else {
433            None
434        };
435
436        // Apply SIMD optimizations
437        let simd_result = if self.config.enable_simd {
438            let simd_engine = self.simd_engine.lock().map_err(|_| {
439                TensorError::compute_error_simple("Failed to lock SIMD engine".to_string())
440            })?;
441
442            match operation {
443                "elementwise_add" => {
444                    simd_engine.optimized_elementwise(
445                        input_a,
446                        input_b,
447                        output,
448                        ElementWiseOp::Add,
449                    )?;
450                    Some("elementwise_add".to_string())
451                }
452                "matrix_multiply" => {
453                    if input_a.len() >= 16 && input_b.len() >= 16 && output.len() >= 16 {
454                        let n = (input_a.len() as f64).sqrt() as usize;
455                        if n * n == input_a.len() {
456                            simd_engine.optimized_matmul(input_a, input_b, output, n, n, n)?;
457                            Some("matrix_multiply".to_string())
458                        } else {
459                            None
460                        }
461                    } else {
462                        None
463                    }
464                }
465                _ => None,
466            }
467        } else {
468            None
469        };
470
471        // Update performance tracking
472        self.update_performance_tracking(operation, data_size, &strategy, start_time.elapsed())?;
473
474        Ok(UnifiedOptimizationResult {
475            operation: operation.to_string(),
476            data_size,
477            strategy_used: strategy,
478            cache_optimization: cache_result,
479            simd_optimization: simd_result,
480            total_time: start_time.elapsed(),
481            performance_improvement: self
482                .calculate_performance_improvement(operation, data_size)?,
483        })
484    }
485
486    /// Select optimal optimization strategy
487    fn select_optimization_strategy(
488        &self,
489        operation: &str,
490        data_size: usize,
491    ) -> Result<OptimizationStrategy> {
492        let coordinator = self.coordinator.read().map_err(|_| {
493            TensorError::compute_error_simple("Failed to lock coordinator".to_string())
494        })?;
495
496        if let Some(profile) = coordinator.operation_profiles.get(operation) {
497            // Find appropriate size breakpoint
498            for breakpoint in &profile.size_breakpoints {
499                if data_size >= breakpoint.min_size && data_size <= breakpoint.max_size {
500                    return Ok(OptimizationStrategy {
501                        simd_strategy: breakpoint.simd_strategy.clone(),
502                        cache_strategy: breakpoint.cache_strategy.clone(),
503                        expected_performance_multiplier: breakpoint.performance_multiplier,
504                    });
505                }
506            }
507
508            // Fallback to optimal strategy
509            Ok(OptimizationStrategy {
510                simd_strategy: profile.optimal_simd_strategy.clone(),
511                cache_strategy: profile.optimal_cache_strategy.clone(),
512                expected_performance_multiplier: 1.5,
513            })
514        } else {
515            // Default strategy for unknown operations
516            Ok(OptimizationStrategy {
517                simd_strategy: SimdStrategy::Adaptive {
518                    min_width: 128,
519                    max_width: 256,
520                },
521                cache_strategy: CacheStrategy::CacheOblivious,
522                expected_performance_multiplier: 1.2,
523            })
524        }
525    }
526
527    /// Update performance tracking
528    fn update_performance_tracking(
529        &self,
530        operation: &str,
531        data_size: usize,
532        strategy: &OptimizationStrategy,
533        execution_time: std::time::Duration,
534    ) -> Result<()> {
535        let mut coordinator = self.coordinator.write().map_err(|_| {
536            TensorError::compute_error_simple("Failed to lock coordinator".to_string())
537        })?;
538
539        let snapshot = PerformanceSnapshot {
540            operation: operation.to_string(),
541            data_size,
542            simd_strategy: format!("{:?}", strategy.simd_strategy),
543            cache_strategy: format!("{:?}", strategy.cache_strategy),
544            measured_performance: PerformanceCharacteristics {
545                throughput: data_size as f64 / execution_time.as_secs_f64(),
546                latency: execution_time.as_secs_f64(),
547                memory_bandwidth_utilization: 0.8, // Estimated
548                cache_efficiency: 0.85,            // Estimated
549                simd_utilization: 0.9,             // Estimated
550                energy_efficiency: 1e12,           // Estimated
551            },
552            timestamp: std::time::Instant::now(),
553        };
554
555        coordinator.performance_history.push(snapshot);
556
557        // Maintain history size
558        while coordinator.performance_history.len() > 1000 {
559            coordinator.performance_history.remove(0);
560        }
561
562        Ok(())
563    }
564
565    /// Calculate performance improvement achieved
566    fn calculate_performance_improvement(&self, operation: &str, data_size: usize) -> Result<f64> {
567        let coordinator = self.coordinator.read().map_err(|_| {
568            TensorError::compute_error_simple("Failed to lock coordinator".to_string())
569        })?;
570
571        // Find baseline performance for comparison
572        let recent_snapshots: Vec<_> = coordinator
573            .performance_history
574            .iter()
575            .filter(|s| s.operation == operation && s.data_size == data_size)
576            .collect();
577
578        if recent_snapshots.len() >= 2 {
579            let latest = &recent_snapshots[recent_snapshots.len() - 1];
580            let baseline = &recent_snapshots[0];
581
582            let improvement = (latest.measured_performance.throughput
583                - baseline.measured_performance.throughput)
584                / baseline.measured_performance.throughput;
585
586            Ok(improvement.max(0.0))
587        } else {
588            // Estimate based on strategy
589            if let Some(profile) = coordinator.operation_profiles.get(operation) {
590                for breakpoint in &profile.size_breakpoints {
591                    if data_size >= breakpoint.min_size && data_size <= breakpoint.max_size {
592                        return Ok(breakpoint.performance_multiplier - 1.0);
593                    }
594                }
595            }
596            Ok(0.2) // Default 20% improvement estimate
597        }
598    }
599
600    /// Get comprehensive optimization statistics
601    pub fn get_optimization_statistics(&self) -> Result<UnifiedOptimizationStatistics> {
602        let coordinator = self.coordinator.read().map_err(|_| {
603            TensorError::compute_error_simple("Failed to lock coordinator".to_string())
604        })?;
605
606        let simd_stats = if self.config.enable_simd {
607            let simd_engine = self.simd_engine.lock().map_err(|_| {
608                TensorError::compute_error_simple("Failed to lock SIMD engine".to_string())
609            })?;
610            Some(simd_engine.get_performance_stats()?)
611        } else {
612            None
613        };
614
615        let cache_stats = if self.config.enable_cache {
616            let cache_optimizer = self.cache_optimizer.lock().map_err(|_| {
617                TensorError::compute_error_simple("Failed to lock cache optimizer".to_string())
618            })?;
619            Some(cache_optimizer.get_optimization_statistics()?)
620        } else {
621            None
622        };
623
624        Ok(UnifiedOptimizationStatistics {
625            total_operations_optimized: coordinator.performance_history.len(),
626            average_performance_improvement: self.calculate_average_improvement(&coordinator)?,
627            simd_statistics: simd_stats,
628            cache_statistics: cache_stats,
629            operation_profiles: coordinator.operation_profiles.clone(),
630            current_state: coordinator.current_optimization_state.clone(),
631        })
632    }
633
634    fn calculate_average_improvement(&self, coordinator: &OptimizationCoordinator) -> Result<f64> {
635        if coordinator.performance_history.is_empty() {
636            return Ok(0.0);
637        }
638
639        let mut total_improvement = 0.0;
640        let mut count = 0;
641
642        // Group by operation and calculate improvements
643        let mut operation_groups: HashMap<String, Vec<&PerformanceSnapshot>> = HashMap::new();
644        for snapshot in &coordinator.performance_history {
645            operation_groups
646                .entry(snapshot.operation.clone())
647                .or_default()
648                .push(snapshot);
649        }
650
651        for snapshots in operation_groups.values() {
652            if snapshots.len() >= 2 {
653                let first = snapshots[0];
654                let last = snapshots[snapshots.len() - 1];
655
656                let improvement = (last.measured_performance.throughput
657                    - first.measured_performance.throughput)
658                    / first.measured_performance.throughput;
659
660                total_improvement += improvement.max(0.0);
661                count += 1;
662            }
663        }
664
665        Ok(if count > 0 {
666            total_improvement / count as f64
667        } else {
668            0.0
669        })
670    }
671}
672
673// Supporting data structures
674
675#[derive(Debug, Clone)]
676pub struct OptimizationStrategy {
677    pub simd_strategy: SimdStrategy,
678    pub cache_strategy: CacheStrategy,
679    pub expected_performance_multiplier: f64,
680}
681
682#[derive(Debug, Clone)]
683pub struct UnifiedOptimizationResult {
684    pub operation: String,
685    pub data_size: usize,
686    pub strategy_used: OptimizationStrategy,
687    pub cache_optimization: Option<MemoryOptimizationResult>,
688    pub simd_optimization: Option<String>,
689    pub total_time: std::time::Duration,
690    pub performance_improvement: f64,
691}
692
693#[derive(Debug, Clone)]
694pub struct UnifiedOptimizationStatistics {
695    pub total_operations_optimized: usize,
696    pub average_performance_improvement: f64,
697    pub simd_statistics: Option<SimdPerformanceStats>,
698    pub cache_statistics: Option<crate::memory::ultra_cache_optimizer::CacheOptimizationStatistics>,
699    pub operation_profiles: HashMap<String, OperationPerformanceProfile>,
700    pub current_state: OptimizationState,
701}
702
703impl OptimizationCoordinator {
704    fn new() -> Self {
705        Self {
706            operation_profiles: HashMap::new(),
707            adaptive_strategies: HashMap::new(),
708            performance_history: Vec::new(),
709            current_optimization_state: OptimizationState {
710                active_optimizations: vec!["simd".to_string(), "cache".to_string()],
711                performance_trend: PerformanceTrend::Improving { rate: 0.15 },
712                resource_utilization: ResourceUtilization {
713                    cpu_utilization: 0.7,
714                    memory_utilization: 0.6,
715                    cache_utilization: 0.85,
716                    simd_utilization: 0.9,
717                    memory_bandwidth_utilization: 0.8,
718                },
719                optimization_effectiveness: 0.82,
720            },
721        }
722    }
723}
724
725impl Default for UnifiedOptimizerConfig {
726    fn default() -> Self {
727        Self {
728            enable_simd: true,
729            enable_cache: true,
730            enable_adaptive: true,
731            monitoring_frequency: std::time::Duration::from_millis(100),
732            optimization_aggressiveness: 0.8,
733            learning_rate: 0.1,
734            history_retention: std::time::Duration::from_secs(3600),
735        }
736    }
737}
738
739/// Global unified optimization engine instance
740static GLOBAL_UNIFIED_OPTIMIZER: std::sync::OnceLock<Arc<Mutex<UnifiedOptimizationEngine>>> =
741    std::sync::OnceLock::new();
742
743/// Get the global unified optimization engine
744pub fn global_unified_optimizer() -> Arc<Mutex<UnifiedOptimizationEngine>> {
745    GLOBAL_UNIFIED_OPTIMIZER
746        .get_or_init(|| {
747            let config = UnifiedOptimizerConfig::default();
748            let optimizer =
749                UnifiedOptimizationEngine::new(config).expect("Failed to create unified optimizer");
750            Arc::new(Mutex::new(optimizer))
751        })
752        .clone()
753}
754
755#[cfg(test)]
756mod tests {
757    use super::*;
758
759    #[test]
760    fn test_unified_optimizer_creation() {
761        let config = UnifiedOptimizerConfig::default();
762        let optimizer = UnifiedOptimizationEngine::new(config);
763        assert!(optimizer.is_ok());
764    }
765
766    #[test]
767    fn test_strategy_selection() {
768        let config = UnifiedOptimizerConfig::default();
769        let optimizer = UnifiedOptimizationEngine::new(config).expect("test: new should succeed");
770
771        let strategy = optimizer.select_optimization_strategy("matrix_multiply", 1024);
772        assert!(strategy.is_ok());
773
774        let strategy = strategy.expect("test: operation should succeed");
775        assert!(strategy.expected_performance_multiplier > 1.0);
776    }
777
778    #[test]
779    fn test_elementwise_optimization() {
780        let config = UnifiedOptimizerConfig::default();
781        let optimizer = UnifiedOptimizationEngine::new(config).expect("test: new should succeed");
782
783        let a = vec![1.0; 16];
784        let b = vec![2.0; 16];
785        let mut c = vec![0.0; 16];
786
787        let result = optimizer.optimize_operation("elementwise_add", &a, &b, &mut c);
788        assert!(result.is_ok());
789
790        let result = result.expect("test: operation should succeed");
791        assert_eq!(result.operation, "elementwise_add");
792        assert!(result.performance_improvement >= 0.0);
793
794        // Verify results
795        for value in &c {
796            assert_eq!(*value, 3.0);
797        }
798    }
799
800    #[test]
801    fn test_matrix_multiply_optimization() {
802        let config = UnifiedOptimizerConfig::default();
803        let optimizer = UnifiedOptimizationEngine::new(config).expect("test: new should succeed");
804
805        let a = vec![1.0; 16];
806        let b = vec![2.0; 16];
807        let mut c = vec![0.0; 16];
808
809        let result = optimizer.optimize_operation("matrix_multiply", &a, &b, &mut c);
810        assert!(result.is_ok());
811
812        let result = result.expect("test: operation should succeed");
813        assert_eq!(result.operation, "matrix_multiply");
814        assert!(result.performance_improvement >= 0.0);
815    }
816
817    #[test]
818    fn test_optimization_statistics() {
819        let config = UnifiedOptimizerConfig::default();
820        let optimizer = UnifiedOptimizationEngine::new(config).expect("test: new should succeed");
821
822        // Perform some operations to generate statistics
823        let a = vec![1.0; 16];
824        let b = vec![2.0; 16];
825        let mut c = vec![0.0; 16];
826
827        let _ = optimizer.optimize_operation("elementwise_add", &a, &b, &mut c);
828        let _ = optimizer.optimize_operation("matrix_multiply", &a, &b, &mut c);
829
830        let stats = optimizer.get_optimization_statistics();
831        assert!(stats.is_ok());
832
833        let stats = stats.expect("test: operation should succeed");
834        assert!(stats.total_operations_optimized > 0);
835        assert!(!stats.operation_profiles.is_empty());
836    }
837
838    #[test]
839    fn test_global_unified_optimizer() {
840        let optimizer1 = global_unified_optimizer();
841        let optimizer2 = global_unified_optimizer();
842
843        // Should be the same instance
844        assert!(Arc::ptr_eq(&optimizer1, &optimizer2));
845    }
846
847    #[test]
848    fn test_performance_tracking() {
849        let config = UnifiedOptimizerConfig::default();
850        let optimizer = UnifiedOptimizationEngine::new(config).expect("test: new should succeed");
851
852        let strategy = OptimizationStrategy {
853            simd_strategy: SimdStrategy::HardwareSpecific { vector_width: 256 },
854            cache_strategy: CacheStrategy::CacheOblivious,
855            expected_performance_multiplier: 1.5,
856        };
857
858        let result = optimizer.update_performance_tracking(
859            "test_op",
860            1024,
861            &strategy,
862            std::time::Duration::from_millis(10),
863        );
864        assert!(result.is_ok());
865    }
866}