cubecl_std/tensor/view/operations/
slice.rs1use super::*;
2use crate::tensor::layout::Coords1d;
3use cubecl::prelude::*;
4use cubecl_core::{self as cubecl, io::read_masked, prelude::barrier::BarrierExpand};
5
6impl<T: CubePrimitive, IO: SliceVisibility> ViewOperations<T, Coords1d> for Slice<T, IO> {}
7impl<T: CubePrimitive, IO: SliceVisibility> ViewOperationsExpand<T, Coords1d>
8 for SliceExpand<T, IO>
9{
10 fn __expand_read_method(
11 &self,
12 scope: &mut Scope,
13 pos: ExpandElementTyped<u32>,
14 ) -> <T>::ExpandType {
15 <Self as ListExpand<T>>::__expand_read_method(self, scope, pos)
16 }
17
18 fn __expand_read_checked_method(
19 &self,
20 scope: &mut Scope,
21 pos: ExpandElementTyped<u32>,
22 ) -> <T>::ExpandType {
23 let len = self.__expand_len_method(scope);
24 let in_bounds = lt::expand(scope, pos.clone(), len);
25 let slice = self.clone().__expand_to_slice_method(scope);
26 let zero = T::__expand_cast_from(scope, 0.into());
27 read_masked::expand::<T>(scope, in_bounds, slice, pos, zero)
28 }
29
30 fn __expand_read_masked_method(
31 &self,
32 scope: &mut Scope,
33 pos: ExpandElementTyped<u32>,
34 mask_value: <T>::ExpandType,
35 ) -> <T>::ExpandType {
36 let len = self.__expand_len_method(scope);
37 let in_bounds = lt::expand(scope, pos.clone(), len);
38 let slice = self.clone().__expand_to_slice_method(scope);
39 read_masked::expand::<T>(scope, in_bounds, slice, pos, mask_value)
40 }
41
42 fn __expand_read_unchecked_method(
43 &self,
44 scope: &mut Scope,
45 pos: ExpandElementTyped<u32>,
46 ) -> <T>::ExpandType {
47 <Self as ListExpand<T>>::__expand_read_unchecked_method(self, scope, pos)
48 }
49
50 fn __expand_to_linear_slice_method(
51 &self,
52 scope: &mut Scope,
53 pos: ExpandElementTyped<u32>,
54 end: ExpandElementTyped<u32>,
55 ) -> SliceExpand<T, ReadOnly> {
56 let end = add::expand(scope, end, 1u32.into());
58 let start = Min::__expand_min(scope, pos, end.clone());
61 <Self as SliceOperatorExpand<T>>::__expand_slice_method(self, scope, start, end)
62 }
63
64 fn __expand_shape_method(&self, scope: &mut Scope) -> ExpandElementTyped<u32> {
65 <Self as ListExpand<T>>::__expand_len_method(self, scope)
66 }
67
68 fn __expand_is_in_bounds_method(
69 &self,
70 scope: &mut Scope,
71 pos: ExpandElementTyped<u32>,
72 ) -> ExpandElementTyped<bool> {
73 let len = self.__expand_shape_method(scope);
74 lt::expand(scope, pos, len)
75 }
76
77 fn __expand_tensor_map_load_method(
78 &self,
79 _scope: &mut Scope,
80 _barrier: BarrierExpand,
81 _shared_memory: SliceExpand<T, ReadWrite>,
82 _pos: ExpandElementTyped<u32>,
83 ) {
84 unimplemented!("Not a tensor map");
85 }
86}
87
88impl<T: CubePrimitive> ViewOperationsMut<T, Coords1d> for Slice<T, ReadWrite> {}
89impl<T: CubePrimitive> ViewOperationsMutExpand<T, Coords1d> for SliceExpand<T, ReadWrite> {
90 fn __expand_write_method(
91 &self,
92 scope: &mut Scope,
93 pos: ExpandElementTyped<u32>,
94 value: <T>::ExpandType,
95 ) {
96 <Self as ListMutExpand<T>>::__expand_write_method(self, scope, pos, value)
97 }
98
99 fn __expand_write_checked_method(
100 &self,
101 scope: &mut Scope,
102 pos: ExpandElementTyped<u32>,
103 value: <T>::ExpandType,
104 ) {
105 let len = <Self as ListExpand<T>>::__expand_len_method(self, scope);
106 let in_bounds = lt::expand(scope, pos.clone(), len);
107 if_expand(scope, in_bounds.into(), |scope| {
108 <Self as ListMutExpand<T>>::__expand_write_method(self, scope, pos, value)
109 })
110 }
111
112 fn __expand_to_linear_slice_mut_method(
113 &self,
114 scope: &mut Scope,
115 pos: ExpandElementTyped<u32>,
116 end: ExpandElementTyped<u32>,
117 ) -> SliceExpand<T, ReadWrite> {
118 let end = add::expand(scope, end, 1u32.into());
120 let start = Min::__expand_min(scope, pos, end.clone());
123 <Self as SliceMutOperatorExpand<T>>::__expand_slice_mut_method(self, scope, start, end)
124 }
125
126 fn __expand_tensor_map_store_method(
127 &self,
128 _scope: &mut Scope,
129 _shared_memory: SliceExpand<T, ReadOnly>,
130 _pos: <Coords1d as CubeType>::ExpandType,
131 ) {
132 unimplemented!("Not a tensor map");
133 }
134}