/home/noah/src/trueno/src/tiling/packing.rs
Line | Count | Source |
1 | | //! Memory packing layout utilities. |
2 | | |
3 | | |
4 | | /// Memory layout for packed matrices |
5 | | #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
6 | | pub enum PackingLayout { |
7 | | /// Row-major (C-style) |
8 | | RowMajor, |
9 | | /// Column-major (Fortran-style) |
10 | | ColumnMajor, |
11 | | /// Panel-major for A (Goto algorithm) |
12 | | PanelMajorA, |
13 | | /// Panel-major for B (Goto algorithm) |
14 | | PanelMajorB, |
15 | | } |
16 | | |
17 | | /// Calculate packed index for panel-major A layout |
18 | | /// |
19 | | /// Panel-major stores micro-panels contiguously for sequential access. |
20 | | #[must_use] |
21 | | #[inline] |
22 | 0 | pub fn pack_a_index(row: usize, col: usize, mr: usize, kc: usize, _mc: usize) -> usize { |
23 | 0 | let panel = row / mr; |
24 | 0 | let row_in_panel = row % mr; |
25 | 0 | panel * mr * kc + col * mr + row_in_panel |
26 | 0 | } |
27 | | |
28 | | /// Calculate packed index for panel-major B layout |
29 | | #[must_use] |
30 | | #[inline] |
31 | 0 | pub fn pack_b_index(row: usize, col: usize, nr: usize, kc: usize, _nc: usize) -> usize { |
32 | 0 | let panel = col / nr; |
33 | 0 | let col_in_panel = col % nr; |
34 | 0 | panel * kc * nr + row * nr + col_in_panel |
35 | 0 | } |
36 | | |
37 | | /// Apply XOR swizzling for shared memory bank conflict avoidance |
38 | | /// |
39 | | /// Pattern: idx_swizzled = idx ^ (idx >> 5) for 32-bank architectures. |
40 | | #[must_use] |
41 | | #[inline] |
42 | 0 | pub fn swizzle_index(idx: usize) -> usize { |
43 | 0 | idx ^ (idx >> 5) |
44 | 0 | } |