cubecl_runtime/server/
handle.rs1use cubecl_common::stream_id::StreamId;
2use cubecl_zspace::{Shape, Strides};
3
4use crate::{
5 memory_management::{ManagedMemoryBinding, ManagedMemoryHandle},
6 server::CopyDescriptor,
7};
8
9pub struct Handle {
11 pub memory: ManagedMemoryHandle,
13 pub offset_start: Option<u64>,
15 pub offset_end: Option<u64>,
17 pub stream: StreamId,
19 pub(crate) size: u64,
21}
22
23impl core::fmt::Debug for Handle {
24 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25 f.debug_struct("Handle")
26 .field("id", &self.memory)
27 .field("offset_start", &self.offset_start)
28 .field("offset_end", &self.offset_end)
29 .field("stream", &self.stream)
30 .field("size", &self.size)
31 .finish()
32 }
33}
34
35impl Clone for Handle {
36 fn clone(&self) -> Self {
37 Self {
38 memory: self.memory.clone(),
39 offset_start: self.offset_start,
40 offset_end: self.offset_end,
41 stream: self.stream,
42 size: self.size,
43 }
44 }
45}
46
47impl Handle {
48 pub fn from_memory(id: ManagedMemoryHandle, stream: StreamId, size: u64) -> Self {
50 Self {
51 memory: id,
52 offset_start: None,
53 offset_end: None,
54 stream,
55 size,
56 }
57 }
58 pub fn new(stream: StreamId, size: u64) -> Self {
60 Self {
61 memory: ManagedMemoryHandle::new(),
62 offset_start: None,
63 offset_end: None,
64 stream,
65 size,
66 }
67 }
68 pub fn can_mut(&self) -> bool {
70 self.memory.can_mut()
71 }
72
73 pub fn binding(self) -> Binding {
75 Binding {
76 memory: self.memory.binding(),
77 offset_start: self.offset_start,
78 offset_end: self.offset_end,
79 stream: self.stream,
80 size: self.size,
81 }
82 }
83
84 pub fn offset_start(mut self, offset: u64) -> Self {
86 if let Some(val) = &mut self.offset_start {
87 *val += offset;
88 } else {
89 self.offset_start = Some(offset);
90 }
91
92 self
93 }
94 pub fn offset_end(mut self, offset: u64) -> Self {
96 if let Some(val) = &mut self.offset_end {
97 *val += offset;
98 } else {
99 self.offset_end = Some(offset);
100 }
101
102 self
103 }
104
105 pub fn copy_descriptor(
107 self,
108 shape: Shape,
109 strides: Strides,
110 elem_size: usize,
111 ) -> CopyDescriptor {
112 CopyDescriptor {
113 shape,
114 strides,
115 elem_size,
116 handle: self.binding(),
117 }
118 }
119 pub fn size_in_used(&self) -> u64 {
121 self.size - self.offset_start.unwrap_or(0) - self.offset_end.unwrap_or(0)
122 }
123 pub fn size(&self) -> u64 {
125 self.size
126 }
127}
128
129#[derive(Clone, Debug)]
138pub struct Binding {
139 pub memory: ManagedMemoryBinding,
141 pub offset_start: Option<u64>,
143 pub offset_end: Option<u64>,
145 pub stream: StreamId,
147 pub size: u64,
149}
150
151impl Binding {
152 pub fn size_in_used(&self) -> u64 {
154 self.size - self.offset_start.unwrap_or(0) - self.offset_end.unwrap_or(0)
155 }
156 pub fn size(&self) -> u64 {
158 self.size
159 }
160}