1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct PlatformCapabilities {
8 pub cpu: CpuCapabilities,
10 pub gpu: GpuCapabilities,
12 pub memory: MemoryCapabilities,
14 pub platform_type: PlatformType,
16 pub os: OperatingSystem,
18 pub architecture: Architecture,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct CpuCapabilities {
25 pub physical_cores: usize,
27 pub logical_cores: usize,
29 pub simd: SimdCapabilities,
31 pub cache: CacheInfo,
33 pub base_clock_mhz: Option<f32>,
35 pub vendor: String,
37 pub model_name: String,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct SimdCapabilities {
44 pub sse: bool,
46 pub sse2: bool,
48 pub sse3: bool,
50 pub ssse3: bool,
52 pub sse4_1: bool,
54 pub sse4_2: bool,
56 pub avx: bool,
58 pub avx2: bool,
60 pub avx512: bool,
62 pub fma: bool,
64 pub neon: bool,
66 pub sve: bool,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct CacheInfo {
73 pub l1_data: Option<usize>,
75 pub l1_instruction: Option<usize>,
77 pub l2: Option<usize>,
79 pub l3: Option<usize>,
81 pub line_size: Option<usize>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct GpuCapabilities {
88 pub available: bool,
90 pub devices: Vec<GpuDevice>,
92 pub primary_device: Option<usize>,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct GpuDevice {
99 pub name: String,
101 pub vendor: String,
103 pub device_type: GpuType,
105 pub memory_bytes: usize,
107 pub compute_units: usize,
109 pub max_workgroup_size: usize,
111 pub cuda_cores: Option<usize>,
113 pub compute_capability: Option<(u32, u32)>,
115}
116
117#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
119pub enum GpuType {
120 Discrete,
121 Integrated,
122 Virtual,
123 Unknown,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct MemoryCapabilities {
129 pub total_memory: usize,
131 pub available_memory: usize,
133 pub bandwidth_gbps: Option<f32>,
135 pub numa_nodes: usize,
137 pub hugepage_support: bool,
139}
140
141#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
143pub enum PlatformType {
144 Desktop,
145 Server,
146 Mobile,
147 Embedded,
148 Cloud,
149 Unknown,
150}
151
152#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
154pub enum OperatingSystem {
155 Linux,
156 Windows,
157 MacOS,
158 FreeBSD,
159 Android,
160 Unknown,
161}
162
163#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
165pub enum Architecture {
166 X86_64,
167 Aarch64,
168 Riscv64,
169 Wasm32,
170 Unknown,
171}
172
173impl PlatformCapabilities {
174 pub fn detect() -> Self {
179 crate::platform::detector::detect_platform_capabilities()
180 }
181
182 pub fn has_simd(&self) -> bool {
184 self.cpu.simd.sse2
185 || self.cpu.simd.avx
186 || self.cpu.simd.avx2
187 || self.cpu.simd.neon
188 || self.cpu.simd.sve
189 }
190
191 pub fn simd_available(&self) -> bool {
193 self.has_simd()
194 }
195
196 pub fn gpu_available(&self) -> bool {
198 self.gpu.available
199 }
200
201 pub fn optimal_simd_width_f64(&self) -> usize {
203 if self.cpu.simd.avx512 {
204 8
205 } else if self.cpu.simd.avx || self.cpu.simd.avx2 {
206 4
207 } else if self.cpu.simd.sse2 || self.cpu.simd.neon {
208 2
209 } else {
210 1
211 }
212 }
213
214 pub fn has_gpu(&self) -> bool {
216 self.gpu.available && !self.gpu.devices.is_empty()
217 }
218
219 pub fn primary_gpu(&self) -> Option<&GpuDevice> {
221 self.gpu
222 .primary_device
223 .and_then(|idx| self.gpu.devices.get(idx))
224 }
225
226 pub fn is_suitable_for_large_quantum_sim(&self) -> bool {
228 self.memory.total_memory >= 16 * 1024 * 1024 * 1024 && self.cpu.logical_cores >= 8
230 && self.has_simd()
231 }
232}