use jetpwmon::PowerMonitor;
use std::thread;
use std::time::Duration;
use ndarray::{Array2, s};
use ndarray::linalg::Dot;
use rand::Rng;
const MATRIX_SIZE: usize = 1000;
const NUM_THREADS: usize = 4;
const NUM_ITERATIONS: usize = 10;
fn matrix_multiply_thread(thread_id: usize) {
println!("Thread {} starting execution...", thread_id);
let mut rng = rand::thread_rng();
let mut a = Array2::zeros((MATRIX_SIZE, MATRIX_SIZE));
let mut b = Array2::zeros((MATRIX_SIZE, MATRIX_SIZE));
for i in 0..MATRIX_SIZE {
for j in 0..MATRIX_SIZE {
a[[i, j]] = rng.gen_range(-1.0..1.0);
b[[i, j]] = rng.gen_range(-1.0..1.0);
}
}
let mut c = Array2::zeros((MATRIX_SIZE, MATRIX_SIZE));
for _ in 0..NUM_ITERATIONS {
c = a.dot(&b);
a = c.clone();
}
println!("Thread {} completed execution", thread_id);
}
fn main() {
println!("Jetson Power Monitor - Matrix Multiplication Test");
println!("=================================");
let monitor = PowerMonitor::new().unwrap();
monitor.set_sampling_frequency(1000).unwrap();
monitor.reset_statistics().unwrap();
println!("Starting power sampling...");
monitor.start_sampling().unwrap();
let start_time = std::time::Instant::now();
let mut handles = vec![];
for i in 0..NUM_THREADS {
let handle = thread::spawn(move || {
matrix_multiply_thread(i);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let total_time = start_time.elapsed().as_secs_f64();
println!("\nTotal execution time: {:.2} seconds", total_time);
thread::sleep(Duration::from_micros(500000));
monitor.stop_sampling().unwrap();
let stats = monitor.get_statistics().unwrap();
println!("\nPower Consumption Statistics:");
println!("Total Power Consumption:");
println!(" Minimum Value: {:.2} W", stats.total.power.min);
println!(" Maximum Value: {:.2} W", stats.total.power.max);
println!(" Average Value: {:.2} W", stats.total.power.avg);
println!(" Total Energy Consumption: {:.2} J", stats.total.power.total);
println!(" Sample Count: {}", stats.total.power.count);
println!("\nPower Consumption Information for Each Sensor:");
for i in 0..stats.sensor_count {
let sensor = unsafe { &*stats.sensors.add(i as usize) };
let name = String::from_utf8_lossy(&sensor.name).trim_matches('\0').to_string();
println!("\nSensor: {}", name);
println!(" Minimum Value: {:.2} W", sensor.power.min);
println!(" Maximum Value: {:.2} W", sensor.power.max);
println!(" Average Value: {:.2} W", sensor.power.avg);
println!(" Total Energy Consumption: {:.2} J", sensor.power.total);
println!(" Sample Count: {}", sensor.power.count);
}
}