optirs_gpu/memory/management/
mod.rs1pub mod defragmentation;
7pub mod eviction_policies;
8pub mod garbage_collection;
9pub mod prefetching;
10
11use std::collections::HashMap;
12use std::ffi::c_void;
13use std::time::{Duration, Instant};
14
15use crate::memory::management::eviction_policies::EvictionConfig;
16
17pub use garbage_collection::{
18 GCConfig, GCStats, GarbageCollectionEngine, GarbageCollector, GenerationalCollector,
19 IncrementalCollector, MarkSweepCollector, ReferenceTracker,
20};
21
22pub use prefetching::{
23 AccessHistoryTracker, PrefetchCache, PrefetchConfig, PrefetchStrategy, PrefetchingEngine,
24 SequentialPrefetcher, StridePrefetcher,
25};
26
27pub use eviction_policies::{
28 ARCPolicy, ClockPolicy, EvictionEngine, EvictionPerformanceMonitor, EvictionPolicy, FIFOPolicy,
29 LFUPolicy, LRUPolicy, MemoryRegion, WorkloadAwarePolicy,
30};
31
32pub use defragmentation::{
33 CompactionAlgorithm, CompactionStrategy, DefragConfig, DefragError, DefragmentationEngine,
34 SlidingCompactionStrategy, ThreadSafeDefragmentationEngine, TwoPointerCompactionStrategy,
35};
36
37#[derive(Debug, Clone)]
39pub struct MemoryManagementConfig {
40 pub gc_config: GCConfig,
42 pub prefetch_config: PrefetchConfig,
44 pub defrag_config: DefragConfig,
46 pub enable_background_management: bool,
48 pub management_threads: usize,
50 pub memory_pressure_threshold: f64,
52 pub monitoring_interval: Duration,
54}
55
56impl Default for MemoryManagementConfig {
57 fn default() -> Self {
58 Self {
59 gc_config: GCConfig::default(),
60 prefetch_config: PrefetchConfig::default(),
61 defrag_config: DefragConfig::default(),
62 enable_background_management: true,
63 management_threads: 2,
64 memory_pressure_threshold: 0.8,
65 monitoring_interval: Duration::from_millis(100),
66 }
67 }
68}
69
70pub struct IntegratedMemoryManager {
72 gc_engine: GarbageCollectionEngine,
74 prefetch_engine: PrefetchingEngine,
76 eviction_engine: EvictionEngine,
78 defrag_engine: DefragmentationEngine,
80 config: MemoryManagementConfig,
82 stats: ManagementStats,
84 background_enabled: bool,
86}
87
88#[derive(Debug, Clone, Default)]
90pub struct ManagementStats {
91 pub gc_collections: u64,
92 pub objects_collected: u64,
93 pub bytes_freed_by_gc: u64,
94 pub prefetch_requests: u64,
95 pub prefetch_hits: u64,
96 pub prefetch_accuracy: f64,
97 pub evictions_performed: u64,
98 pub bytes_evicted: u64,
99 pub defragmentation_cycles: u64,
100 pub fragmentation_reduced: usize,
101 pub total_management_time: Duration,
102 pub memory_pressure_events: u64,
103}
104
105impl IntegratedMemoryManager {
106 pub fn new(config: MemoryManagementConfig) -> Self {
108 let gc_engine = GarbageCollectionEngine::new(config.gc_config.clone());
109 let prefetch_engine = PrefetchingEngine::new(config.prefetch_config.clone());
110 let eviction_engine = EvictionEngine::new(EvictionConfig::default());
111 let defrag_engine = DefragmentationEngine::new(config.defrag_config.clone());
112
113 Self {
114 gc_engine,
115 prefetch_engine,
116 eviction_engine,
117 defrag_engine,
118 config,
119 stats: ManagementStats::default(),
120 background_enabled: false,
121 }
122 }
123
124 pub fn start_background_management(&mut self) -> Result<(), MemoryManagementError> {
126 if !self.config.enable_background_management {
127 return Err(MemoryManagementError::BackgroundManagementDisabled);
128 }
129
130 self.background_enabled = true;
131 Ok(())
132 }
133
134 pub fn stop_background_management(&mut self) {
136 self.background_enabled = false;
137 }
138
139 pub fn run_garbage_collection(
141 &mut self,
142 memory_regions: &HashMap<usize, MemoryRegion>,
143 ) -> Result<usize, MemoryManagementError> {
144 let start_time = Instant::now();
145
146 let gc_results = self
147 .gc_engine
148 .collect()
149 .map_err(|e| MemoryManagementError::GarbageCollectionFailed(format!("{:?}", e)))?;
150 let bytes_freed: usize = gc_results.iter().map(|r| r.bytes_collected).sum();
151
152 self.stats.gc_collections += 1;
153 self.stats.bytes_freed_by_gc += bytes_freed as u64;
154 self.stats.total_management_time += start_time.elapsed();
155
156 Ok(bytes_freed)
157 }
158
159 pub fn prefetch(
161 &mut self,
162 address: *mut c_void,
163 size: usize,
164 access_pattern: Option<&str>,
165 ) -> Result<bool, MemoryManagementError> {
166 let start_time = Instant::now();
167
168 let prefetched = false; self.stats.prefetch_requests += 1;
172 if prefetched {
173 self.stats.prefetch_hits += 1;
174 }
175
176 self.stats.prefetch_accuracy =
177 self.stats.prefetch_hits as f64 / self.stats.prefetch_requests as f64;
178 self.stats.total_management_time += start_time.elapsed();
179
180 Ok(prefetched)
181 }
182
183 pub fn evict_memory(&mut self, target_bytes: usize) -> Result<usize, MemoryManagementError> {
185 let start_time = Instant::now();
186
187 let bytes_evicted = 0; self.stats.evictions_performed += 1;
191 self.stats.bytes_evicted += bytes_evicted as u64;
192 self.stats.total_management_time += start_time.elapsed();
193
194 Ok(bytes_evicted)
195 }
196
197 pub fn defragment(
199 &mut self,
200 memory_regions: &HashMap<usize, MemoryRegion>,
201 ) -> Result<usize, MemoryManagementError> {
202 let start_time = Instant::now();
203
204 let compaction_result = self
205 .defrag_engine
206 .defragment()
207 .map_err(|e| MemoryManagementError::DefragmentationFailed(format!("{:?}", e)))?;
208
209 let fragmentation_reduced = compaction_result.bytes_moved;
210
211 self.stats.defragmentation_cycles += 1;
212 self.stats.fragmentation_reduced += fragmentation_reduced;
213 self.stats.total_management_time += start_time.elapsed();
214
215 Ok(fragmentation_reduced)
216 }
217
218 pub fn handle_memory_pressure(
220 &mut self,
221 memory_usage_ratio: f64,
222 memory_regions: &HashMap<usize, MemoryRegion>,
223 ) -> Result<(), MemoryManagementError> {
224 if memory_usage_ratio > self.config.memory_pressure_threshold {
225 self.stats.memory_pressure_events += 1;
226
227 let _ = self.run_garbage_collection(memory_regions)?;
229
230 if memory_usage_ratio > 0.9 {
232 let target_eviction =
233 (memory_usage_ratio - self.config.memory_pressure_threshold) * 1_000_000.0; let _ = self.evict_memory(target_eviction as usize)?;
235 }
236
237 if memory_usage_ratio > 0.95 {
239 let _ = self.defragment(memory_regions)?;
240 }
241 }
242
243 Ok(())
244 }
245
246 pub fn update_access_pattern(
248 &mut self,
249 address: *mut c_void,
250 size: usize,
251 access_type: AccessType,
252 ) -> Result<(), MemoryManagementError> {
253 Ok(())
260 }
261
262 pub fn get_stats(&self) -> &ManagementStats {
264 &self.stats
265 }
266
267 pub fn get_gc_stats(&self) -> GCStats {
269 self.gc_engine.get_stats().clone()
270 }
271
272 pub fn get_prefetch_performance(&self) -> PrefetchPerformance {
274 PrefetchPerformance {
275 requests: self.stats.prefetch_requests,
276 hits: self.stats.prefetch_hits,
277 accuracy: self.stats.prefetch_accuracy,
278 cache_size: 0, }
280 }
281
282 pub fn optimize_policies(&mut self) -> Result<(), MemoryManagementError> {
284 Ok(())
290 }
291}
292
293#[derive(Debug, Clone)]
295pub enum AccessType {
296 Read,
297 Write,
298 ReadWrite,
299 Sequential,
300 Random,
301}
302
303#[derive(Debug, Clone)]
305pub struct PrefetchPerformance {
306 pub requests: u64,
307 pub hits: u64,
308 pub accuracy: f64,
309 pub cache_size: usize,
310}
311
312#[derive(Debug, Clone)]
314pub struct AccessPatterns {
315 pub temporal_locality: f64,
316 pub spatial_locality: f64,
317 pub frequency_based: bool,
318 pub stride_patterns: Vec<i64>,
319}
320
321#[derive(Debug, Clone)]
323pub enum MemoryManagementError {
324 GarbageCollectionFailed(String),
325 PrefetchFailed(String),
326 EvictionFailed(String),
327 DefragmentationFailed(String),
328 BackgroundManagementDisabled,
329 InvalidConfiguration(String),
330 InternalError(String),
331}
332
333impl std::fmt::Display for MemoryManagementError {
334 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
335 match self {
336 MemoryManagementError::GarbageCollectionFailed(msg) => {
337 write!(f, "Garbage collection failed: {}", msg)
338 }
339 MemoryManagementError::PrefetchFailed(msg) => write!(f, "Prefetch failed: {}", msg),
340 MemoryManagementError::EvictionFailed(msg) => write!(f, "Eviction failed: {}", msg),
341 MemoryManagementError::DefragmentationFailed(msg) => {
342 write!(f, "Defragmentation failed: {}", msg)
343 }
344 MemoryManagementError::BackgroundManagementDisabled => {
345 write!(f, "Background management is disabled")
346 }
347 MemoryManagementError::InvalidConfiguration(msg) => {
348 write!(f, "Invalid configuration: {}", msg)
349 }
350 MemoryManagementError::InternalError(msg) => write!(f, "Internal error: {}", msg),
351 }
352 }
353}
354
355impl std::error::Error for MemoryManagementError {}
356
357#[cfg(test)]
358mod tests {
359 use super::*;
360
361 #[test]
362 fn test_integrated_manager_creation() {
363 let config = MemoryManagementConfig::default();
364 let manager = IntegratedMemoryManager::new(config);
365 assert!(!manager.background_enabled);
366 }
367
368 #[test]
369 fn test_background_management() {
370 let config = MemoryManagementConfig::default();
371 let mut manager = IntegratedMemoryManager::new(config);
372 let result = manager.start_background_management();
373 assert!(result.is_ok());
374 assert!(manager.background_enabled);
375 }
376
377 #[test]
378 fn test_stats_initialization() {
379 let config = MemoryManagementConfig::default();
380 let manager = IntegratedMemoryManager::new(config);
381 let stats = manager.get_stats();
382 assert_eq!(stats.gc_collections, 0);
383 assert_eq!(stats.prefetch_requests, 0);
384 }
385}