]> git.lizzy.rs Git - rust.git/commitdiff
finish nbody
authormiguel raz <miguelraz@gmail.com>
Wed, 2 Jun 2021 00:31:34 +0000 (19:31 -0500)
committermiguel raz <miguelraz@gmail.com>
Wed, 2 Jun 2021 00:31:34 +0000 (19:31 -0500)
crates/core_simd/examples/nbody.rs

index 4fdc02263976c56711d40e62ae042e855a3e84e5..5873f311947e71b49f4811bd34fcb747462a3732 100644 (file)
@@ -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 struct Body {
     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<u8> = 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));
-}