cubecl_runtime/channel/base.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
use core::future::Future;
use cubecl_common::benchmark::TimestampsResult;
use crate::{
server::{Binding, ComputeServer, CubeCount, Handle},
storage::BindingResource,
ExecutionMode,
};
use alloc::vec::Vec;
/// The ComputeChannel trait links the ComputeClient to the ComputeServer
/// while ensuring thread-safety
pub trait ComputeChannel<Server: ComputeServer>: Clone + core::fmt::Debug + Send + Sync {
/// Given a binding, returns owned resource as bytes
fn read(&self, binding: Binding) -> impl Future<Output = Vec<u8>> + Send;
/// Given a resource handle, return the storage resource.
fn get_resource(&self, binding: Binding) -> BindingResource<Server>;
/// Given a resource as bytes, stores it and returns the resource handle
fn create(&self, data: &[u8]) -> Handle;
/// Reserves `size` bytes in the storage, and returns a handle over them
fn empty(&self, size: usize) -> Handle;
/// Executes the `kernel` over the given `bindings`.
///
/// # Safety
///
/// When executing with mode [ExecutionMode::Unchecked], out-of-bound reads and writes can happen.
unsafe fn execute(
&self,
kernel: Server::Kernel,
count: CubeCount,
bindings: Vec<Binding>,
mode: ExecutionMode,
);
/// Flush outstanding work of the server.
fn flush(&self);
/// Wait for the completion of every task in the server.
fn sync(&self) -> impl Future<Output = ()> + Send;
/// Wait for the completion of every task in the server.
///
/// Returns the (approximate) total amount of GPU work done since the last sync.
fn sync_elapsed(&self) -> impl Future<Output = TimestampsResult> + Send;
/// Get the current memory usage of the server.
fn memory_usage(&self) -> crate::memory_management::MemoryUsage;
/// Enable collecting timestamps.
fn enable_timestamps(&self);
/// Disable collecting timestamps.
fn disable_timestamps(&self);
}