#[derive(Debug, Clone, PartialEq)]
pub enum MemoryAccessPattern {
Sequential,
Strided { strides: Vec<usize> },
Random,
Broadcast,
}
impl MemoryAccessPattern {
pub fn is_cache_friendly(&self) -> bool {
match self {
MemoryAccessPattern::Sequential => true,
MemoryAccessPattern::Strided { strides } => {
strides.iter().all(|&stride| stride <= 64)
},
MemoryAccessPattern::Random => false,
MemoryAccessPattern::Broadcast => true, }
}
pub fn bandwidth_utilization(&self) -> f64 {
match self {
MemoryAccessPattern::Sequential => 1.0,
MemoryAccessPattern::Strided { strides } => {
let max_stride = strides.iter().max().unwrap_or(&1);
1.0 / (*max_stride as f64).max(1.0)
},
MemoryAccessPattern::Random => 0.1, MemoryAccessPattern::Broadcast => 0.8, }
}
pub fn supports_vectorization(&self) -> bool {
match self {
MemoryAccessPattern::Sequential => true,
MemoryAccessPattern::Strided { strides } => {
strides.last().is_some_and(|&stride| stride == 1)
},
MemoryAccessPattern::Random => false,
MemoryAccessPattern::Broadcast => false, }
}
}