|
| 1 | +/// Benchmarks game nbody code |
| 2 | +/// Taken from the `packed_simd` crate |
| 3 | +/// Run this benchmark with `cargo test --example body` |
1 | 4 | use core_simd::*;
|
2 | 5 |
|
3 | 6 | use std::f64::consts::PI;
|
@@ -126,11 +129,14 @@ pub fn advance(bodies: &mut [Body; N_BODIES], dt: f64) {
|
126 | 129 | let mut mag = [0.0; N];
|
127 | 130 | let mut i = 0;
|
128 | 131 | while i < N {
|
129 |
| - let d2s = f64x2::from_array([(r[i] * r[i]).horizontal_sum(), (r[i + 1] * r[i + 1]).horizontal_sum()]); |
| 132 | + let d2s = f64x2::from_array([ |
| 133 | + (r[i] * r[i]).horizontal_sum(), |
| 134 | + (r[i + 1] * r[i + 1]).horizontal_sum(), |
| 135 | + ]); |
130 | 136 | let dmags = f64x2::splat(dt) / (d2s * d2s.sqrt());
|
131 | 137 | // dmags.write_to_slice_unaligned(&mut mag[i..]);
|
132 | 138 | mag[i] = dmags[0];
|
133 |
| - mag[i+1] = dmags[1]; |
| 139 | + mag[i + 1] = dmags[1]; |
134 | 140 | i += 2;
|
135 | 141 | }
|
136 | 142 |
|
@@ -166,28 +172,19 @@ pub fn run(n: usize) -> (f64, f64) {
|
166 | 172 | (energy_before, energy_after)
|
167 | 173 | }
|
168 | 174 |
|
169 |
| -const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; |
| 175 | +fn approx_eq_f32(a: f32, b: f32) -> bool { |
| 176 | + (a - b).abs() < 0.00000001 |
| 177 | +} |
| 178 | + |
170 | 179 | #[cfg(test)]
|
171 | 180 | mod tests {
|
172 | 181 | #[test]
|
173 | 182 | fn test() {
|
174 |
| - let mut out: Vec<u8> = Vec::new(); |
175 |
| - run(&mut out, 1000, 0); |
176 |
| - for &(size, a_e, b_e) in crate::RESULTS { |
177 |
| - let (a, b) = super::run(size); |
178 |
| - assert_eq!(format!("{:.9}", a), a_e); |
179 |
| - assert_eq!(format!("{:.9}", b), b_e); |
180 |
| - } |
| 183 | + use super::*; |
| 184 | + const OUTPUT: [f64; 2] = [-0.169075164, -0.169087605]; |
| 185 | + let (energy_before, energy_after) = super::run(1000); |
| 186 | + assert!(approx_eq_f32(energy_before as f32, OUTPUT[0] as f32)); |
| 187 | + assert!(approx_eq_f32(energy_after as f32, OUTPUT[1] as f32)); |
| 188 | + // } |
181 | 189 | }
|
182 | 190 | }
|
183 |
| - |
184 |
| - |
185 |
| -fn main() { |
186 |
| - //let n: usize = std::env::args() |
187 |
| - //.nth(1) |
188 |
| - //.expect("need one arg") |
189 |
| - //.parse() |
190 |
| - //.expect("argument should be a usize"); |
191 |
| - //run(&mut std::io::stdout(), n, alg); |
192 |
| - println!("{:?}", run(10)); |
193 |
| -} |
0 commit comments