added dynamic discovery of configurations
This commit is contained in:
@@ -7,14 +7,17 @@ use sysinfo::System;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::Mutex;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::sal::traits::{PlatformSal, AuditStep, SafetyStatus};
|
||||
use crate::sal::heuristic::discovery::SystemFactSheet;
|
||||
use crate::load::Workload;
|
||||
use crate::mediator::{TelemetryState, UiCommand, BenchmarkPhase};
|
||||
use crate::engine::{OptimizerEngine, ThermalProfile, ThermalPoint, OptimizationResult};
|
||||
|
||||
pub struct BenchmarkOrchestrator {
|
||||
sal: Arc<dyn PlatformSal>,
|
||||
facts: SystemFactSheet,
|
||||
workload: Box<dyn Workload>,
|
||||
telemetry_tx: mpsc::Sender<TelemetryState>,
|
||||
command_rx: mpsc::Receiver<UiCommand>,
|
||||
@@ -39,6 +42,7 @@ pub struct BenchmarkOrchestrator {
|
||||
impl BenchmarkOrchestrator {
|
||||
pub fn new(
|
||||
sal: Arc<dyn PlatformSal>,
|
||||
facts: SystemFactSheet,
|
||||
workload: Box<dyn Workload>,
|
||||
telemetry_tx: mpsc::Sender<TelemetryState>,
|
||||
command_rx: mpsc::Receiver<UiCommand>,
|
||||
@@ -53,6 +57,7 @@ impl BenchmarkOrchestrator {
|
||||
|
||||
Self {
|
||||
sal,
|
||||
facts,
|
||||
workload,
|
||||
telemetry_tx,
|
||||
command_rx,
|
||||
@@ -168,7 +173,7 @@ impl BenchmarkOrchestrator {
|
||||
self.phase = BenchmarkPhase::PhysicalModeling;
|
||||
self.log("Phase 3: Calculating Silicon Physical Sweet Spot...")?;
|
||||
|
||||
let res = self.generate_result(false);
|
||||
let mut res = self.generate_result(false);
|
||||
|
||||
self.log(&format!("✓ Thermal Resistance (Rθ): {:.3} K/W", res.thermal_resistance_kw))?;
|
||||
self.log(&format!("✓ Silicon Knee Found: {:.1} W", res.silicon_knee_watts))?;
|
||||
@@ -186,24 +191,22 @@ impl BenchmarkOrchestrator {
|
||||
};
|
||||
|
||||
// 1. Throttled (Merged if exists)
|
||||
let throttled_path = "throttled.conf";
|
||||
let existing_throttled = std::fs::read_to_string(throttled_path).unwrap_or_default();
|
||||
let throttled_content = if existing_throttled.is_empty() {
|
||||
crate::engine::formatters::throttled::ThrottledTranslator::generate_conf(&config)
|
||||
} else {
|
||||
crate::engine::formatters::throttled::ThrottledTranslator::merge_conf(&existing_throttled, &config)
|
||||
};
|
||||
std::fs::write(throttled_path, throttled_content)?;
|
||||
self.log("✓ Saved 'throttled.conf' (merged).")?;
|
||||
if let Some(throttled_path) = self.facts.paths.configs.get("throttled") {
|
||||
crate::engine::formatters::throttled::ThrottledTranslator::save(throttled_path, &config)?;
|
||||
self.log(&format!("✓ Saved '{}' (merged).", throttled_path.display()))?;
|
||||
res.config_paths.insert("throttled".to_string(), throttled_path.clone());
|
||||
}
|
||||
|
||||
// 2. i8kmon
|
||||
let i8k_config = crate::engine::formatters::i8kmon::I8kmonConfig {
|
||||
t_ambient: self.profile.ambient_temp,
|
||||
t_max_fan: res.max_temp_c - 5.0, // Aim to hit max fan before max temp
|
||||
};
|
||||
let i8k_content = crate::engine::formatters::i8kmon::I8kmonTranslator::generate_conf(&i8k_config);
|
||||
std::fs::write("i8kmon.conf", i8k_content)?;
|
||||
self.log("✓ Saved 'i8kmon.conf'.")?;
|
||||
if let Some(i8k_path) = self.facts.paths.configs.get("i8kmon") {
|
||||
let i8k_config = crate::engine::formatters::i8kmon::I8kmonConfig {
|
||||
t_ambient: self.profile.ambient_temp,
|
||||
t_max_fan: res.max_temp_c - 5.0,
|
||||
};
|
||||
crate::engine::formatters::i8kmon::I8kmonTranslator::save(i8k_path, &i8k_config)?;
|
||||
self.log(&format!("✓ Saved '{}'.", i8k_path.display()))?;
|
||||
res.config_paths.insert("i8kmon".to_string(), i8k_path.clone());
|
||||
}
|
||||
|
||||
self.sal.restore()?;
|
||||
self.log("✓ Environment restored.")?;
|
||||
@@ -253,6 +256,7 @@ impl BenchmarkOrchestrator {
|
||||
recommended_pl2: knee * 1.25,
|
||||
max_temp_c: max_t,
|
||||
is_partial,
|
||||
config_paths: std::collections::HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user