pub struct Atomic<'a, T: ?Sized> { /* private fields */ }Expand description
To prevent the user from mixing use of Atomic operation and chunk-based access, we wrap the reference to the data to be modified in an Atomic struct. ensuring that the user cannot access the data without using atomic operations. If user wants to repurpose the data for non-atomic access, they need to drop the Atomic struct first and need a sync across all blocks. For now, sync across all blocks is not supported, we should reject such code in analysis. TODO: Avoid repurposing data for atomic or chunk-based access.
Implementations§
Source§impl<'a, T: ?Sized> Atomic<'a, T>
Atomic read-modify-write operation with kind defined in
MLIR memref::atomic_rmw
impl<'a, T: ?Sized> Atomic<'a, T>
Atomic read-modify-write operation with kind defined in MLIR memref::atomic_rmw
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_addf(&self, val: T) -> Twhere
T: Float,
pub fn atomic_addf(&self, val: T) -> Twhere
T: Float,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::AddF]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_addi(&self, val: T) -> Twhere
T: PrimInt,
pub fn atomic_addi(&self, val: T) -> Twhere
T: PrimInt,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::AddI]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_assign(&self, val: T) -> Twhere
T: Num,
pub fn atomic_assign(&self, val: T) -> Twhere
T: Num,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::Assign]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_maximumf(&self, val: T) -> Twhere
T: Float,
pub fn atomic_maximumf(&self, val: T) -> Twhere
T: Float,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MaximumF]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_maxs(&self, val: T) -> Twhere
T: Signed,
pub fn atomic_maxs(&self, val: T) -> Twhere
T: Signed,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MaxS]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_maxu(&self, val: T) -> Twhere
T: Unsigned,
pub fn atomic_maxu(&self, val: T) -> Twhere
T: Unsigned,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MaxU]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_minimumf(&self, val: T) -> Twhere
T: Float,
pub fn atomic_minimumf(&self, val: T) -> Twhere
T: Float,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MinimumF]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_mins(&self, val: T) -> Twhere
T: Signed,
pub fn atomic_mins(&self, val: T) -> Twhere
T: Signed,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MinS]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_minu(&self, val: T) -> Twhere
T: Unsigned,
pub fn atomic_minu(&self, val: T) -> Twhere
T: Unsigned,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MinU]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_mulf(&self, val: T) -> Twhere
T: Float,
pub fn atomic_mulf(&self, val: T) -> Twhere
T: Float,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MulF]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_muli(&self, val: T) -> Twhere
T: PrimInt,
pub fn atomic_muli(&self, val: T) -> Twhere
T: PrimInt,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::MulI]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_ori(&self, val: T) -> Twhere
T: PrimInt,
pub fn atomic_ori(&self, val: T) -> Twhere
T: PrimInt,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::OrI]>
Source§impl<'a, T: Num> Atomic<'a, T>
impl<'a, T: Num> Atomic<'a, T>
Sourcepub fn atomic_andi(&self, val: T) -> Twhere
T: PrimInt,
pub fn atomic_andi(&self, val: T) -> Twhere
T: PrimInt,
Equivalent to: atomic_rmw::<[Atomic<'a, T>::AndI]>