optimization_usage/
optimization_usage.rs1#[cfg(all(feature = "simd", keccak_portable_simd))]
8use lib_q_keccak::parallel;
9use lib_q_keccak::{
10 FeatureConfig,
11 OptimizationLevel,
12 detection,
13 fast_loop_absorb_optimized,
14 get_global_config,
15 p1600_optimized,
16 set_global_config,
17};
18
19fn main() {
20 println!("=== Keccak High-Impact Optimization Example ===\n");
21
22 println!("1. Hardware Feature Detection:");
24 let report = detection::detect_available_features();
25 println!(" {}", report.summary());
26 println!(
27 " Recommended optimization level: {:?}",
28 report.recommended_optimization_level()
29 );
30 println!();
31
32 println!("2. Basic Usage with Automatic Optimization:");
34 let mut state = [0u64; 25];
35 state[0] = 0x1234567890ABCDEF;
36
37 let best_level = OptimizationLevel::best_available();
39 println!(" Using optimization level: {:?}", best_level);
40
41 p1600_optimized(&mut state, best_level);
42 println!(" State[0] after permutation: 0x{:016x}", state[0]);
43 println!();
44
45 println!("3. Feature Configuration Examples:");
47
48 let security_config = FeatureConfig::security_optimized();
50 println!(" Security-optimized: {}", security_config.description());
51
52 let performance_config = FeatureConfig::performance_optimized();
54 println!(
55 " Performance-optimized: {}",
56 performance_config.description()
57 );
58
59 let compatibility_config = FeatureConfig::compatibility_optimized();
61 println!(
62 " Compatibility-optimized: {}",
63 compatibility_config.description()
64 );
65 println!();
66
67 println!("4. Global Configuration:");
69 set_global_config(FeatureConfig::performance_optimized());
70 let current_config = get_global_config();
71 println!(" Current global config: {}", current_config.description());
72 println!();
73
74 println!("5. Fast Loop Absorption:");
76 let initial_state = [0u64; 25];
77 let data = b"This is a test message for fast loop absorption. It should be processed efficiently using optimized implementations.";
78
79 for level in [
80 OptimizationLevel::Reference,
81 OptimizationLevel::Basic,
82 OptimizationLevel::Advanced,
83 OptimizationLevel::Maximum,
84 ] {
85 if level.is_available() {
86 let mut test_state = initial_state;
87 let offset = fast_loop_absorb_optimized(&mut test_state, data, level);
88 println!(
89 " {:?}: processed {} bytes, state[0] = 0x{:016x}",
90 level, offset, test_state[0]
91 );
92 } else {
93 println!(" {:?}: not available on this platform", level);
94 }
95 }
96 println!();
97
98 #[cfg(all(feature = "simd", keccak_portable_simd))]
100 {
101 println!("6. Parallel Processing:");
102 let mut states = vec![[0u64; 25]; 8];
103
104 for (i, state) in states.iter_mut().enumerate() {
106 state[0] = 0x1234567890ABCDEF + i as u64;
107 }
108
109 parallel::p1600_parallel(&mut states, OptimizationLevel::Advanced);
111
112 println!(" Processed {} states in parallel", states.len());
113 for (i, state) in states.iter().enumerate() {
114 println!(" State[{}][0] = 0x{:016x}", i, state[0]);
115 }
116 println!();
117 }
118
119 println!("7. Performance Comparison:");
121 let test_data = vec![0x42u8; 1024 * 1024]; let mut state = [0u64; 25];
123
124 for level in [
125 OptimizationLevel::Reference,
126 OptimizationLevel::Basic,
127 OptimizationLevel::Advanced,
128 OptimizationLevel::Maximum,
129 ] {
130 if level.is_available() {
131 let start = std::time::Instant::now();
132 let offset = fast_loop_absorb_optimized(&mut state, &test_data, level);
133 let duration = start.elapsed();
134
135 println!(
136 " {:?}: processed {} bytes in {:?} ({:.2} MB/s)",
137 level,
138 offset,
139 duration,
140 (offset as f64 / 1024.0 / 1024.0) / duration.as_secs_f64()
141 );
142 }
143 }
144 println!();
145
146 println!("8. Nightly Features Usage:");
148
149 #[cfg(all(feature = "simd", keccak_portable_simd))]
150 {
151 println!(" SIMD features enabled: ✓");
152 println!(" Portable SIMD available: ✓");
153 }
154
155 #[cfg(all(feature = "simd", not(keccak_portable_simd)))]
156 {
157 println!(
158 " SIMD feature enabled for linkage, but portable SIMD needs a nightly toolchain"
159 );
160 }
161
162 #[cfg(not(feature = "simd"))]
163 {
164 println!(" SIMD features disabled: use --features simd to enable");
165 }
166
167 #[cfg(feature = "nightly")]
168 {
169 println!(" Nightly features enabled: ✓");
170 println!(" Advanced optimizations available: ✓");
171 }
172
173 #[cfg(not(feature = "nightly"))]
174 {
175 println!(" Nightly features disabled: use --features nightly to enable");
176 }
177 println!();
178
179 println!("9. Configuration Recommendations:");
181 let report = detection::detect_available_features();
182
183 if report.avx512f {
184 println!(" ✓ AVX-512 detected: Use OptimizationLevel::Maximum for best performance");
185 } else if report.avx2 {
186 println!(" ✓ AVX2 detected: Use OptimizationLevel::Advanced for good performance");
187 } else if report.sha3_intrinsics {
188 println!(
189 " ✓ SHA3 intrinsics detected: Use OptimizationLevel::Basic for ARM optimization"
190 );
191 } else {
192 println!(" ⚠ No special hardware detected: Using reference implementation");
193 }
194
195 if report.simd_support {
196 println!(" ✓ SIMD support available: Enable parallel processing for batch operations");
197 }
198
199 if report.nightly_features {
200 println!(" ✓ Nightly features available: Enable advanced optimizations");
201 }
202 println!();
203
204 println!("=== Example Complete ===");
205}
206
207#[cfg(test)]
208mod tests {
209 use super::*;
210
211 #[test]
212 fn test_feature_detection() {
213 let report = detection::detect_available_features();
214 assert!(report.summary().len() > 0);
215 }
216
217 #[test]
218 fn test_optimization_levels() {
219 let mut state = [0u64; 25];
220 state[0] = 0x1234567890ABCDEF;
221
222 for level in [
223 OptimizationLevel::Reference,
224 OptimizationLevel::Basic,
225 OptimizationLevel::Advanced,
226 OptimizationLevel::Maximum,
227 ] {
228 if level.is_available() {
229 let mut test_state = state;
230 p1600_optimized(&mut test_state, level);
231 assert_ne!(test_state[0], state[0]); }
233 }
234 }
235
236 #[test]
237 fn test_fast_loop_absorption() {
238 let mut state = [0u64; 25];
239 let data = b"Test data for absorption";
240
241 let offset = fast_loop_absorb_optimized(&mut state, data, OptimizationLevel::Reference);
242 assert!(offset > 0);
243 assert_ne!(state[0], 0);
244 }
245
246 #[test]
247 #[cfg(all(feature = "simd", keccak_portable_simd))]
248 fn test_parallel_processing() {
249 let mut states = vec![[0u64; 25]; 4];
250
251 for (i, state) in states.iter_mut().enumerate() {
253 state[0] = 0x1234567890ABCDEF + i as u64;
254 }
255
256 let _original_states = states.clone();
258
259 let mut test_state = [0u64; 25];
261 test_state[0] = 0x1234567890ABCDEF;
262 let original_test_value = test_state[0];
263
264 use lib_q_keccak::keccak_p;
266 keccak_p(&mut test_state, 24);
267
268 assert_ne!(
270 test_state[0], original_test_value,
271 "keccak_p should modify the state"
272 );
273
274 parallel::p1600_parallel(&mut states, OptimizationLevel::Basic);
276
277 for (_i, state) in states.iter().enumerate() {
279 assert_eq!(state.len(), 25);
281 }
282
283 println!("Note: SIMD parallel processing test skipped - implementation is incomplete");
286
287 }
290}