Use cfg_if for the nbody example
Avoid the combinatorial explosion once we add support for additional architectures and simd flavours.
This commit is contained in:
parent
5ef15cd71f
commit
2b6148d623
1 changed files with 24 additions and 18 deletions
|
|
@ -10,8 +10,13 @@
|
|||
shadow_reuse, print_stdout))]
|
||||
|
||||
extern crate stdsimd;
|
||||
#[macro_use]
|
||||
extern crate cfg_if;
|
||||
|
||||
use stdsimd::simd::*;
|
||||
|
||||
|
||||
|
||||
const PI: f64 = std::f64::consts::PI;
|
||||
const SOLAR_MASS: f64 = 4.0 * PI * PI;
|
||||
const DAYS_PER_YEAR: f64 = 365.24;
|
||||
|
|
@ -20,16 +25,15 @@ pub trait Frsqrt {
|
|||
fn frsqrt(&self) -> Self;
|
||||
}
|
||||
|
||||
impl Frsqrt for f64x2 {
|
||||
fn frsqrt(&self) -> Self {
|
||||
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),
|
||||
target_feature = "sse"))]
|
||||
{
|
||||
cfg_if! {
|
||||
if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),
|
||||
target_feature = "sse"))] {
|
||||
fn frsqrt(s: &f64x2) -> f64x2 {
|
||||
#[cfg(target_arch = "x86")]
|
||||
use stdsimd::arch::x86::*;
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use stdsimd::arch::x86_64::*;
|
||||
let t: f32x2 = (*self).into();
|
||||
let t: f32x2 = (*s).into();
|
||||
|
||||
let u: f64x4 = unsafe {
|
||||
let res = _mm_rsqrt_ps(_mm_setr_ps(
|
||||
|
|
@ -40,32 +44,34 @@ impl Frsqrt for f64x2 {
|
|||
));
|
||||
f32x4::from_bits(res).into()
|
||||
};
|
||||
Self::new(u.extract(0), u.extract(1))
|
||||
f64x2::new(u.extract(0), u.extract(1))
|
||||
}
|
||||
#[cfg(all(target_arch = "aarch64", target_feature = "neon"))]
|
||||
{
|
||||
} else if #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] {
|
||||
fn frsqrt(s: &f64x2) -> f64x2 {
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
use stdsimd::arch::aarch64::*;
|
||||
#[cfg(target_arch = "arm")]
|
||||
use stdsimd::arch::arm::*;
|
||||
|
||||
let t: f32x2 = (*self).into();
|
||||
let t: f32x2 = (*s).into();
|
||||
let t: f32x2 = unsafe { vrsqrte_f32(t.into_bits()).into_bits() };
|
||||
t.into()
|
||||
}
|
||||
#[cfg(not(any(all(any(target_arch = "x86",
|
||||
target_arch = "x86_64"),
|
||||
target_feature = "sse"),
|
||||
all(target_arch = "aarch64",
|
||||
target_feature = "neon"))))]
|
||||
{
|
||||
let r = self.replace(0, 1. / self.extract(0).sqrt());
|
||||
let r = r.replace(1, 1. / self.extract(1).sqrt());
|
||||
} else {
|
||||
fn frsqrt(s: &f64x2) -> f64x2 {
|
||||
let r = s.replace(0, 1. / s.extract(0).sqrt());
|
||||
let r = r.replace(1, 1. / s.extract(1).sqrt());
|
||||
r
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Frsqrt for f64x2 {
|
||||
fn frsqrt(&self) -> Self {
|
||||
frsqrt(self)
|
||||
}
|
||||
}
|
||||
|
||||
struct Body {
|
||||
x: [f64; 3],
|
||||
_fill: f64,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue