| //! Example that displays information about the caches. |
| //! |
| //! This example only compiles on x86 platforms. |
| extern crate raw_cpuid; |
| use raw_cpuid::{CacheType, CpuId}; |
| |
| fn main() { |
| let cpuid = CpuId::new(); |
| cpuid.get_cache_parameters().map_or_else( |
| || println!("No cache parameter information available"), |
| |cparams| { |
| for cache in cparams { |
| let size = cache.associativity() |
| * cache.physical_line_partitions() |
| * cache.coherency_line_size() |
| * cache.sets(); |
| |
| let typ = match cache.cache_type() { |
| CacheType::Data => "Instruction-Cache", |
| CacheType::Instruction => "Data-Cache", |
| CacheType::Unified => "Unified-Cache", |
| _ => "Unknown cache type", |
| }; |
| |
| let associativity = if cache.is_fully_associative() { |
| "fully associative".to_string() |
| } else { |
| format!("{}-way associativity", cache.associativity()) |
| }; |
| |
| let size_repr = if size > 1024 * 1024 { |
| format!("{} MiB", size / (1024 * 1024)) |
| } else { |
| format!("{} KiB", size / 1024) |
| }; |
| |
| let mapping = if cache.has_complex_indexing() { |
| "hash-based-mapping" |
| } else { |
| "direct-mapped" |
| }; |
| |
| println!( |
| "L{} {}: ({}, {}, {})", |
| cache.level(), |
| typ, |
| size_repr, |
| associativity, |
| mapping |
| ); |
| } |
| }, |
| ); |
| } |