etensor-core 0.0.1

The pure Rust tensor math and autograd engine
Documentation
use criterion::{criterion_group, criterion_main, Criterion, BenchmarkId};
use etensor_core::buffer::Buffer;
use etensor_core::device::Device;
use etensor_core::dispatch::Dispatcher;
use etensor_core::dtypes::DType;
use etensor_core::shape::Shape;
use etensor_core::tensor::Tensor;

fn create_tensor(size: usize) -> Tensor {
    Tensor::new(
        Buffer::from_f32_vec(vec![1.0; size]),
        Shape::new(vec![size]),
        Device::Cpu,
        DType::F32,
        false,
    )
}

fn create_matrix(rows: usize, cols: usize) -> Tensor {
    Tensor::new(
        Buffer::from_f32_vec(vec![1.0; rows * cols]),
        Shape::new(vec![rows, cols]),
        Device::Cpu,
        DType::F32,
        false,
    )
}

fn bench_add(c: &mut Criterion) {
    let mut group = c.benchmark_group("element_wise_add");
    
    for size in [1024, 65536, 1_048_576].iter() {
        let a = create_tensor(*size);
        let b = create_tensor(*size);
        
        group.bench_with_input(BenchmarkId::from_parameter(size), size, |bench, _| {
            bench.iter(|| Dispatcher::add(&a, &b).unwrap())
        });
    }
    group.finish();
}

fn bench_mul(c: &mut Criterion) {
    let mut group = c.benchmark_group("element_wise_mul");
    
    for size in [1024, 65536, 1_048_576].iter() {
        let a = create_tensor(*size);
        let b = create_tensor(*size);
        
        group.bench_with_input(BenchmarkId::from_parameter(size), size, |bench, _| {
            bench.iter(|| Dispatcher::mul(&a, &b).unwrap())
        });
    }
    group.finish();
}

fn bench_relu(c: &mut Criterion) {
    let mut group = c.benchmark_group("relu");
    
    for size in [1024, 65536, 1_048_576].iter() {
        let a = create_tensor(*size);
        
        group.bench_with_input(BenchmarkId::from_parameter(size), size, |bench, _| {
            bench.iter(|| Dispatcher::relu(&a).unwrap())
        });
    }
    group.finish();
}

fn bench_matmul(c: &mut Criterion) {
    let mut group = c.benchmark_group("matmul");
    
    for n in [64, 128, 256, 512].iter() {
        let a = create_matrix(*n, *n);
        let b = create_matrix(*n, *n);
        
        group.bench_with_input(BenchmarkId::from_parameter(n), n, |bench, _| {
            bench.iter(|| Dispatcher::matmul(&a, &b).unwrap())
        });
    }
    group.finish();
}

fn bench_sum_all(c: &mut Criterion) {
    let mut group = c.benchmark_group("sum_all");
    
    for size in [1024, 65536, 1_048_576].iter() {
        let a = create_tensor(*size);
        
        group.bench_with_input(BenchmarkId::from_parameter(size), size, |bench, _| {
            bench.iter(|| Dispatcher::sum_all(&a).unwrap())
        });
    }
    group.finish();
}

criterion_group!(benches, bench_add, bench_mul, bench_relu, bench_matmul, bench_sum_all);
criterion_main!(benches);