pub struct e5m2(/* private fields */);Expand description
A 8-bit floating point type with 5 exponent bits and 2 mantissa bits.
Follows table 1 of FP8 Formats for Deep Learning. Unlike
e4m3, E5M2 keeps IEEE 754 conventions: infinities at S.11111.00 and NaN at
S.11111.{01,10,11}, so six of its 256 encodings are NaN.
MAX, MIN, is_nan, MAX_EXP and MANTISSA_DIGITS are spelled out here rather than
delegated to float8, each for the reason given on the item itself. Every other constant
delegates and agrees.
See also the minifloat overview.
Implementations§
Source§impl e5m2
impl e5m2
Sourcepub const MAX: e5m2
pub const MAX: e5m2
Maximum representable value, S.11110.11 = 1.75 * 2^15 = 57344.
Not taken from F8E5M2::MAX, which is 49152 and one representable step low. E5M2 follows
IEEE conventions and puts its first infinity at S.11111.00, so 0x7B is finite. See
table 1 of “FP8 Formats for Deep Learning” (arXiv:2209.05433), which also matches what
from_f32 saturates to and what QuantValue::E5M2 bounds against.
Sourcepub const MIN_POSITIVE: e5m2
pub const MIN_POSITIVE: e5m2
Minimum representable value
Sourcepub const MANTISSA_DIGITS: u32 = 3
pub const MANTISSA_DIGITS: u32 = 3
Sourcepub const MAX_10_EXP: i32 = F8E5M2::MAX_10_EXP
pub const MAX_10_EXP: i32 = F8E5M2::MAX_10_EXP
Maximum possible normal power of 10 exponent
Sourcepub const MAX_EXP: i32 = 16
pub const MAX_EXP: i32 = 16
One greater than the maximum possible normal power of 2 exponent, matching f32::MAX_EXP.
MAX is 1.75 * 2^15, so this is 16. F8E5M2::MAX_EXP is 15, not adding the one
that f32 and half::f16 do.
Sourcepub const MIN_10_EXP: i32 = F8E5M2::MIN_10_EXP
pub const MIN_10_EXP: i32 = F8E5M2::MIN_10_EXP
Minimum possible normal power of 10 exponent
Sourcepub const fn from_f32(value: f32) -> e5m2
pub const fn from_f32(value: f32) -> e5m2
Constructs a e5m2 value from a 32-bit floating point value.
This operation is lossy. Values too large to fit, infinities included, saturate to
±MAX rather than reaching this format’s own infinity. NaN values are
preserved. Subnormal values that are too tiny to be represented will result in ±0. All
other values are truncated and rounded to the nearest representable value.
Sourcepub const fn from_f64(value: f64) -> e5m2
pub const fn from_f64(value: f64) -> e5m2
Constructs a e5m2 value from a 64-bit floating point value.
This operation is lossy. Values too large to fit, infinities included, saturate to
±MAX rather than reaching this format’s own infinity. NaN values are
preserved. 64-bit subnormal values are too tiny to be represented and result in ±0.
Exponents that underflow the minimum exponent will result in subnormals or ±0. All other
values are truncated and rounded to the nearest representable value.
Sourcepub fn is_nan(self) -> bool
pub fn is_nan(self) -> bool
check if an e5m2 value is Nan
All six S.11111.{01,10,11} encodings, rather than float8’s two.
Trait Implementations§
Source§impl Abs for e5m2
impl Abs for e5m2
fn abs(self) -> Self
fn __expand_abs(scope: &Scope, x: NativeExpand<Self>) -> NativeExpand<Self>
Source§impl AbsNativeExpand for e5m2
impl AbsNativeExpand for e5m2
fn __expand_native_abs(scope: &Scope, input: ExpandValue) -> ExpandValue
Source§impl AddAssign for e5m2
impl AddAssign for e5m2
Source§fn add_assign(&mut self, rhs: e5m2)
fn add_assign(&mut self, rhs: e5m2)
+= operation. Read moreimpl Copy for e5m2
Source§impl CubeDebug for e5m2
impl CubeDebug for e5m2
Source§fn set_debug_name(&self, scope: &Scope, name: &'static str)
fn set_debug_name(&self, scope: &Scope, name: &'static str)
Source§impl CubeElement for e5m2
impl CubeElement for e5m2
Source§fn from_bytes(bytes: &[u8]) -> &[Self]
fn from_bytes(bytes: &[u8]) -> &[Self]
Source§fn maximum_value() -> Self
fn maximum_value() -> Self
Source§fn minimum_value() -> Self
fn minimum_value() -> Self
Source§impl CubePrimitive for e5m2
impl CubePrimitive for e5m2
type Scalar = e5m2
type Size = Const<1>
type WithScalar<S: Scalar> = S
fn __expand_as_type(scope: &Scope) -> TypeHandle
fn from_const_value(value: ConstantValue) -> Self
Source§fn as_type() -> TypeHandle
fn as_type() -> TypeHandle
fn from_expand_elem(elem: ExpandValue) -> Self::ExpandType
fn into_lit_unchecked(self) -> Self
fn packing_factor() -> usize
fn vector_size() -> usize
fn __expand_size(scope: &Scope) -> usize
fn __expand_size_bits(scope: &Scope) -> usize
fn __expand_packing_factor(scope: &Scope) -> usize
fn __expand_vector_size(scope: &Scope) -> usize
Source§impl CubeType for e5m2
impl CubeType for e5m2
type ExpandType = NativeExpand<e5m2>
Source§impl<'de> Deserialize<'de> for e5m2
impl<'de> Deserialize<'de> for e5m2
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<e5m2, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<e5m2, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl DivAssign for e5m2
impl DivAssign for e5m2
Source§fn div_assign(&mut self, rhs: e5m2)
fn div_assign(&mut self, rhs: e5m2)
/= operation. Read moreSource§impl FloatBits for e5m2
impl FloatBits for e5m2
type Bits = u8
fn __expand_from_bits( scope: &Scope, bits: NativeExpand<Self::Bits>, ) -> NativeExpand<Self>
fn __expand_to_bits( scope: &Scope, this: NativeExpand<Self>, ) -> NativeExpand<Self::Bits>
Source§impl IntoExpand for e5m2
impl IntoExpand for e5m2
type Expand = NativeExpand<e5m2>
fn into_expand(self, _scope: &Scope) -> Self::Expand
Source§impl IntoRuntime for e5m2
impl IntoRuntime for e5m2
fn __expand_runtime_method(self, _scope: &Scope) -> NativeExpand<Self>
fn runtime(self) -> Self
Source§impl MulAssign for e5m2
impl MulAssign for e5m2
Source§fn mul_assign(&mut self, rhs: e5m2)
fn mul_assign(&mut self, rhs: e5m2)
*= operation. Read moreSource§impl NativeAssign for e5m2
impl NativeAssign for e5m2
fn elem_init_mut(scope: &Scope, elem: ExpandValue) -> ExpandValue
Source§impl Num for e5m2
impl Num for e5m2
Source§impl PartialEqNativeExpand for e5m2
impl PartialEqNativeExpand for e5m2
fn __expand_native_eq( scope: &Scope, lhs: ExpandValue, rhs: ExpandValue, ) -> ExpandValue
fn __expand_native_ne( scope: &Scope, lhs: ExpandValue, rhs: ExpandValue, ) -> ExpandValue
Source§impl PartialOrd for e5m2
impl PartialOrd for e5m2
impl Pod for e5m2
Source§impl RemAssign for e5m2
impl RemAssign for e5m2
Source§fn rem_assign(&mut self, rhs: e5m2)
fn rem_assign(&mut self, rhs: e5m2)
%= operation. Read moreSource§impl Serialize for e5m2
impl Serialize for e5m2
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl StructuralPartialEq for e5m2
Source§impl SubAssign for e5m2
impl SubAssign for e5m2
Source§fn sub_assign(&mut self, rhs: e5m2)
fn sub_assign(&mut self, rhs: e5m2)
-= operation. Read moreSource§impl ToPrimitive for e5m2
impl ToPrimitive for e5m2
Source§fn to_i64(&self) -> Option<i64>
fn to_i64(&self) -> Option<i64>
self to an i64. If the value cannot be
represented by an i64, then None is returned.Source§fn to_u64(&self) -> Option<u64>
fn to_u64(&self) -> Option<u64>
self to a u64. If the value cannot be
represented by a u64, then None is returned.Source§fn to_f32(&self) -> Option<f32>
fn to_f32(&self) -> Option<f32>
self to an f32. Overflows may map to positive
or negative inifinity, otherwise None is returned if the value cannot
be represented by an f32.Source§fn to_f64(&self) -> Option<f64>
fn to_f64(&self) -> Option<f64>
self to an f64. Overflows may map to positive
or negative inifinity, otherwise None is returned if the value cannot
be represented by an f64. Read moreSource§fn to_isize(&self) -> Option<isize>
fn to_isize(&self) -> Option<isize>
self to an isize. If the value cannot be
represented by an isize, then None is returned.Source§fn to_i8(&self) -> Option<i8>
fn to_i8(&self) -> Option<i8>
self to an i8. If the value cannot be
represented by an i8, then None is returned.Source§fn to_i16(&self) -> Option<i16>
fn to_i16(&self) -> Option<i16>
self to an i16. If the value cannot be
represented by an i16, then None is returned.Source§fn to_i32(&self) -> Option<i32>
fn to_i32(&self) -> Option<i32>
self to an i32. If the value cannot be
represented by an i32, then None is returned.Source§fn to_i128(&self) -> Option<i128>
fn to_i128(&self) -> Option<i128>
self to an i128. If the value cannot be
represented by an i128 (i64 under the default implementation), then
None is returned. Read moreSource§fn to_usize(&self) -> Option<usize>
fn to_usize(&self) -> Option<usize>
self to a usize. If the value cannot be
represented by a usize, then None is returned.Source§fn to_u8(&self) -> Option<u8>
fn to_u8(&self) -> Option<u8>
self to a u8. If the value cannot be
represented by a u8, then None is returned.Source§fn to_u16(&self) -> Option<u16>
fn to_u16(&self) -> Option<u16>
self to a u16. If the value cannot be
represented by a u16, then None is returned.Auto Trait Implementations§
impl Freeze for e5m2
impl RefUnwindSafe for e5m2
impl Send for e5m2
impl Sync for e5m2
impl Unpin for e5m2
impl UnsafeUnpin for e5m2
impl UnwindSafe for e5m2
Blanket Implementations§
impl<T> AnyBitPattern for Twhere
T: Pod,
Source§impl<T> Assign for Twhere
T: CubePrimitive,
impl<T> Assign for Twhere
T: CubePrimitive,
Source§fn __expand_assign_method(&mut self, _scope: &Scope, value: T)
fn __expand_assign_method(&mut self, _scope: &Scope, value: T)
value to self in scope.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
impl<T> CanReadValue for T
Source§impl<P> Cast for Pwhere
P: CubePrimitive,
impl<P> Cast for Pwhere
P: CubePrimitive,
fn cast_from<From>(_value: From) -> Pwhere
From: CubePrimitive,
fn __expand_cast_from<From: CubePrimitive>( scope: &Scope, value: NativeExpand<From>, ) -> <Self as CubeType>::ExpandType
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
Source§type Bits = T
type Bits = T
Self must have the same layout as the specified Bits except for
the possible invalid bit patterns being checked during
is_valid_bit_pattern.Source§fn is_valid_bit_pattern(_bits: &T) -> bool
fn is_valid_bit_pattern(_bits: &T) -> bool
bits
as &Self.Source§impl<T> CloneExpand for Twhere
T: Clone,
impl<T> CloneExpand for Twhere
T: Clone,
fn __expand_clone_method(&self, _: &Scope) -> T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> CubePartialEq for Twhere
T: PartialEq + CubePrimitive + IntoExpand<Expand = <T as CubeType>::ExpandType>,
<T as CubePrimitive>::Scalar: PartialEqNativeExpand,
impl<T> CubePartialEq for Twhere
T: PartialEq + CubePrimitive + IntoExpand<Expand = <T as CubeType>::ExpandType>,
<T as CubePrimitive>::Scalar: PartialEqNativeExpand,
fn __expand_eq_method( &self, scope: &Scope, rhs: &NativeExpand<Self>, ) -> NativeExpand<bool>
fn __expand_ne_method( &self, scope: &Scope, rhs: &NativeExpand<Self>, ) -> NativeExpand<bool>
fn __expand_eq( scope: &Scope, lhs: &NativeExpand<Self>, rhs: &NativeExpand<Self>, ) -> NativeExpand<bool>
fn __expand_ne( scope: &Scope, lhs: &NativeExpand<Self>, rhs: &NativeExpand<Self>, ) -> NativeExpand<bool>
Source§impl<T> DefaultExpand for T
impl<T> DefaultExpand for T
fn __expand_default(scope: &Scope) -> <T as CubeType>::ExpandType
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for 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 moreimpl<T> NativeCubeType for T
impl<T> NoUninit for Twhere
T: Pod,
impl<T> NumAssign for Twhere
T: Num + NumAssignOps,
impl<T, Rhs> NumAssignOps<Rhs> for T
impl<T, Rhs, Output> NumOps<Rhs, Output> for T
Source§impl<T> OneExpand for T
impl<T> OneExpand for T
fn __expand_one(scope: &Scope) -> <T as CubeType>::ExpandType
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<P> Reinterpret for Pwhere
P: CubePrimitive,
impl<P> Reinterpret for Pwhere
P: CubePrimitive,
Source§fn reinterpret<From: CubePrimitive>(value: From) -> Self
fn reinterpret<From: CubePrimitive>(value: From) -> Self
Source§fn reinterpret_vectorization<From: CubePrimitive>() -> usize
fn reinterpret_vectorization<From: CubePrimitive>() -> usize
fn __expand_reinterpret<From: CubePrimitive>( scope: &Scope, value: NativeExpand<From>, ) -> <Self as CubeType>::ExpandType
fn __expand_reinterpret_vectorization<From: CubePrimitive>( scope: &Scope, ) -> usize
Source§impl<T> RuntimeAssign for T
impl<T> RuntimeAssign for T
Source§fn init_mut(&self, scope: &Scope) -> NativeExpand<T>
fn init_mut(&self, scope: &Scope) -> NativeExpand<T>
scope.impl<T> ScalarAbs for Twhere
T: Abs + AbsNativeExpand,
Source§impl<E> ScalarArgSettings for Ewhere
E: ScalarArgType,
impl<E> ScalarArgSettings for Ewhere
E: ScalarArgType,
Source§fn register<R>(&self, launcher: &mut KernelLauncher<R>)where
R: Runtime,
fn register<R>(&self, launcher: &mut KernelLauncher<R>)where
R: Runtime,
KernelLauncher.