pub struct AtomicLockStats {Show 16 fields
pub contrib_wait_ns: AtomicU64,
pub contrib_hold_ns: AtomicU64,
pub node_factors_wait_ns: AtomicU64,
pub node_factors_hold_ns: AtomicU64,
pub factor_body_ns: AtomicU64,
pub task_wall_ns: AtomicU64,
pub ws_lock_wait_ns: AtomicU64,
pub n_tasks: AtomicU64,
pub phase_scaling_ns: AtomicU64,
pub phase_permute_ns: AtomicU64,
pub phase_symmetric_pattern_ns: AtomicU64,
pub phase_tree_setup_ns: AtomicU64,
pub phase_thread_ws_ns: AtomicU64,
pub phase_leaves_ns: AtomicU64,
pub phase_scope_ns: AtomicU64,
pub phase_collect_ns: AtomicU64,
}Expand description
Lock-contention + phase telemetry for the rayon-parallel
multifrontal driver. Atomic fields aggregate across worker
threads via fetch_add. Driver-phase fields are written once by
the calling thread and use atomics only for uniformity (no
contention there). Snapshot via snapshot() after the factor
returns. See NumericParams::parallel_telemetry.
Fields§
§contrib_wait_ns: AtomicU64Cumulative time spent waiting to acquire contrib_blocks.
contrib_hold_ns: AtomicU64Cumulative time spent holding contrib_blocks (excluding wait).
node_factors_wait_ns: AtomicU64Cumulative time spent waiting to acquire node_factors_out.
node_factors_hold_ns: AtomicU64Cumulative time spent holding node_factors_out (excluding wait).
factor_body_ns: AtomicU64Cumulative time spent inside factor_one_supernode itself,
excluding the lock brackets above. Aggregated across workers,
so on an 8-thread run this can exceed wall time by ~8×.
task_wall_ns: AtomicU64Cumulative wall time of the entire scope.spawn(...) closure
body across all tasks (includes lock waits, factor_body, and
per-task control flow like the snode lookup, fast-exit check,
pending-decrement, and recursive spawn). Aggregated across
workers. Compute task_wall_agg / T to compare against
phase_scope_ns: the gap is rayon idle (worker waiting for an
eligible task) or scope spawn/join overhead.
ws_lock_wait_ns: AtomicU64Cumulative wait time on the per-worker
Mutex<FactorWorkspace>. Expected to be near zero (each
worker has its own slot); non-zero values mean rayon scheduled
two tasks onto the same worker queue before the first finished
(an event that would also imply a worker idle elsewhere).
n_tasks: AtomicU64Number of parallel tasks executed.
phase_scaling_ns: AtomicU64compute_scaling_with_cache + scaling_pivot_order build.
phase_permute_ns: AtomicU64permute_csc_values (P·A·Pᵀ rebuild).
phase_symmetric_pattern_ns: AtomicU64permuted.symmetric_pattern().
phase_tree_setup_ns: AtomicU64is_root + parents + pending atomic counters +
contrib_blocks / node_factors_out mutex setup.
phase_thread_ws_ns: AtomicU64Per-worker FactorWorkspace provisioning, including
local_contribs.resize_with(n_snodes, ...).
phase_leaves_ns: AtomicU64Leaves collection (single linear pass over supernodes).
phase_scope_ns: AtomicU64The rayon::scope itself — sums to the parallel hot-loop
wall time plus rayon overhead. Compare against
factor_body_ns / T to see worker utilization.
phase_collect_ns: AtomicU64Final epilogue: node_factors_out.into_inner() + the
postorder iteration that builds final_nodes and aggregates
inertia.
Implementations§
Source§impl AtomicLockStats
impl AtomicLockStats
pub fn snapshot(&self) -> ParallelLockStats
Trait Implementations§
Source§impl Debug for AtomicLockStats
impl Debug for AtomicLockStats
Source§impl Default for AtomicLockStats
impl Default for AtomicLockStats
Source§fn default() -> AtomicLockStats
fn default() -> AtomicLockStats
Auto Trait Implementations§
impl !Freeze for AtomicLockStats
impl RefUnwindSafe for AtomicLockStats
impl Send for AtomicLockStats
impl Sync for AtomicLockStats
impl Unpin for AtomicLockStats
impl UnsafeUnpin for AtomicLockStats
impl UnwindSafe for AtomicLockStats
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
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>
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>
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