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
impl Kernels
Sourcepub fn keyed<K>(self) -> KeyedKernels<K>
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.
Sourcepub fn new(compiler: Compiler) -> Self
pub fn new(compiler: Compiler) -> Self
An empty cache over a compiler. Clone it to share one cache.
Sourcepub fn reporting(
self,
report: impl Fn(&Artifact) + Send + Sync + 'static,
) -> Self
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.
Sourcepub unsafe fn get(
&self,
stream: &Stream,
source: &str,
spec: &Specialization,
) -> Result<Kernel>
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.
Sourcepub fn request(&self, source: &str, spec: &Specialization) -> Result<Pending>
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.
Sourcepub unsafe fn build(&self, stream: &Stream) -> Result<()>
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§
Auto Trait Implementations§
impl Freeze for Kernels
impl RefUnwindSafe for Kernels
impl Send for Kernels
impl Sync for Kernels
impl Unpin for Kernels
impl UnsafeUnpin for Kernels
impl UnwindSafe for Kernels
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DropFlavorWrapper<T> for T
impl<T> DropFlavorWrapper<T> for T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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