use crate::error::{LatticeError, Result};
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct Geometry {
pub sublanes: usize,
pub lanes: usize,
pub mxu: usize,
}
impl Geometry {
pub const TPU_V: Geometry = Geometry {
sublanes: 8,
lanes: 128,
mxu: 128,
};
pub const TINY: Geometry = Geometry {
sublanes: 2,
lanes: 4,
mxu: 4,
};
pub fn new(sublanes: usize, lanes: usize, mxu: usize) -> Result<Self> {
if sublanes == 0 || lanes == 0 || mxu == 0 {
return Err(LatticeError::ZeroTileDimension);
}
Ok(Geometry {
sublanes,
lanes,
mxu,
})
}
#[inline]
pub const fn tile_len(&self) -> usize {
self.sublanes * self.lanes
}
#[inline]
pub const fn round_up(n: usize, to: usize) -> usize {
n.div_ceil(to) * to
}
#[inline]
pub const fn pad_rows(&self, rows: usize) -> usize {
Geometry::round_up(rows, self.sublanes)
}
#[inline]
pub const fn pad_cols(&self, cols: usize) -> usize {
Geometry::round_up(cols, self.lanes)
}
#[inline]
pub const fn tile_rows(&self, rows: usize) -> usize {
rows.div_ceil(self.sublanes)
}
#[inline]
pub const fn tile_cols(&self, cols: usize) -> usize {
cols.div_ceil(self.lanes)
}
#[inline]
pub const fn is_aligned(&self, rows: usize, cols: usize) -> bool {
rows % self.sublanes == 0 && cols % self.lanes == 0
}
}
impl Default for Geometry {
#[inline]
fn default() -> Self {
Geometry::TPU_V
}
}
impl core::fmt::Debug for Geometry {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Geometry {{ {}x{} tile, {}x{} mxu }}",
self.sublanes, self.lanes, self.mxu, self.mxu
)
}
}