simd_iter 0.2.0

A simple library for iterating over slices as `Simd` vectors.
Documentation
#![feature(portable_simd)]

use criterion::{Criterion, criterion_group, criterion_main};
use rand::Rng;

use simd_iter::{SimdIterable, SimdNumIterExt};

fn criterion_benchmark(c: &mut Criterion) {
    let mut xs = vec![0.; 10_000_000];
    rand::thread_rng().fill(xs.as_mut_slice());
    let mut ys = vec![0.; 10_000_000];
    rand::thread_rng().fill(ys.as_mut_slice());

    c.bench_function("sum", |b| b.iter(|| xs.iter().sum::<f64>()));
    c.bench_function("vec sum", |b| b.iter(|| xs.simd_iter().scalar_sum()));
    c.bench_function("dot", |b| {
        b.iter(|| xs.iter().zip(&ys).map(|(x, y)| x * y).sum::<f64>())
    });
    c.bench_function("vec dot", |b| {
        b.iter(|| {
            xs.simd_iter()
                .zip(ys.simd_iter())
                .map(|(xv, yv)| xv * yv)
                .scalar_sum()
        })
    });
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);