use scirs2_core::Complex64;
use scirs2_fft::{ParallelExecutor, ParallelPlanner, ParallelPlanningConfig};
use std::time::Instant;
#[allow(dead_code)]
fn main() {
println!("Simple Parallel FFT Planning Example");
println!("===================================\n");
let config = ParallelPlanningConfig {
parallel_threshold: 512,
max_threads: None,
parallel_execution: true,
..Default::default()
};
let planner = ParallelPlanner::new(Some(config.clone()));
let fftsizes = [
vec![1024], vec![512, 512], vec![128, 128, 128], vec![2048], ];
let plan_specs: Vec<_> = fftsizes
.iter()
.map(|shape| (shape.clone(), true, Default::default()))
.collect();
println!("Creating multiple FFT plans in parallel...");
let start = Instant::now();
let results = planner
.plan_multiple(&plan_specs)
.expect("Operation failed");
let elapsed = start.elapsed();
println!("Created {} plans in {:?}", results.len(), elapsed);
for (i, result) in results.iter().enumerate() {
println!(
"Plan {}: shape={:?}, created by thread {} in {:?}",
i, result.shape, result.thread_id, result.creation_time
);
}
println!("\nExecuting FFT using the first plan...");
let plan = &results[0].plan;
let executor = ParallelExecutor::new(plan.clone(), Some(config));
let size = plan.shape().iter().product::<usize>();
let input = create_signal(size);
let mut output = vec![Complex64::default(); size];
let start = Instant::now();
executor
.execute(&input, &mut output)
.expect("Operation failed");
let elapsed = start.elapsed();
println!("FFT of size {size} executed in {elapsed:?}");
println!("First few output values: {:?}", &output[..4]);
}
#[allow(dead_code)]
fn create_signal(size: usize) -> Vec<Complex64> {
(0..size)
.map(|i| {
let x = i as f64 / size as f64;
let val = (2.0 * std::f64::consts::PI * x * 5.0).sin()
+ 0.5 * (2.0 * std::f64::consts::PI * x * 10.0).sin();
Complex64::new(val, 0.0)
})
.collect()
}