From e52d51cd45230068a98e5e809dabf1671bc6d630 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 25 May 2021 20:00:01 -0500 Subject: [PATCH 01/14] nbody example --- crates/core_simd/examples/nbody.rs | 188 +++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 crates/core_simd/examples/nbody.rs diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs new file mode 100644 index 000000000000..a474bbe39259 --- /dev/null +++ b/crates/core_simd/examples/nbody.rs @@ -0,0 +1,188 @@ +use stdsimd::simd::*; + +use std::f64::consts::PI; +const SOLAR_MASS: f64 = 4.0 * PI * PI; +const DAYS_PER_YEAR: f64 = 365.24; + +pub struct Body { + pub x: f64x4, + pub v: f64x4, + pub mass: f64, +} +const N_BODIES: usize = 5; +#[allow(clippy::unreadable_literal)] +const BODIES: [Body; N_BODIES] = [ + // sun: + Body { + x: f64x4::new(0., 0., 0., 0.), + v: f64x4::new(0., 0., 0., 0.), + mass: SOLAR_MASS, + }, + // jupiter: + Body { + x: f64x4::new( + 4.84143144246472090e+00, + -1.16032004402742839e+00, + -1.03622044471123109e-01, + 0., + ), + v: f64x4::new( + 1.66007664274403694e-03 * DAYS_PER_YEAR, + 7.69901118419740425e-03 * DAYS_PER_YEAR, + -6.90460016972063023e-05 * DAYS_PER_YEAR, + 0., + ), + mass: 9.54791938424326609e-04 * SOLAR_MASS, + }, + // saturn: + Body { + x: f64x4::new( + 8.34336671824457987e+00, + 4.12479856412430479e+00, + -4.03523417114321381e-01, + 0., + ), + v: f64x4::new( + -2.76742510726862411e-03 * DAYS_PER_YEAR, + 4.99852801234917238e-03 * DAYS_PER_YEAR, + 2.30417297573763929e-05 * DAYS_PER_YEAR, + 0., + ), + mass: 2.85885980666130812e-04 * SOLAR_MASS, + }, + // uranus: + Body { + x: f64x4::new( + 1.28943695621391310e+01, + -1.51111514016986312e+01, + -2.23307578892655734e-01, + 0., + ), + v: f64x4::new( + 2.96460137564761618e-03 * DAYS_PER_YEAR, + 2.37847173959480950e-03 * DAYS_PER_YEAR, + -2.96589568540237556e-05 * DAYS_PER_YEAR, + 0., + ), + mass: 4.36624404335156298e-05 * SOLAR_MASS, + }, + // neptune: + Body { + x: f64x4::new( + 1.53796971148509165e+01, + -2.59193146099879641e+01, + 1.79258772950371181e-01, + 0., + ), + v: f64x4::new( + 2.68067772490389322e-03 * DAYS_PER_YEAR, + 1.62824170038242295e-03 * DAYS_PER_YEAR, + -9.51592254519715870e-05 * DAYS_PER_YEAR, + 0., + ), + mass: 5.15138902046611451e-05 * SOLAR_MASS, + }, +]; + +pub fn offset_momentum(bodies: &mut [Body; N_BODIES]) { + let (sun, rest) = bodies.split_at_mut(1); + let sun = &mut sun[0]; + for body in rest { + let m_ratio = body.mass / SOLAR_MASS; + sun.v -= body.v * m_ratio; + } +} + +pub fn energy(bodies: &[Body; N_BODIES]) -> f64 { + let mut e = 0.; + for i in 0..N_BODIES { + let bi = &bodies[i]; + e += bi.mass * (bi.v * bi.v).sum() * 0.5; + for bj in bodies.iter().take(N_BODIES).skip(i + 1) { + let dx = bi.x - bj.x; + e -= bi.mass * bj.mass / (dx * dx).sum().sqrt() + } + } + e +} + +pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { + const N: usize = N_BODIES * (N_BODIES - 1) / 2; + + // compute distance between bodies: + let mut r = [f64x4::splat(0.); N]; + { + let mut i = 0; + for j in 0..N_BODIES { + for k in j + 1..N_BODIES { + r[i] = bodies[j].x - bodies[k].x; + i += 1; + } + } + } + + let mut mag = [0.0; N]; + let mut i = 0; + while i < N { + let d2s = f64x2::new((r[i] * r[i]).sum(), (r[i + 1] * r[i + 1]).sum()); + let dmags = f64x2::splat(dt) / (d2s * d2s.sqrte()); + dmags.write_to_slice_unaligned(&mut mag[i..]); + i += 2; + } + + i = 0; + for j in 0..N_BODIES { + for k in j + 1..N_BODIES { + let f = r[i] * mag[i]; + bodies[j].v -= f * bodies[k].mass; + bodies[k].v += f * bodies[j].mass; + i += 1 + } + } + for body in bodies { + body.x += dt * body.v + } +} + +pub fn run_k(n: usize, k: K) -> (f64, f64) +where + K: Fn(&mut [Body; N_BODIES], f64), +{ + let mut bodies = BODIES; + offset_momentum(&mut bodies); + let energy_before = energy(&bodies); + for _ in 0..n { + k(&mut bodies, 0.01); + } + let energy_after = energy(&bodies); + + (energy_before, energy_after) +} + +pub fn run(n: usize) -> (f64, f64) { + run_k(n, advance) +} + +const OUTPUT: Vec = vec![-0.169075164, -0.169087605]; +#[cfg(test)] +mod tests { + #[test] + fn test() { + let mut out: Vec = Vec::new(); + run(&mut out, 1000, 0); + for &(size, a_e, b_e) in crate::RESULTS { + let (a, b) = super::run(size); + assert_eq!(format!("{:.9}", a), a_e); + assert_eq!(format!("{:.9}", b), b_e); + } + } +} +fn main() { + //let n: usize = std::env::args() + //.nth(1) + //.expect("need one arg") + //.parse() + //.expect("argument should be a usize"); + //run(&mut std::io::stdout(), n, alg); + println!("{:?}", run_k<10>(10, 10)); +} From 2591c59ba75f812329c44078b31b3ca140d01055 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 25 May 2021 20:07:20 -0500 Subject: [PATCH 02/14] fix imports --- crates/core_simd/examples/nbody.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index a474bbe39259..4ca371f44569 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -1,4 +1,5 @@ -use stdsimd::simd::*; +#![feature(platform_intrinsics, repr_simd)] +use core_simd::*; use std::f64::consts::PI; const SOLAR_MASS: f64 = 4.0 * PI * PI; From ab6af37f8f9ba27df1cf24789a7c3f50bf3005cf Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 25 May 2021 20:10:55 -0500 Subject: [PATCH 03/14] Simdf64 from attempt --- crates/core_simd/examples/nbody.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 4ca371f44569..cbdcf848fee3 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -5,11 +5,16 @@ use std::f64::consts::PI; const SOLAR_MASS: f64 = 4.0 * PI * PI; const DAYS_PER_YEAR: f64 = 365.24; +#[derive(Debug)] +#[repr(simd)] pub struct Body { - pub x: f64x4, - pub v: f64x4, + pub x: Simdf64([f64, 4]), + pub v: Simdf64([f64, 4]), pub mass: f64, } + +// Translation attempt is this ^^^ far +// const N_BODIES: usize = 5; #[allow(clippy::unreadable_literal)] const BODIES: [Body; N_BODIES] = [ From 8bea3627cb6f4c9378908599a146e8896034d793 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 25 May 2021 21:25:42 -0500 Subject: [PATCH 04/14] replace sum() with horizontal_sum() --- crates/core_simd/examples/nbody.rs | 56 ++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index cbdcf848fee3..93d4c902a4d0 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -5,87 +5,85 @@ use std::f64::consts::PI; const SOLAR_MASS: f64 = 4.0 * PI * PI; const DAYS_PER_YEAR: f64 = 365.24; -#[derive(Debug)] -#[repr(simd)] +#[derive(Debug, Clone, Copy)] pub struct Body { - pub x: Simdf64([f64, 4]), - pub v: Simdf64([f64, 4]), + pub x: f64x4, + pub v: f64x4, pub mass: f64, } -// Translation attempt is this ^^^ far -// +// translation up to here const N_BODIES: usize = 5; #[allow(clippy::unreadable_literal)] const BODIES: [Body; N_BODIES] = [ // sun: Body { - x: f64x4::new(0., 0., 0., 0.), - v: f64x4::new(0., 0., 0., 0.), + x: f64x4::from_array([0., 0., 0., 0.]), + v: f64x4::from_array([0., 0., 0., 0.]), mass: SOLAR_MASS, }, // jupiter: Body { - x: f64x4::new( + x: f64x4::from_array([ 4.84143144246472090e+00, -1.16032004402742839e+00, -1.03622044471123109e-01, 0., - ), - v: f64x4::new( + ]), + v: f64x4::from_array([ 1.66007664274403694e-03 * DAYS_PER_YEAR, 7.69901118419740425e-03 * DAYS_PER_YEAR, -6.90460016972063023e-05 * DAYS_PER_YEAR, 0., - ), + ]), mass: 9.54791938424326609e-04 * SOLAR_MASS, }, // saturn: Body { - x: f64x4::new( + x: f64x4::from_array([ 8.34336671824457987e+00, 4.12479856412430479e+00, -4.03523417114321381e-01, 0., - ), - v: f64x4::new( + ]), + v: f64x4::from_array([ -2.76742510726862411e-03 * DAYS_PER_YEAR, 4.99852801234917238e-03 * DAYS_PER_YEAR, 2.30417297573763929e-05 * DAYS_PER_YEAR, 0., - ), + ]), mass: 2.85885980666130812e-04 * SOLAR_MASS, }, // uranus: Body { - x: f64x4::new( + x: f64x4::from_array([ 1.28943695621391310e+01, -1.51111514016986312e+01, -2.23307578892655734e-01, 0., - ), - v: f64x4::new( + ]), + v: f64x4::from_array([ 2.96460137564761618e-03 * DAYS_PER_YEAR, 2.37847173959480950e-03 * DAYS_PER_YEAR, -2.96589568540237556e-05 * DAYS_PER_YEAR, 0., - ), + ]), mass: 4.36624404335156298e-05 * SOLAR_MASS, }, // neptune: Body { - x: f64x4::new( + x: f64x4::from_array([ 1.53796971148509165e+01, -2.59193146099879641e+01, 1.79258772950371181e-01, 0., - ), - v: f64x4::new( + ]), + v: f64x4::from_array([ 2.68067772490389322e-03 * DAYS_PER_YEAR, 1.62824170038242295e-03 * DAYS_PER_YEAR, -9.51592254519715870e-05 * DAYS_PER_YEAR, 0., - ), + ]), mass: 5.15138902046611451e-05 * SOLAR_MASS, }, ]; @@ -103,10 +101,10 @@ pub fn energy(bodies: &[Body; N_BODIES]) -> f64 { let mut e = 0.; for i in 0..N_BODIES { let bi = &bodies[i]; - e += bi.mass * (bi.v * bi.v).sum() * 0.5; + e += bi.mass * (bi.v * bi.v).horizontal_sum() * 0.5; for bj in bodies.iter().take(N_BODIES).skip(i + 1) { let dx = bi.x - bj.x; - e -= bi.mass * bj.mass / (dx * dx).sum().sqrt() + e -= bi.mass * bj.mass / (dx * dx).horizontal_sum().sqrt() } } e @@ -130,8 +128,8 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { let mut mag = [0.0; N]; let mut i = 0; while i < N { - let d2s = f64x2::new((r[i] * r[i]).sum(), (r[i + 1] * r[i + 1]).sum()); - let dmags = f64x2::splat(dt) / (d2s * d2s.sqrte()); + let d2s = f64x2::from_array([(r[i] * r[i]).horizontal_sum(), (r[i + 1] * r[i + 1]).horizontal_sum()]); + let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt()); dmags.write_to_slice_unaligned(&mut mag[i..]); i += 2; } @@ -190,5 +188,5 @@ fn main() { //.parse() //.expect("argument should be a usize"); //run(&mut std::io::stdout(), n, alg); - println!("{:?}", run_k<10>(10, 10)); + println!("{:?}", run_k::<10>(10, 10)); } From 3c05ceec70a3463a86ab5481b345e550c892641b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Raz=20Guzm=C3=A1n=20Macedo?= Date: Mon, 31 May 2021 18:03:55 -0500 Subject: [PATCH 05/14] Update crates/core_simd/examples/nbody.rs Co-authored-by: Jubilee <46493976+workingjubilee@users.noreply.github.com> --- crates/core_simd/examples/nbody.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 93d4c902a4d0..1d97b6b3ad2e 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -1,4 +1,3 @@ -#![feature(platform_intrinsics, repr_simd)] use core_simd::*; use std::f64::consts::PI; From 83dc5b782b01637be5ba661752ba06da84587277 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 12:09:11 -0500 Subject: [PATCH 06/14] don't need clippy --- crates/core_simd/examples/nbody.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 1d97b6b3ad2e..27e4634c9d29 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -13,7 +13,6 @@ pub struct Body { // translation up to here const N_BODIES: usize = 5; -#[allow(clippy::unreadable_literal)] const BODIES: [Body; N_BODIES] = [ // sun: Body { From 56050562f1be867c65f38a94498e3ddfda5759a7 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 12:15:37 -0500 Subject: [PATCH 07/14] don't use turbofish on run --- crates/core_simd/examples/nbody.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 27e4634c9d29..87bdcf4e7c80 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -186,5 +186,5 @@ fn main() { //.parse() //.expect("argument should be a usize"); //run(&mut std::io::stdout(), n, alg); - println!("{:?}", run_k::<10>(10, 10)); + println!("{:?}", run(10)); } From f24110aa5b59ecbaf457f73b3a3b1560b416322d Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 12:26:29 -0500 Subject: [PATCH 08/14] collapse run_k into run --- crates/core_simd/examples/nbody.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 87bdcf4e7c80..bf045737f82e 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -146,25 +146,18 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { } } -pub fn run_k(n: usize, k: K) -> (f64, f64) -where - K: Fn(&mut [Body; N_BODIES], f64), -{ +pub fn run(n: usize) -> (f64, f64) { let mut bodies = BODIES; offset_momentum(&mut bodies); let energy_before = energy(&bodies); for _ in 0..n { - k(&mut bodies, 0.01); + advance(&mut bodies, 0.01); } let energy_after = energy(&bodies); (energy_before, energy_after) } -pub fn run(n: usize) -> (f64, f64) { - run_k(n, advance) -} - const OUTPUT: Vec = vec![-0.169075164, -0.169087605]; #[cfg(test)] mod tests { From 5557907098d0c9269d6d6643ead23d9877ee63ab Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 15:25:56 -0500 Subject: [PATCH 09/14] rewrite unaligned slice, fix output const array --- crates/core_simd/examples/nbody.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index bf045737f82e..4fdc02263976 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -128,7 +128,9 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { while i < N { let d2s = f64x2::from_array([(r[i] * r[i]).horizontal_sum(), (r[i + 1] * r[i + 1]).horizontal_sum()]); let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt()); - dmags.write_to_slice_unaligned(&mut mag[i..]); + // dmags.write_to_slice_unaligned(&mut mag[i..]); + mag[i] = dmags[0]; + mag[i+1] = dmags[1]; i += 2; } @@ -146,6 +148,12 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { } } +// #[inline] +// pub unsafe fn write_to_slice_unaligned(slice: &mut SimdF64::) { +// let target_ptr = slice.get_unchecked_mut(0) as *mut f64x2; +// *(target_ptr as *mut f64x2) = SimdF64; +// } + pub fn run(n: usize) -> (f64, f64) { let mut bodies = BODIES; offset_momentum(&mut bodies); @@ -158,7 +166,7 @@ pub fn run(n: usize) -> (f64, f64) { (energy_before, energy_after) } -const OUTPUT: Vec = vec![-0.169075164, -0.169087605]; +const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; #[cfg(test)] mod tests { #[test] @@ -172,6 +180,8 @@ mod tests { } } } + + fn main() { //let n: usize = std::env::args() //.nth(1) From 4e86aeb7f9f9c16a3b7d43b7124ae6885bc9b71e Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 19:31:34 -0500 Subject: [PATCH 10/14] finish nbody --- crates/core_simd/examples/nbody.rs | 39 ++++++++++++++---------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 4fdc02263976..5873f311947e 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -1,3 +1,6 @@ +/// Benchmarks game nbody code +/// Taken from the `packed_simd` crate +/// Run this benchmark with `cargo test --example body` use core_simd::*; use std::f64::consts::PI; @@ -126,11 +129,14 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { let mut mag = [0.0; N]; let mut i = 0; while i < N { - let d2s = f64x2::from_array([(r[i] * r[i]).horizontal_sum(), (r[i + 1] * r[i + 1]).horizontal_sum()]); + let d2s = f64x2::from_array([ + (r[i] * r[i]).horizontal_sum(), + (r[i + 1] * r[i + 1]).horizontal_sum(), + ]); let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt()); // dmags.write_to_slice_unaligned(&mut mag[i..]); mag[i] = dmags[0]; - mag[i+1] = dmags[1]; + mag[i + 1] = dmags[1]; i += 2; } @@ -166,28 +172,19 @@ pub fn run(n: usize) -> (f64, f64) { (energy_before, energy_after) } -const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; +fn approx_eq_f32(a: f32, b: f32) -> bool { + (a - b).abs() < 0.00000001 +} + #[cfg(test)] mod tests { #[test] fn test() { - let mut out: Vec = Vec::new(); - run(&mut out, 1000, 0); - for &(size, a_e, b_e) in crate::RESULTS { - let (a, b) = super::run(size); - assert_eq!(format!("{:.9}", a), a_e); - assert_eq!(format!("{:.9}", b), b_e); - } + use super::*; + const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; + let (energy_before, energy_after) = super::run(1000); + assert!(approx_eq_f32(energy_before as f32, OUTPUT[0] as f32)); + assert!(approx_eq_f32(energy_after as f32, OUTPUT[1] as f32)); + // } } } - - -fn main() { - //let n: usize = std::env::args() - //.nth(1) - //.expect("need one arg") - //.parse() - //.expect("argument should be a usize"); - //run(&mut std::io::stdout(), n, alg); - println!("{:?}", run(10)); -} From 70305c5fad7da367d1ff2c443076c378a70b6a0d Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 19:46:48 -0500 Subject: [PATCH 11/14] add main to avoid CI crash --- crates/core_simd/examples/nbody.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 5873f311947e..9ddf49b4e116 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -188,3 +188,7 @@ mod tests { // } } } + +fn main () { + // empty main to pass CI +} From c042f33673bb298c889b10d91c7bed2db1df0cc2 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Tue, 1 Jun 2021 20:05:30 -0500 Subject: [PATCH 12/14] clean up code, fudge approx true --- crates/core_simd/examples/nbody.rs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 9ddf49b4e116..0bad0c2d5579 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -14,7 +14,6 @@ pub struct Body { pub mass: f64, } -// translation up to here const N_BODIES: usize = 5; const BODIES: [Body; N_BODIES] = [ // sun: @@ -134,7 +133,6 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { (r[i + 1] * r[i + 1]).horizontal_sum(), ]); let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt()); - // dmags.write_to_slice_unaligned(&mut mag[i..]); mag[i] = dmags[0]; mag[i + 1] = dmags[1]; i += 2; @@ -154,12 +152,6 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { } } -// #[inline] -// pub unsafe fn write_to_slice_unaligned(slice: &mut SimdF64::) { -// let target_ptr = slice.get_unchecked_mut(0) as *mut f64x2; -// *(target_ptr as *mut f64x2) = SimdF64; -// } - pub fn run(n: usize) -> (f64, f64) { let mut bodies = BODIES; offset_momentum(&mut bodies); @@ -172,8 +164,9 @@ pub fn run(n: usize) -> (f64, f64) { (energy_before, energy_after) } -fn approx_eq_f32(a: f32, b: f32) -> bool { - (a - b).abs() < 0.00000001 +// Good enough for demonstration purposes, not going for strictness here. +fn approx_eq_f64(a: f64, b: f64) -> bool { + (a - b).abs() < 0.00001 } #[cfg(test)] @@ -183,9 +176,8 @@ mod tests { use super::*; const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; let (energy_before, energy_after) = super::run(1000); - assert!(approx_eq_f32(energy_before as f32, OUTPUT[0] as f32)); - assert!(approx_eq_f32(energy_after as f32, OUTPUT[1] as f32)); - // } + assert!(approx_eq_f64(energy_before, OUTPUT[0])); + assert!(approx_eq_f64(energy_after, OUTPUT[1])); } } From 435d1cf7a6985696291048e3b5f2bf7e1b63aa32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Raz=20Guzm=C3=A1n=20Macedo?= Date: Fri, 4 Jun 2021 10:40:39 -0500 Subject: [PATCH 13/14] Update crates/core_simd/examples/nbody.rs Co-authored-by: Jubilee <46493976+workingjubilee@users.noreply.github.com> --- crates/core_simd/examples/nbody.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 0bad0c2d5579..0aad4935f3a9 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -1,6 +1,6 @@ /// Benchmarks game nbody code -/// Taken from the `packed_simd` crate -/// Run this benchmark with `cargo test --example body` +/// Taken from the `packed_simd` crate +/// Run this benchmark with `cargo test --example nbody` use core_simd::*; use std::f64::consts::PI; From be121c93ffc443a82735321edd793ef1e3ee3a00 Mon Sep 17 00:00:00 2001 From: miguel raz Date: Fri, 4 Jun 2021 10:54:08 -0500 Subject: [PATCH 14/14] clean code vis. Jubilee's comments --- crates/core_simd/examples/nbody.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/crates/core_simd/examples/nbody.rs b/crates/core_simd/examples/nbody.rs index 0aad4935f3a9..44e1c6e87d0e 100644 --- a/crates/core_simd/examples/nbody.rs +++ b/crates/core_simd/examples/nbody.rs @@ -126,8 +126,7 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { } let mut mag = [0.0; N]; - let mut i = 0; - while i < N { + for i in (0..N).step_by(2) { let d2s = f64x2::from_array([ (r[i] * r[i]).horizontal_sum(), (r[i + 1] * r[i + 1]).horizontal_sum(), @@ -135,10 +134,9 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) { let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt()); mag[i] = dmags[0]; mag[i + 1] = dmags[1]; - i += 2; } - i = 0; + let mut i = 0; for j in 0..N_BODIES { for k in j + 1..N_BODIES { let f = r[i] * mag[i]; @@ -164,16 +162,14 @@ pub fn run(n: usize) -> (f64, f64) { (energy_before, energy_after) } -// Good enough for demonstration purposes, not going for strictness here. -fn approx_eq_f64(a: f64, b: f64) -> bool { - (a - b).abs() < 0.00001 -} - #[cfg(test)] mod tests { + // Good enough for demonstration purposes, not going for strictness here. + fn approx_eq_f64(a: f64, b: f64) -> bool { + (a - b).abs() < 0.00001 + } #[test] fn test() { - use super::*; const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; let (energy_before, energy_after) = super::run(1000); assert!(approx_eq_f64(energy_before, OUTPUT[0])); @@ -181,6 +177,6 @@ mod tests { } } -fn main () { +fn main() { // empty main to pass CI }