Skip to main content

Kernels

Struct Kernels 

Source
pub struct Kernels(/* private fields */);
Expand description

Loaded kernels, keyed by the artifact their specialization compiles to.

The compiler already caches compilation on disk. This caches the loaded executable, which is what a dispatch loop needs: turning a cached artifact into a crate::gpu::Kernel is a native load every time, and a model that dispatches the same kernel per block would pay it per block. Every consumer of this crate wrote this cache, so it lives here instead.

The key is the artifact’s own identity — the same digest the disk cache uses — rather than whatever the caller derived a request from, so two requests that compile to the same artifact share one executable.

Kernels are device-scoped, so a cache serves one device and refuses another.

Implementations§

Source§

impl Kernels

Source

pub fn keyed<K>(self) -> KeyedKernels<K>

Index this cache by a caller’s compact request key.

Source hashing and specialization construction happen only on a key miss. Distinct caller keys that name the same artifact still share one loaded executable. Include every input that changes the source or specialization in the key.

Source

pub fn new(compiler: Compiler) -> Self

An empty cache over a compiler. Clone it to share one cache.

Source

pub fn reporting( self, report: impl Fn(&Artifact) + Send + Sync + 'static, ) -> Self

Call report with each artifact as it is built, once, before it loads.

A cache that returned only kernels would swallow what the compiler said about them: warnings, and the backend remarks that are the only warning a kernel is spilling registers. Cache hits report nothing, having built nothing. Installing a reporter updates every clone and existing pending handle. An invocation already in progress may finish using the previous reporter. The callback must not build or resolve requests on this same cache.

Source

pub fn compiler(&self) -> &Compiler

The compiler these were built with.

Source

pub fn len(&self) -> usize

How many kernels are loaded.

Source

pub fn is_empty(&self) -> bool

Whether any kernel is loaded.

Source

pub unsafe fn get( &self, stream: &Stream, source: &str, spec: &Specialization, ) -> Result<Kernel>

Compile spec from source if needed and load it, or return the loaded kernel. Outstanding Kernels::requests are left alone.

§Safety

source must be trusted Loom: its compiled output is loaded as native code, as for crate::Stream::load_artifact.

Source

pub fn request(&self, source: &str, spec: &Specialization) -> Result<Pending>

Ask for a kernel without building it. Nothing is compiled until Kernels::build or the first Pending::resolve, and then every outstanding request is built at once across the compiler’s workspaces — so a consumer can name its whole set first and pay for it in one batch.

Source

pub unsafe fn build(&self, stream: &Stream) -> Result<()>

Build every outstanding request, in one batch. Concurrent builds wait for the active batch before checking for more work.

§Safety

As Kernels::get, for every source passed to Kernels::request.

Trait Implementations§

Source§

impl Clone for Kernels

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Kernels

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DropFlavorWrapper<T> for T

Source§

type Flavor = MayDrop

The DropFlavor that wraps T into Self
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<E> ResultError for E
where E: Send + Debug + Sync,

Source§

impl<T> ResultType for T
where T: Send + Clone + Sync + Debug,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more