lmutils 0.2.92

A set of utilities for working with linear regression models
use diol::prelude::*;
use lmutils::{
    pack_avx2_par, pack_avx2_sync, pack_avx512_par, pack_avx512_sync, pack_naive_par,
    pack_naive_sync,
};

fn out(len: usize) -> Vec<u8> {
    vec![0u8; len]
}

fn data(len: usize) -> Vec<f64> {
    vec![
        1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
    ]
    .into_iter()
    .cycle()
    .take(len * 8)
    .collect()
}

fn chunk_size(len: usize) -> usize {
    let threads = rayon::current_num_threads();
    let mut chunk_size = (len / threads / 8 + 1) * 8;
    if chunk_size == 0 {
        chunk_size = 1;
    }
    chunk_size.next_power_of_two()
}

fn main() -> std::io::Result<()> {
    let mut bench = Bench::new(BenchConfig::from_args()?);
    bench.register_many(
        list![
            naive_sync,
            naive_par,
            avx2_sync,
            avx2_par,
            avx512_sync,
            avx512_par,
        ],
        [8, 80, 800, 8000, 80000, 800000, 8000000],
    );
    bench.run()?;
    Ok(())
}

fn naive_sync(bencher: Bencher, len: usize) {
    let mut out = out(len);
    let data = data(len);
    bencher.bench(|| {
        pack_naive_sync(&mut out, &data, 0.0, 1.0);
    });
}

fn naive_par(bencher: Bencher, len: usize) {
    let mut out = out(len);
    let chunk_size = chunk_size(len);
    let data = data(len);
    bencher.bench(|| {
        pack_naive_par(chunk_size, &mut out, &data, 0.0, 1.0);
    });
}

fn avx2_sync(bencher: Bencher, len: usize) {
    if is_x86_feature_detected!("avx2") {
        let mut out = out(len);
        let data = data(len);
        bencher.bench(|| {
            pack_avx2_sync(&mut out, &data, 0.0, 1.0);
        });
    }
}

fn avx2_par(bencher: Bencher, len: usize) {
    if is_x86_feature_detected!("avx2") {
        let mut out = out(len);
        let chunk_size = chunk_size(len);
        let data = data(len);
        bencher.bench(|| {
            pack_avx2_par(chunk_size, &mut out, &data, 0.0, 1.0);
        });
    }
}

fn avx512_sync(bencher: Bencher, len: usize) {
    if is_x86_feature_detected!("avx512f") {
        let mut out = out(len);
        let data = data(len);
        bencher.bench(|| {
            pack_avx512_sync(&mut out, &data, 0.0, 1.0);
        });
    }
}

fn avx512_par(bencher: Bencher, len: usize) {
    if is_x86_feature_detected!("avx512f") {
        let mut out = out(len);
        let chunk_size = chunk_size(len);
        let data = data(len);
        bencher.bench(|| {
            pack_avx512_par(chunk_size, &mut out, &data, 0.0, 1.0);
        });
    }
}