pub struct FpuGuard { /* private fields */ }Expand description
RAII guard that protects a computation from dangerous FPU settings
On creation:
- Triggers one-time FPU check and warning (if not already done)
- If FZ or DAZ is enabled, disables them temporarily
On drop:
- Restores the original FPU state
§Example
use sparse_ir::fpu_check::{FpuGuard, get_fpu_state};
let before = get_fpu_state();
{
let _guard = FpuGuard::new_protect_computation();
// Computation here - FZ/DAZ are disabled
assert!(!get_fpu_state().is_dangerous());
let subnormal = std::hint::black_box(f64::MIN_POSITIVE) / 2.0;
assert!(subnormal > 0.0); // not flushed to zero
} // Original FPU state is restored here
let after = get_fpu_state();
assert_eq!(after.flush_to_zero, before.flush_to_zero);
assert_eq!(after.denormals_are_zero, before.denormals_are_zero);§Performance
The overhead is negligible (a few CPU cycles for stmxcsr/ldmxcsr).
Implementations§
Source§impl FpuGuard
impl FpuGuard
Sourcepub fn new_protect_computation() -> Self
pub fn new_protect_computation() -> Self
Create a new guard that protects computation from FZ/DAZ
- Triggers one-time warning if dangerous FPU settings are detected
- Temporarily disables FZ/DAZ if they are enabled
- Restores original state when dropped
Sourcepub fn was_modified(&self) -> bool
pub fn was_modified(&self) -> bool
Check if the guard needed to modify FPU state
Trait Implementations§
Auto Trait Implementations§
impl Freeze for FpuGuard
impl RefUnwindSafe for FpuGuard
impl Send for FpuGuard
impl Sync for FpuGuard
impl Unpin for FpuGuard
impl UnsafeUnpin for FpuGuard
impl UnwindSafe for FpuGuard
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more