cubecl_tile/layout/paging/
base.rs1use crate::*;
5
6#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
9pub struct Paging {
10 pub sequence: Axis,
11 pub position: Axis,
12 pub page_size: usize,
14}
15
16impl Paging {
17 pub(crate) fn of_pool(
24 sequence: Axis,
25 position: Axis,
26 shape: &[usize],
27 projection: &Projection,
28 stored_tiles: &[(Axis, usize)],
29 delivery: Delivery,
30 ) -> Result<Paging, Refusal> {
31 let unsized_paging = Paging {
32 sequence,
33 position,
34 page_size: 0,
35 };
36 let page_size = unsized_paging
38 .dims(projection)
39 .map_or(0, |(_, position)| shape[position]);
40 let paging = Paging {
41 page_size,
42 ..unsized_paging
43 };
44 paging.validate(projection, stored_tiles, delivery)?;
45 let (sequence, _) = paging.dims(projection)?;
46 match shape[sequence] {
47 0 => Err(Refusal::PagingOfAnEmptyPool),
48 _ => Ok(paging),
49 }
50 }
51
52 pub(crate) fn dims(&self, projection: &Projection) -> Result<(usize, usize), Refusal> {
59 let dim = |axis: Axis| {
60 (0..projection.physical_rank())
61 .find(|&pa| projection.physical_axis(pa).is_identity(axis))
62 .ok_or(Refusal::PagingOfAnUnlabelledAxis(axis))
63 };
64 let (sequence, position) = (dim(self.sequence)?, dim(self.position)?);
65 match sequence == position {
66 true => Err(Refusal::PagingOfOneDim(self.sequence)),
67 false => Ok((sequence, position)),
68 }
69 }
70
71 pub(crate) fn validate(
81 &self,
82 projection: &Projection,
83 stored_tiles: &[(Axis, usize)],
84 delivery: Delivery,
85 ) -> Result<(), Refusal> {
86 if !projection.is_direct() || projection.is_tiled() || !stored_tiles.is_empty() {
87 return Err(Refusal::PagingOfAStatedLayout);
88 }
89 if !matches!(delivery, Delivery::SyncPerUnit | Delivery::AsyncPerUnit) {
90 return Err(Refusal::PagingMovedByRuns);
91 }
92 let (sequence, _) = self.dims(projection)?;
93 if sequence == projection.physical_rank() - 1 {
94 return Err(Refusal::PagesAlongALine(self.sequence));
95 }
96 match self.page_size {
97 0 => Err(Refusal::PagingOfAnEmptyPool),
98 _ => Ok(()),
99 }
100 }
101}