Skip to content

Instantly share code, notes, and snippets.

@sanxiyn
Created July 19, 2013 17:29
Show Gist options
  • Save sanxiyn/6040905 to your computer and use it in GitHub Desktop.
Save sanxiyn/6040905 to your computer and use it in GitHub Desktop.
SIMD sum
extern mod extra;
fn test_vector() -> ~[f32] {
let mut v = ~[];
for std::uint::range(0, 64) |i| {
v.push(i as f32);
}
v
}
fn sum(v: &[f32]) -> f32 {
let mut sum = 0f32;
for v.iter().advance |vi| {
sum += *vi;
}
sum
}
#[bench]
fn bench_sum(b: &mut extra::test::BenchHarness) {
let v = test_vector();
do b.iter() {
sum(v);
}
}
#[simd]
struct f32x4(f32, f32, f32, f32);
fn simd_sum(v: &[f32]) -> f32 {
let mut sum = f32x4(0f32, 0f32, 0f32, 0f32);
do v.as_imm_buf |mut p, mut len| {
while len > 0 {
let vv: f32x4 = unsafe { *std::cast::transmute::<*f32, *f32x4>(p) };
sum += vv;
p = p + 4;
len -= 4;
}
}
let f32x4(v1, v2, v3, v4) = sum;
v1 + v2 + v3 + v4
}
#[bench]
fn bench_simd_sum(b: &mut extra::test::BenchHarness) {
let v = test_vector();
do b.iter() {
simd_sum(v);
}
}
fn main() {
let v = test_vector();
println(fmt!("%?", sum(v)));
println(fmt!("%?", simd_sum(v)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment