1use 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#[allow(dead_code)]
19pub struct UnifiedOptimizationEngine {
20 simd_engine: Arc<Mutex<UltraSimdEngine>>,
22 cache_optimizer: Arc<Mutex<UltraCacheOptimizer>>,
24 coordinator: Arc<RwLock<OptimizationCoordinator>>,
26 profiler: Arc<Profiler>,
28 config: UnifiedOptimizerConfig,
30}
31
32#[allow(dead_code)]
34pub struct OptimizationCoordinator {
35 operation_profiles: HashMap<String, OperationPerformanceProfile>,
37 adaptive_strategies: HashMap<String, AdaptiveStrategy>,
39 performance_history: Vec<PerformanceSnapshot>,
41 current_optimization_state: OptimizationState,
43}
44
45#[derive(Debug, Clone)]
47pub struct OperationPerformanceProfile {
48 pub operation_name: String,
50 pub optimal_simd_strategy: SimdStrategy,
52 pub optimal_cache_strategy: CacheStrategy,
54 pub size_breakpoints: Vec<SizeBreakpoint>,
56 pub performance_characteristics: PerformanceCharacteristics,
58}
59
60#[derive(Debug, Clone)]
62pub enum SimdStrategy {
63 HardwareSpecific { vector_width: usize },
65 Adaptive { min_width: usize, max_width: usize },
67 Scalar,
69 Mixed {
71 strategies: Vec<(usize, Box<SimdStrategy>)>,
72 },
73}
74
75#[derive(Debug, Clone)]
77pub enum CacheStrategy {
78 CacheOblivious,
80 Blocked {
82 l1_block: usize,
83 l2_block: usize,
84 l3_block: usize,
85 },
86 NumaAware { preferred_node: usize },
88 Prefetching {
90 distance: usize,
91 pattern: PrefetchPattern,
92 },
93 Combined { strategies: Vec<CacheStrategy> },
95}
96
97#[derive(Debug, Clone)]
99pub enum PrefetchPattern {
100 Sequential,
101 Strided { stride: usize },
102 Random,
103 Adaptive,
104}
105
106#[derive(Debug, Clone)]
108pub struct SizeBreakpoint {
109 pub min_size: usize,
111 pub max_size: usize,
113 pub simd_strategy: SimdStrategy,
115 pub cache_strategy: CacheStrategy,
117 pub performance_multiplier: f64,
119}
120
121#[derive(Debug, Clone)]
123pub struct PerformanceCharacteristics {
124 pub throughput: f64,
126 pub latency: f64,
128 pub memory_bandwidth_utilization: f64,
130 pub cache_efficiency: f64,
132 pub simd_utilization: f64,
134 pub energy_efficiency: f64,
136}
137
138#[derive(Debug, Clone)]
140pub struct AdaptiveStrategy {
141 pub name: String,
143 pub learning_rate: f64,
145 pub performance_threshold: f64,
147 pub switching_history: Vec<StrategySwitch>,
149 pub confidence: f64,
151}
152
153#[derive(Debug, Clone)]
155pub struct StrategySwitch {
156 pub from_strategy: String,
158 pub to_strategy: String,
160 pub performance_improvement: f64,
162 pub timestamp: std::time::Instant,
164}
165
166#[derive(Debug, Clone)]
168pub struct PerformanceSnapshot {
169 pub operation: String,
171 pub data_size: usize,
173 pub simd_strategy: String,
175 pub cache_strategy: String,
176 pub measured_performance: PerformanceCharacteristics,
178 pub timestamp: std::time::Instant,
180}
181
182#[derive(Debug, Clone)]
184pub struct OptimizationState {
185 pub active_optimizations: Vec<String>,
187 pub performance_trend: PerformanceTrend,
189 pub resource_utilization: ResourceUtilization,
191 pub optimization_effectiveness: f64,
193}
194
195#[derive(Debug, Clone)]
197pub enum PerformanceTrend {
198 Improving { rate: f64 },
199 Stable { variance: f64 },
200 Degrading { rate: f64 },
201 Unknown,
202}
203
204#[derive(Debug, Clone)]
206pub struct ResourceUtilization {
207 pub cpu_utilization: f64,
209 pub memory_utilization: f64,
211 pub cache_utilization: f64,
213 pub simd_utilization: f64,
215 pub memory_bandwidth_utilization: f64,
217}
218
219#[derive(Debug, Clone)]
221pub struct UnifiedOptimizerConfig {
222 pub enable_simd: bool,
224 pub enable_cache: bool,
226 pub enable_adaptive: bool,
228 pub monitoring_frequency: std::time::Duration,
230 pub optimization_aggressiveness: f64,
232 pub learning_rate: f64,
234 pub history_retention: std::time::Duration,
236}
237
238impl UnifiedOptimizationEngine {
239 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 engine.initialize_operation_profiles()?;
281
282 Ok(engine)
283 }
284
285 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 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 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 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 let data_size = input_a.len();
424 let strategy = self.select_optimization_strategy(operation, data_size)?;
425
426 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 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 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 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 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 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 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 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, cache_efficiency: 0.85, simd_utilization: 0.9, energy_efficiency: 1e12, },
552 timestamp: std::time::Instant::now(),
553 };
554
555 coordinator.performance_history.push(snapshot);
556
557 while coordinator.performance_history.len() > 1000 {
559 coordinator.performance_history.remove(0);
560 }
561
562 Ok(())
563 }
564
565 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 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 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) }
598 }
599
600 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 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#[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
739static GLOBAL_UNIFIED_OPTIMIZER: std::sync::OnceLock<Arc<Mutex<UnifiedOptimizationEngine>>> =
741 std::sync::OnceLock::new();
742
743pub 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 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 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 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}