avila_parallel/
lib.rs

1//! # avila-parallel
2//!
3//! Data parallelism library for AVL Platform.
4//!
5//! ## Features
6//!
7//! - Thread pool with work stealing
8//! - Parallel iterators
9//! - Scoped threads
10//! - Zero overhead abstractions
11//!
12//! ## Quick Start
13//!
14//! ```rust
15//! use avila_parallel::prelude::*;
16//!
17//! let numbers: Vec<i32> = (0..1000).collect();
18//! let sum: i32 = numbers.par_iter().sum();
19//! ```
20
21#![warn(missing_docs)]
22#![warn(clippy::all)]
23
24pub mod thread_pool;
25pub mod parallel;
26pub mod scope;
27pub mod executor;
28pub mod parallel_vec;
29pub mod advanced;
30pub mod work_stealing;
31pub mod simd;
32pub mod config;
33
34pub use thread_pool::ThreadPool;
35pub use parallel::{ParallelIterator, IntoParallelIterator};
36pub use parallel_vec::{ParallelVec, IntoParallelVec};
37pub use advanced::{parallel_sort, parallel_sort_by, parallel_zip, parallel_chunks, parallel_partition_advanced};
38pub use work_stealing::{WorkStealingPool, work_stealing_map};
39pub use config::{ThreadPoolConfig, set_global_config, get_global_config};
40
41/// Prelude module for convenient imports
42pub mod prelude {
43    pub use crate::parallel::{ParallelIterator, IntoParallelIterator, ParallelSlice, ParallelSliceMut};
44    pub use crate::parallel_vec::{ParallelVec, IntoParallelVec};
45    // Re-export std::thread::scope for convenience
46    pub use std::thread::scope;
47}
48
49/// Version information
50pub const VERSION: &str = env!("CARGO_PKG_VERSION");
51
52// Re-export std::thread::scope directly
53pub use std::thread::scope;
54
55#[cfg(test)]
56mod tests {
57    use super::prelude::*;
58    use super::ThreadPool;
59
60    #[test]
61    fn test_parallel_sum() {
62        let numbers: Vec<i32> = (0..100).collect();
63        let sum: i32 = numbers.par_iter().sum();
64        assert_eq!(sum, 4950);
65    }
66
67    #[test]
68    fn test_parallel_map() {
69        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
70        let doubled: Vec<i32> = numbers
71            .par_iter()
72            .map(|&x| x * 2)
73            .collect();
74        assert_eq!(doubled, vec![2, 4, 6, 8, 10]);
75    }
76
77    #[test]
78    fn test_thread_pool() {
79        let pool = ThreadPool::new(2);
80
81        for i in 0..10 {
82            pool.execute(move || {
83                let _result = i * i;
84                // Thread pool executes jobs without returning values
85            });
86        }
87
88        pool.wait();
89    }
90
91    #[test]
92    fn test_parallel_filter() {
93        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
94        let evens: Vec<i32> = numbers
95            .par_iter()
96            .filter(|&x| x % 2 == 0)
97            .cloned()
98            .collect();
99        assert_eq!(evens, vec![2, 4, 6, 8, 10]);
100    }
101
102    #[test]
103    fn test_parallel_fold() {
104        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
105        let result: Vec<i32> = numbers
106            .par_iter()
107            .fold(|| 0, |acc, &x| acc + x)
108            .collect();
109        assert_eq!(result.len(), 1);
110        assert_eq!(result[0], 15);
111    }
112
113    #[test]
114    fn test_parallel_reduce() {
115        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
116        let result = numbers
117            .par_iter()
118            .cloned()
119            .reduce(|a, b| a + b);
120        assert_eq!(result, Some(15));
121    }
122
123    #[test]
124    fn test_parallel_find_any() {
125        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
126        let found = numbers
127            .par_iter()
128            .find_any(|&&x| x > 3);
129        assert!(found.is_some());
130        assert!(*found.unwrap() > 3);
131    }
132
133    #[test]
134    fn test_parallel_all() {
135        let numbers: Vec<i32> = vec![2, 4, 6, 8, 10];
136        let all_even = numbers
137            .par_iter()
138            .all(|&x| x % 2 == 0);
139        assert!(all_even);
140    }
141
142    #[test]
143    fn test_parallel_any() {
144        let numbers: Vec<i32> = vec![1, 3, 5, 7, 8];
145        let has_even = numbers
146            .par_iter()
147            .any(|&x| x % 2 == 0);
148        assert!(has_even);
149    }
150
151    #[test]
152    fn test_parallel_cloned() {
153        let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
154        let doubled: Vec<i32> = numbers
155            .par_iter()
156            .cloned()
157            .map(|x| x * 2)
158            .collect();
159        assert_eq!(doubled, vec![2, 4, 6, 8, 10]);
160    }
161
162    #[test]
163    fn test_parallel_iter_mut() {
164        let mut numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
165        numbers
166            .par_iter_mut()
167            .for_each(|x| *x *= 2);
168        assert_eq!(numbers, vec![2, 4, 6, 8, 10]);
169    }
170}