rstsr_core/feature_rayon/
par_iter.rs

1//! Layout parallel iterator
2
3use crate::prelude_dev::*;
4use rayon::prelude::*;
5
6/* #region tensor iterator */
7
8#[duplicate_item(IterTensor; [IterVecView]; [IterVecMut]; [IndexedIterVecView]; [IndexedIterVecMut])]
9impl<'a, T, D> IntoParallelIterator for IterTensor<'a, T, D>
10where
11    D: DimDevAPI,
12    T: Send + Sync,
13{
14    type Item = <IterTensor<'a, T, D> as Iterator>::Item;
15    type Iter = ParIterRSTSR<Self>;
16
17    fn into_par_iter(self) -> Self::Iter {
18        Self::Iter { iter: self }
19    }
20}
21
22#[duplicate_item(IterTensor; [IterAxesView]; [IterAxesMut]; [IndexedIterAxesView]; [IndexedIterAxesMut])]
23impl<'a, T, B> IntoParallelIterator for IterTensor<'a, T, B>
24where
25    T: Send + Sync,
26    B::Raw: Send,
27    B: DeviceAPI<T> + Send,
28{
29    type Item = <IterTensor<'a, T, B> as Iterator>::Item;
30    type Iter = ParIterRSTSR<Self>;
31
32    fn into_par_iter(self) -> Self::Iter {
33        Self::Iter { iter: self }
34    }
35}
36
37/* #endregion */
38
39#[cfg(test)]
40mod test {
41    use super::*;
42
43    #[test]
44    fn test_col_major() {
45        let layout = [10, 10, 10].c();
46        let iter_ser = IterLayoutColMajor::new(&layout).unwrap();
47        let iter_par = IterLayoutColMajor::new(&layout).unwrap().into_par_iter();
48        let vec_ser: Vec<usize> = iter_ser.collect();
49        let mut vec_par = vec![];
50        iter_par.collect_into_vec(&mut vec_par);
51        assert_eq!(vec_ser, vec_par);
52    }
53
54    #[test]
55    fn test_row_major() {
56        let layout = [10, 10, 10].c();
57        let iter_ser = IterLayoutRowMajor::new(&layout).unwrap();
58        let iter_par = IterLayoutRowMajor::new(&layout).unwrap().into_par_iter();
59        let vec_ser: Vec<usize> = iter_ser.collect();
60        let mut vec_par = vec![];
61        iter_par.collect_into_vec(&mut vec_par);
62        assert_eq!(vec_ser, vec_par);
63    }
64}