Skip to content

Instantly share code, notes, and snippets.

@jhorstmann
Created March 15, 2022 20:34
Show Gist options
  • Save jhorstmann/e2abe07fd3bbba888d476247e1f294ed to your computer and use it in GitHub Desktop.
Save jhorstmann/e2abe07fd3bbba888d476247e1f294ed to your computer and use it in GitHub Desktop.
#![feature(portable_simd)]
use core_simd::*;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
use std::ops::Add;
#[inline(never)]
fn mask8x8_from_bits(bits: u64) -> mask8x8 {
mask8x8::from_bitmask(bits as u8)
}
#[inline(never)]
fn mask8x16_from_bits(bits: u64) -> mask8x16 {
mask8x16::from_bitmask(bits as u16)
}
#[inline(never)]
fn mask16x8_from_bits(bits: u64) -> mask16x8 {
mask16x8::from_bitmask(bits as u8)
}
#[inline(never)]
fn mask16x16_from_bits(bits: u64) -> mask16x16 {
mask16x16::from_bitmask(bits as u16)
}
#[inline(never)]
fn mask8x8_add(bits: u64, a: i8x8, b: i8x8) -> i8x8 {
a.add(mask8x8::from_bitmask(bits as u8).select(b, i8x8::splat(0)))
}
#[inline(never)]
fn mask8x16_add(bits: u64, a: i8x16, b: i8x16) -> i8x16 {
a.add(mask8x16::from_bitmask(bits as u16).select(b, i8x16::splat(0)))
}
#[inline(never)]
fn mask16x8_add(bits: u64, a: i16x8, b: i16x8) -> i16x8 {
a.add(mask16x8::from_bitmask(bits as u8).select(b, i16x8::splat(0)))
}
#[inline(never)]
fn mask16x16_add(bits: u64, a: i16x16, b: i16x16) -> i16x16 {
a.add(mask16x16::from_bitmask(bits as u16).select(b, i16x16::splat(0)))
}
pub fn bench_mask_from_bits(c: &mut Criterion) {
let mut rng = StdRng::seed_from_u64(42);
let bits = black_box(rng.gen_range(0..0x01_0000_u64));
c.bench_function("mask8x8_from_bits", |bencher| {
bencher.iter(|| mask8x8_from_bits(bits))
});
c.bench_function("mask8x16_from_bits", |bencher| {
bencher.iter(|| mask8x16_from_bits(bits))
});
c.bench_function("mask16x8_from_bits", |bencher| {
bencher.iter(|| mask16x8_from_bits(bits))
});
c.bench_function("mask16x16_from_bits", |bencher| {
bencher.iter(|| mask16x16_from_bits(bits))
});
c.bench_function("mask8x8_add", |bencher| {
let a = black_box(i8x8::splat(rng.gen_range(0..=127_i8)));
let b = black_box(i8x8::splat(rng.gen_range(0..=127_i8)));
bencher.iter(|| mask8x8_add(bits, a, b))
});
c.bench_function("mask8x16_add", |bencher| {
let a = black_box(i8x16::splat(rng.gen_range(0..=127_i8)));
let b = black_box(i8x16::splat(rng.gen_range(0..=127_i8)));
bencher.iter(|| mask8x16_add(bits, a, b))
});
c.bench_function("mask16x8_add", |bencher| {
let a = black_box(i16x8::splat(rng.gen_range(0..=32767_i16)));
let b = black_box(i16x8::splat(rng.gen_range(0..=32767_i16)));
bencher.iter(|| mask16x8_add(bits, a, b))
});
c.bench_function("mask16x16_add", |bencher| {
let a = black_box(i16x16::splat(rng.gen_range(0..=32767_i16)));
let b = black_box(i16x16::splat(rng.gen_range(0..=32767_i16)));
bencher.iter(|| mask16x16_add(bits, a, b))
});
}
criterion_group!(benches, bench_mask_from_bits);
criterion_main!(benches);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment