trueno/tiling/prefetch.rs
1//! Prefetch locality hints for cache optimization.
2
3use super::geometry::{TcbGeometry, TcbLevel};
4
5/// Prefetch locality hint
6#[derive(Debug, Clone, Copy)]
7pub enum PrefetchLocality {
8 /// Non-temporal (streaming, evict soon)
9 NonTemporal,
10 /// L3 cache
11 T2,
12 /// L2 cache
13 T1,
14 /// L1 cache (highest priority)
15 T0,
16}
17
18/// Calculate optimal prefetch distance based on tile geometry and cache level
19///
20/// Per Ding & Kennedy (2004): distance = memory_latency / compute_time_per_iter
21#[must_use]
22pub fn optimal_prefetch_distance(geometry: &TcbGeometry, level: TcbLevel) -> usize {
23 // Approximate cycles per micro-tile
24 let compute_cycles = geometry.m as usize * geometry.n as usize * geometry.k as usize / 8;
25
26 // Memory latency in cycles (approximate for modern x86)
27 let mem_latency = match level {
28 TcbLevel::Micro => 4, // L1: ~4 cycles
29 TcbLevel::Midi => 12, // L2: ~12 cycles
30 TcbLevel::Macro => 40, // L3: ~40 cycles
31 };
32
33 // Distance = latency / compute_time, minimum 1
34 (mem_latency / compute_cycles.max(1)).max(1)
35}