use cbtop::{
elementwise_working_set, matrix_working_set, optimal_matmul_tile, AccessPattern,
BandwidthPrediction, CacheConfig, CacheLevel, WorkingSetAnalysis,
};
#[test]
fn f1125_tile_positive() {
let config = CacheConfig::default();
let tile = optimal_matmul_tile(&config, 4);
assert!(tile > 0);
}
#[test]
fn f1125_tile_aligned() {
let config = CacheConfig::default();
let tile = optimal_matmul_tile(&config, 4);
let elements_per_line = config.line_size / 4;
assert_eq!(tile % elements_per_line, 0);
}
#[test]
fn f1125_tile_fits_l2() {
let config = CacheConfig::default();
let tile = optimal_matmul_tile(&config, 4);
let tile_bytes = 3 * tile * tile * 4;
let target = config.l2_size * 3 / 4;
assert!(tile_bytes <= target);
}
#[test]
fn f1125_different_element_sizes() {
let config = CacheConfig::default();
let tile_f32 = optimal_matmul_tile(&config, 4);
let tile_f64 = optimal_matmul_tile(&config, 8);
assert!(tile_f32 >= tile_f64);
}
#[test]
fn f1126_single_io() {
let ws = elementwise_working_set(1000, 1, 1, 4);
assert_eq!(ws, 8000);
}
#[test]
fn f1126_multiple_inputs() {
let ws = elementwise_working_set(1000, 2, 1, 4);
assert_eq!(ws, 12000);
}
#[test]
fn f1126_fused_op() {
let ws = elementwise_working_set(10000, 3, 1, 4);
assert_eq!(ws, 160000);
}
#[test]
fn f1127_streaming_pattern() {
let config = CacheConfig::default();
let pattern = AccessPattern::estimate(1024, 1, &config);
assert_eq!(pattern, AccessPattern::Streaming);
}
#[test]
fn f1127_reuse_pattern() {
let config = CacheConfig::default();
let pattern = AccessPattern::estimate(1024, 10, &config);
assert_eq!(pattern, AccessPattern::Reuse);
}
#[test]
fn f1127_random_pattern() {
let config = CacheConfig::default();
let pattern = AccessPattern::estimate(100 * 1024 * 1024, 10, &config);
assert_eq!(pattern, AccessPattern::Random);
}
#[test]
fn f1127_pattern_names() {
assert_eq!(AccessPattern::Streaming.name(), "streaming");
assert_eq!(AccessPattern::Reuse.name(), "reuse");
assert_eq!(AccessPattern::Random.name(), "random");
}
#[test]
fn f1127_efficiency_factors() {
assert!(
AccessPattern::Reuse.efficiency_factor() > AccessPattern::Streaming.efficiency_factor()
);
assert!(
AccessPattern::Streaming.efficiency_factor() > AccessPattern::Random.efficiency_factor()
);
}
#[test]
fn f1128_l1_reuse_prediction() {
let config = CacheConfig::default();
let prediction = BandwidthPrediction::predict(
100.0, 1024, AccessPattern::Reuse,
&config,
);
assert!(prediction.efficiency_percent > 90.0);
assert!(prediction.predicted_bandwidth_gbps > 90.0);
}
#[test]
fn f1128_ram_random_prediction() {
let config = CacheConfig::default();
let prediction = BandwidthPrediction::predict(
100.0,
100 * 1024 * 1024, AccessPattern::Random,
&config,
);
assert!(prediction.efficiency_percent < 20.0);
}
#[test]
fn f1128_limiting_factor() {
let config = CacheConfig::default();
let prediction = BandwidthPrediction::predict(100.0, 1024, AccessPattern::Random, &config);
assert!(prediction.limiting_factor.contains("random"));
}
#[test]
fn f1128_peak_preserved() {
let config = CacheConfig::default();
let prediction = BandwidthPrediction::predict(200.0, 1024, AccessPattern::Reuse, &config);
assert_eq!(prediction.peak_bandwidth_gbps, 200.0);
}
#[test]
fn f1129_zero_elements() {
let config = CacheConfig::default();
let analysis = WorkingSetAnalysis::analyze(0, 4, 1.0, &config);
assert_eq!(analysis.working_set_bytes, 0);
assert_eq!(analysis.cache_level, CacheLevel::L1);
}
#[test]
fn f1129_huge_working_set() {
let config = CacheConfig::default();
let analysis = WorkingSetAnalysis::analyze(1_000_000_000, 8, 1.0, &config);
assert_eq!(analysis.cache_level, CacheLevel::Ram);
assert!(analysis.tiling_recommended);
}
#[test]
fn f1129_small_access_factor() {
let config = CacheConfig::default();
let analysis = WorkingSetAnalysis::analyze(1_000_000, 4, 0.001, &config);
assert!(analysis.working_set_bytes > 0);
}
#[test]
fn f1130_bandwidth_cliff() {
let config = CacheConfig::default();
let analysis = WorkingSetAnalysis::analyze(4_000_000, 8, 1.0, &config);
assert!(matches!(
analysis.cache_level,
CacheLevel::L3 | CacheLevel::Ram
));
assert!(analysis.tiling_recommended);
}
#[test]
fn f1130_tile_l2_residency() {
let config = CacheConfig::default();
let tile = optimal_matmul_tile(&config, 4);
let ws = matrix_working_set(tile, tile, tile, 4);
assert!(config.classify(ws) == CacheLevel::L2 || config.classify(ws) == CacheLevel::L1);
}
#[test]
fn f1130_llm_attention() {
let config = CacheConfig::zen4();
let batch = 32;
let seq = 2048;
let dim = 4096;
let element_size = 2;
let _qkv_size = 3 * batch * seq * dim * element_size;
let analysis = WorkingSetAnalysis::analyze(
batch * seq * dim * 3, element_size,
1.0,
&config,
);
assert_eq!(analysis.cache_level, CacheLevel::Ram);
assert!(analysis.tiling_recommended);
}
#[test]
fn f1130_streaming_workload() {
let config = CacheConfig::default();
let prediction = BandwidthPrediction::predict(
50.0, 1024 * 1024 * 1024, AccessPattern::Streaming,
&config,
);
assert!(prediction.efficiency_percent > 4.0);
assert!(prediction.efficiency_percent < 10.0); }