pub struct ProfileEntry {
pub op: OpKind,
pub dtype: DType,
pub size_class: SizeClass,
pub backend: BackendId,
pub device_index: u32,
pub latency_ns: u64,
pub iterations: u32,
pub max_rel_error: f32,
pub kernel_source: String,
pub kernel_revision_hash: u64,
pub device: EquivalenceKey,
}Expand description
Single (op_kind, dtype, size_class) × (backend, device_index, kernel_source) datum produced by one measurement run.
Per-alternative measurement (2026-06-08): kernel_source
distinguishes kernels that register at the same
(op, dtypes, backend) decision point in the binding table —
AOCL vs MKL vs portable-cpu, cuBLAS vs CUTLASS, etc. Each
sibling alternative produces its own ProfileEntry; the
dispatch table picks the best entry per cell across both
backends and kernel_sources. Default empty string preserves the
pre-v2 shape for kernels that don’t need to distinguish.
Fields§
§op: OpKind§dtype: DType§size_class: SizeClass§backend: BackendId§device_index: u32§latency_ns: u64Median wall-clock time per invocation over iterations.
iterations: u32Number of timed iterations that produced latency_ns.
max_rel_error: f32Max relative element-wise error vs the reference backend’s output on the same input.
kernel_source: StringDiagnostic tag identifying which kernel sibling produced this
measurement when multiple alternatives register at the same
(op, dtypes, backend) binding-table key. Mirrors
BindingEntry::kernel_source (in fuel-dispatch). "" is
the pre-v2 default for kernels that don’t need to distinguish;
conventional values include "portable-cpu", "aocl",
"mkl", "cublas", "cutlass".
Owned String (not &'static str) so the field round-trips
through serde — deserialized reports can’t carry borrowed
data with a 'static lifetime. The producer-side Judge
converts from BindingEntry::kernel_source: &'static str
via .to_string() at measurement time.
kernel_revision_hash: u64Content-derived revision of the exact kernel build that produced
this measurement. Mirrors BindingEntry::kernel_revision_hash
(fuel-dispatch) and the FKC ledger key’s kernel_revision_hash;
with kernel_source it completes Fuel’s canonical kernel identity
ImplId = (backend, op, dtypes, kernel_source, kernel_revision_hash).
kernel_source is provider-granular ("cublas", "baracuda", …);
kernel_revision_hash is variant-granular — forty tilings of one
provider emit forty distinct source strings and forty distinct
content-derived hashes, so they no longer collapse into one Judge
cell. 0 means “untracked” (the pre-v5 default and the value test
fixtures use when the axis is irrelevant); the Judge keys on it, so
two DISTINCT non-zero revisions occupy two distinct cells.
device: EquivalenceKeyThe hardware identity this measurement was taken on — the
EquivalenceKey of the profiled
device: (backend, vendor_id, device_id, compute_capability, driver_version). A ProfileReport is one Judge run on ONE machine.
device_index above is a within-run ORDINAL that rebinds across boots
and under CUDA_VISIBLE_DEVICES, so it is NOT a portable identity —
worse than none, because it answers confidently for a different
physical device. The ordinal is retained for within-run indexing; this
field is what ProfileReport::load validates against the loading
machine’s hardware, so a report written on a 4070 Laptop is REFUSED on
a Radeon VII instead of loading and mis-ranking. backend here always
equals the sibling backend field above (checked on ingest).
#[serde(default)] supplies a sentinel identity ONLY so a pre-v5
report — which lacks this field — still deserializes and is then
rejected by the version gate; the sentinel matches no real device (see
default_device_identity).
Trait Implementations§
Source§impl Clone for ProfileEntry
impl Clone for ProfileEntry
Source§fn clone(&self) -> ProfileEntry
fn clone(&self) -> ProfileEntry
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ProfileEntry
impl Debug for ProfileEntry
Source§impl<'de> Deserialize<'de> for ProfileEntry
impl<'de> Deserialize<'de> for ProfileEntry
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<ProfileEntry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<ProfileEntry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for ProfileEntry
impl PartialEq for ProfileEntry
Source§impl Serialize for ProfileEntry
impl Serialize for ProfileEntry
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 ProfileEntry
Auto Trait Implementations§
impl Freeze for ProfileEntry
impl RefUnwindSafe for ProfileEntry
impl Send for ProfileEntry
impl Sync for ProfileEntry
impl Unpin for ProfileEntry
impl UnsafeUnpin for ProfileEntry
impl UnwindSafe for ProfileEntry
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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