rstsr_openblas/rayon_auto_impl/
op_binary_arithmetic.rs

1use crate::prelude_dev::*;
2use core::mem::transmute;
3
4#[duplicate_item(
5     DeviceOpAPI             Op             func                    ;
6    [DeviceAddAssignAPI   ] [AddAssign   ] [|a, b| unsafe { *a.assume_init_mut() +=  b.clone() }];
7    [DeviceSubAssignAPI   ] [SubAssign   ] [|a, b| unsafe { *a.assume_init_mut() -=  b.clone() }];
8    [DeviceMulAssignAPI   ] [MulAssign   ] [|a, b| unsafe { *a.assume_init_mut() *=  b.clone() }];
9    [DeviceDivAssignAPI   ] [DivAssign   ] [|a, b| unsafe { *a.assume_init_mut() /=  b.clone() }];
10    [DeviceRemAssignAPI   ] [RemAssign   ] [|a, b| unsafe { *a.assume_init_mut() %=  b.clone() }];
11    [DeviceBitOrAssignAPI ] [BitOrAssign ] [|a, b| unsafe { *a.assume_init_mut() |=  b.clone() }];
12    [DeviceBitAndAssignAPI] [BitAndAssign] [|a, b| unsafe { *a.assume_init_mut() &=  b.clone() }];
13    [DeviceBitXorAssignAPI] [BitXorAssign] [|a, b| unsafe { *a.assume_init_mut() ^=  b.clone() }];
14    [DeviceShlAssignAPI   ] [ShlAssign   ] [|a, b| unsafe { *a.assume_init_mut() <<= b.clone() }];
15    [DeviceShrAssignAPI   ] [ShrAssign   ] [|a, b| unsafe { *a.assume_init_mut() >>= b.clone() }];
16)]
17impl<TA, TB, D> DeviceOpAPI<TA, TB, D> for DeviceRayonAutoImpl
18where
19    TA: Clone + Send + Sync + Op<TB>,
20    TB: Clone + Send + Sync,
21    D: DimAPI,
22{
23    fn op_muta_refb(&self, a: &mut Vec<TA>, la: &Layout<D>, b: &Vec<TB>, lb: &Layout<D>) -> Result<()> {
24        let a = unsafe { transmute::<&mut Vec<TA>, &mut Vec<MaybeUninit<TA>>>(a) };
25        self.op_muta_refb_func(a, la, b, lb, &mut func)
26    }
27
28    fn op_muta_numb(&self, a: &mut Vec<TA>, la: &Layout<D>, b: TB) -> Result<()> {
29        let a = unsafe { transmute::<&mut Vec<TA>, &mut Vec<MaybeUninit<TA>>>(a) };
30        self.op_muta_numb_func(a, la, b, &mut func)
31    }
32}
33
34#[duplicate_item(
35     DeviceOpAPI               Op       func                               ;
36    [DeviceLConsumeAddAPI   ] [Add   ] [|a, b| unsafe { a.write(a.assume_init_read() +  b.clone()); }];
37    [DeviceLConsumeSubAPI   ] [Sub   ] [|a, b| unsafe { a.write(a.assume_init_read() -  b.clone()); }];
38    [DeviceLConsumeMulAPI   ] [Mul   ] [|a, b| unsafe { a.write(a.assume_init_read() *  b.clone()); }];
39    [DeviceLConsumeDivAPI   ] [Div   ] [|a, b| unsafe { a.write(a.assume_init_read() /  b.clone()); }];
40    [DeviceLConsumeRemAPI   ] [Rem   ] [|a, b| unsafe { a.write(a.assume_init_read() %  b.clone()); }];
41    [DeviceLConsumeBitOrAPI ] [BitOr ] [|a, b| unsafe { a.write(a.assume_init_read() |  b.clone()); }];
42    [DeviceLConsumeBitAndAPI] [BitAnd] [|a, b| unsafe { a.write(a.assume_init_read() &  b.clone()); }];
43    [DeviceLConsumeBitXorAPI] [BitXor] [|a, b| unsafe { a.write(a.assume_init_read() ^  b.clone()); }];
44    [DeviceLConsumeShlAPI   ] [Shl   ] [|a, b| unsafe { a.write(a.assume_init_read() << b.clone()); }];
45    [DeviceLConsumeShrAPI   ] [Shr   ] [|a, b| unsafe { a.write(a.assume_init_read() >> b.clone()); }];
46)]
47impl<TA, TB, D> DeviceOpAPI<TA, TB, D> for DeviceRayonAutoImpl
48where
49    TA: Clone + Send + Sync + Op<TB, Output = TA>,
50    TB: Clone + Send + Sync,
51    D: DimAPI,
52{
53    fn op_muta_refb(&self, a: &mut Vec<TA>, la: &Layout<D>, b: &Vec<TB>, lb: &Layout<D>) -> Result<()> {
54        let a = unsafe { transmute::<&mut Vec<TA>, &mut Vec<MaybeUninit<TA>>>(a) };
55        self.op_muta_refb_func(a, la, b, lb, &mut func)
56    }
57
58    fn op_muta_numb(&self, a: &mut Vec<TA>, la: &Layout<D>, b: TB) -> Result<()> {
59        let a = unsafe { transmute::<&mut Vec<TA>, &mut Vec<MaybeUninit<TA>>>(a) };
60        self.op_muta_numb_func(a, la, b, &mut func)
61    }
62}
63
64#[duplicate_item(
65     DeviceOpAPI               Op       func                               ;
66    [DeviceRConsumeAddAPI   ] [Add   ] [|a, b| unsafe { a.write(b.clone() +  a.assume_init_read()); }];
67    [DeviceRConsumeSubAPI   ] [Sub   ] [|a, b| unsafe { a.write(b.clone() -  a.assume_init_read()); }];
68    [DeviceRConsumeMulAPI   ] [Mul   ] [|a, b| unsafe { a.write(b.clone() *  a.assume_init_read()); }];
69    [DeviceRConsumeDivAPI   ] [Div   ] [|a, b| unsafe { a.write(b.clone() /  a.assume_init_read()); }];
70    [DeviceRConsumeRemAPI   ] [Rem   ] [|a, b| unsafe { a.write(b.clone() %  a.assume_init_read()); }];
71    [DeviceRConsumeBitOrAPI ] [BitOr ] [|a, b| unsafe { a.write(b.clone() |  a.assume_init_read()); }];
72    [DeviceRConsumeBitAndAPI] [BitAnd] [|a, b| unsafe { a.write(b.clone() &  a.assume_init_read()); }];
73    [DeviceRConsumeBitXorAPI] [BitXor] [|a, b| unsafe { a.write(b.clone() ^  a.assume_init_read()); }];
74    [DeviceRConsumeShlAPI   ] [Shl   ] [|a, b| unsafe { a.write(b.clone() << a.assume_init_read()); }];
75    [DeviceRConsumeShrAPI   ] [Shr   ] [|a, b| unsafe { a.write(b.clone() >> a.assume_init_read()); }];
76)]
77impl<TA, TB, D> DeviceOpAPI<TA, TB, D> for DeviceRayonAutoImpl
78where
79    TA: Clone + Send + Sync + Op<TB, Output = TB>,
80    TB: Clone + Send + Sync,
81    D: DimAPI,
82{
83    fn op_muta_refb(&self, b: &mut Vec<TB>, lb: &Layout<D>, a: &Vec<TA>, la: &Layout<D>) -> Result<()> {
84        let b = unsafe { transmute::<&mut Vec<TB>, &mut Vec<MaybeUninit<TB>>>(b) };
85        self.op_muta_refb_func(b, lb, a, la, &mut func)
86    }
87
88    fn op_muta_numb(&self, b: &mut Vec<TB>, lb: &Layout<D>, a: TA) -> Result<()> {
89        let b = unsafe { transmute::<&mut Vec<TB>, &mut Vec<MaybeUninit<TB>>>(b) };
90        self.op_muta_numb_func(b, lb, a, &mut func)
91    }
92}
93
94#[duplicate_item(
95     DeviceOpAPI    Op    func                              func_inplace        ;
96    [DeviceNegAPI] [Neg] [|a, b| { a.write(-b.clone()); }] [|a| unsafe { a.write(-a.assume_init_read()); }];
97    [DeviceNotAPI] [Not] [|a, b| { a.write(!b.clone()); }] [|a| unsafe { a.write(!a.assume_init_read()); }];
98)]
99impl<TA, TB, D> DeviceOpAPI<TA, TB, D> for DeviceRayonAutoImpl
100where
101    TA: Clone + Send + Sync,
102    TB: Clone + Send + Sync,
103    D: DimAPI,
104{
105    fn op_muta_refb(&self, a: &mut Vec<MaybeUninit<TA>>, la: &Layout<D>, b: &Vec<TB>, lb: &Layout<D>) -> Result<()>
106    where
107        TB: Op<Output = TA>,
108    {
109        self.op_muta_refb_func(a, la, b, lb, &mut func)
110    }
111
112    fn op_muta(&self, a: &mut Vec<TA>, la: &Layout<D>) -> Result<()>
113    where
114        TA: Op<Output = TA>,
115    {
116        let a = unsafe { transmute::<&mut Vec<TA>, &mut Vec<MaybeUninit<TA>>>(a) };
117        self.op_muta_func(a, la, &mut func_inplace)
118    }
119}