diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2021-10-04 23:56:17 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-04 23:56:17 -0700 |
| commit | dd223d5c6da0cfa822151dd706bb14dc1476e4dd (patch) | |
| tree | dded31dd3b09e1ff1fd88e6c9f15244056ff7129 | |
| parent | 7a09755148c4b1543f25862e785e04834feb8b61 (diff) | |
| parent | ce450f893d551e25123e0bdb27acc9a85d15cb7f (diff) | |
| download | rust-dd223d5c6da0cfa822151dd706bb14dc1476e4dd.tar.gz rust-dd223d5c6da0cfa822151dd706bb14dc1476e4dd.zip | |
Rollup merge of #88651 - AGSaidi:monotonize-inner-64b-aarch64, r=dtolnay
Use the 64b inner:monotonize() implementation not the 128b one for aarch64 aarch64 prior to v8.4 (FEAT_LSE2) doesn't have an instruction that guarantees untorn 128b reads except for completing a 128b load/store exclusive pair (ldxp/stxp) or compare-and-swap (casp) successfully. The requirement to complete a 128b read+write atomic is actually more expensive and more unfair than the previous implementation of monotonize() which used a Mutex on aarch64, especially at large core counts. For aarch64 switch to the 64b atomic implementation which is about 13x faster for a benchmark that involves many calls to Instant::now().
| -rw-r--r-- | library/std/src/time/monotonic.rs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/library/std/src/time/monotonic.rs b/library/std/src/time/monotonic.rs index 198ae739b55..64f16245c2b 100644 --- a/library/std/src/time/monotonic.rs +++ b/library/std/src/time/monotonic.rs @@ -5,7 +5,7 @@ pub(super) fn monotonize(raw: time::Instant) -> time::Instant { inner::monotonize(raw) } -#[cfg(all(target_has_atomic = "64", not(target_has_atomic = "128")))] +#[cfg(any(all(target_has_atomic = "64", not(target_has_atomic = "128")), target_arch = "aarch64"))] pub mod inner { use crate::sync::atomic::AtomicU64; use crate::sync::atomic::Ordering::*; @@ -71,7 +71,7 @@ pub mod inner { } } -#[cfg(target_has_atomic = "128")] +#[cfg(all(target_has_atomic = "128", not(target_arch = "aarch64")))] pub mod inner { use crate::sync::atomic::AtomicU128; use crate::sync::atomic::Ordering::*; |
