pub struct FusedKernelRegistry { /* private fields */ }Expand description
Kernel-side registry: FusedOpId → list of per-backend
BackendImpls. Joined to fuel-graph’s metadata-side
fuel_graph::registry::FusedOpRegistry by id at runtime.
Built at process startup, frozen thereafter (architecture v1.0: no runtime extensibility).
Implementations§
Source§impl FusedKernelRegistry
impl FusedKernelRegistry
pub fn new() -> Self
Sourcepub fn register(
&mut self,
id: FusedOpId,
backend: BackendId,
impl_: BackendImpl,
)
pub fn register( &mut self, id: FusedOpId, backend: BackendId, impl_: BackendImpl, )
Register a BackendImpl for this (id, backend) pair. Always
appends — multiple impls per (id, backend) are allowed (per-
dtype registrations, alternative algorithms at the same dtype,
etc.). The route picker filters by BackendImpl::dtypes and
ranks remaining alternatives at lookup time.
Sourcepub fn lookup(&self, id: FusedOpId, backend: BackendId) -> Option<BackendImpl>
pub fn lookup(&self, id: FusedOpId, backend: BackendId) -> Option<BackendImpl>
Look up the first BackendImpl registered for (id, backend)
regardless of dtypes. Convenience for callers that already know
a single impl exists for the pair. Prefer
Self::lookup_by_dtypes when multiple per-dtype impls may
share a backend.
Sourcepub fn lookup_by_dtypes(
&self,
id: FusedOpId,
backend: BackendId,
dtypes: &[DType],
) -> Option<BackendImpl>
pub fn lookup_by_dtypes( &self, id: FusedOpId, backend: BackendId, dtypes: &[DType], ) -> Option<BackendImpl>
Look up the BackendImpl registered for (id, backend, dtypes). Returns None when no kernel matches all three; the
optimizer’s fallback in that case is to lower the fused op via
the metadata-side decompose and run it as primitives on the
backend.
When multiple impls match (alternatives at the same decision point — e.g. cuBLAS vs CUTLASS bf16 matmul), the first registration wins. Step 9’s route picker replaces this with a cost-aware selector.
Sourcepub fn impls_for(&self, id: FusedOpId) -> &[(BackendId, BackendImpl)]
pub fn impls_for(&self, id: FusedOpId) -> &[(BackendId, BackendImpl)]
All (BackendId, BackendImpl) pairs registered for this id.
The optimizer reads this when deciding placement: a fused op
with a CUDA-only kernel limits its placement candidates.
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Number of distinct FusedOpIds with at least one registered
backend impl.
Sourcepub fn record_bundle_slot_names(
&mut self,
id: FusedOpId,
backend: BackendId,
dtypes: &[DType],
names: &[String],
)
pub fn record_bundle_slot_names( &mut self, id: FusedOpId, backend: BackendId, dtypes: &[DType], names: &[String], )
Finding 5.4 (FKC side, Task 3.6): record a fused contract’s
return.bundle per-slot names against the (id, backend, dtypes)
key it was registered under. Overwrites any prior entry at the same
key (re-import is idempotent, mirroring register’s append
semantics at the registration level — the side-table itself has no
duplicate-detection gate).
Sourcepub fn bundle_slot_names(
&self,
id: FusedOpId,
backend: BackendId,
dtypes: &[DType],
) -> Option<&[String]>
pub fn bundle_slot_names( &self, id: FusedOpId, backend: BackendId, dtypes: &[DType], ) -> Option<&[String]>
Look up the per-slot names recorded by Self::record_bundle_slot_names
for (id, backend, dtypes). None when no bundle names were ever
recorded for that exact key (including a single-output section,
which never calls record_bundle_slot_names in the first place).
Trait Implementations§
Auto Trait Implementations§
impl Freeze for FusedKernelRegistry
impl RefUnwindSafe for FusedKernelRegistry
impl Send for FusedKernelRegistry
impl Sync for FusedKernelRegistry
impl Unpin for FusedKernelRegistry
impl UnsafeUnpin for FusedKernelRegistry
impl UnwindSafe for FusedKernelRegistry
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> 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