#![allow(clippy::result_large_err)]
use numrs2::array::Array;
use numrs2::error::Result;
use std::time::Instant;
#[cfg(feature = "gpu")]
use numrs2::gpu;
#[allow(clippy::result_large_err)]
fn main() -> Result<()> {
println!("NumRS2 GPU Acceleration Example");
println!("===============================");
#[cfg(feature = "gpu")]
{
println!("\nDetecting GPU hardware...");
if let Some(gpu_info) = gpu::get_gpu_info() {
println!("✓ GPU detected: {}", gpu_info);
} else {
println!("✗ No compatible GPU detected");
println!("GPU operations will fall back to CPU implementations");
}
}
#[cfg(not(feature = "gpu"))]
{
println!("\n✗ GPU support is not enabled in this build");
println!("Recompile with --features gpu to enable GPU acceleration");
}
run_matrix_multiply_benchmark(100)?;
run_matrix_multiply_benchmark(1000)?;
#[cfg(feature = "gpu")]
run_matrix_multiply_benchmark(2000)?;
println!("\nExample completed successfully!");
Ok(())
}
fn run_matrix_multiply_benchmark(size: usize) -> Result<()> {
println!(
"\nMatrix Multiplication Benchmark ({}x{} matrices)",
size, size
);
println!("---------------------------------------------------");
let a = create_random_matrix(size, size)?;
let b = create_random_matrix(size, size)?;
println!("Running CPU matrix multiplication...");
let cpu_start = Instant::now();
let _cpu_result = a.dot(&b)?;
let cpu_duration = cpu_start.elapsed();
println!("CPU time: {:.2?}", cpu_duration);
#[cfg(feature = "gpu")]
{
println!("Running GPU matrix multiplication...");
let gpu_start = Instant::now();
let gpu_a = gpu::GpuArray::from_array(&a)?;
let gpu_b = gpu::GpuArray::from_array(&b)?;
let gpu_result = gpu::matmul(&gpu_a, &gpu_b)?;
let _result = gpu_result.to_array()?;
let gpu_duration = gpu_start.elapsed();
println!("GPU time: {:.2?}", gpu_duration);
if gpu_duration.as_secs_f64() > 0.0 {
let speedup = cpu_duration.as_secs_f64() / gpu_duration.as_secs_f64();
println!("Speedup: {:.2}x", speedup);
}
}
Ok(())
}
fn create_random_matrix(rows: usize, cols: usize) -> Result<Array<f32>> {
use numrs2::random::distributions::uniform;
uniform(0.0, 1.0, &[rows, cols])
}