rstsr_openblas/rayon_auto_impl/
op_binary_arithmetic.rs1use 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}