tract_linalg/generic/
by_scalar.rs

1use tract_data::internal::f16;
2
3by_scalar_impl_wrap!(
4    f32,
5    SMulByScalar4,
6    4,
7    4,
8    f32,
9    fn run(x: &mut [f32], s: f32) {
10        debug_assert!(x.len() % Self::nr() == 0);
11        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
12        x.iter_mut().for_each(|px| *px *= s)
13    }
14);
15
16by_scalar_impl_wrap!(
17    f32,
18    SAddByScalar4,
19    4,
20    4,
21    f32,
22    fn run(x: &mut [f32], s: f32) {
23        debug_assert!(x.len() % Self::nr() == 0);
24        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
25        x.iter_mut().for_each(|px| *px += s)
26    }
27);
28
29by_scalar_impl_wrap!(
30    f32,
31    SSubByScalar4,
32    4,
33    4,
34    f32,
35    fn run(x: &mut [f32], s: f32) {
36        debug_assert!(x.len() % Self::nr() == 0);
37        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
38        x.iter_mut().for_each(|px| *px -= s)
39    }
40);
41
42by_scalar_impl_wrap!(
43    f32,
44    SSubFByScalar4,
45    4,
46    4,
47    f32,
48    fn run(x: &mut [f32], s: f32) {
49        debug_assert!(x.len() % Self::nr() == 0);
50        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
51        x.iter_mut().for_each(|px| *px = s - *px)
52    }
53);
54
55by_scalar_impl_wrap!(
56    f32,
57    SMinByScalar4,
58    4,
59    4,
60    f32,
61    fn run(x: &mut [f32], s: f32) {
62        debug_assert!(x.len() % Self::nr() == 0);
63        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
64        x.iter_mut().for_each(|px| *px = px.min(s))
65    }
66);
67
68by_scalar_impl_wrap!(
69    f32,
70    SMaxByScalar4,
71    4,
72    4,
73    f32,
74    fn run(x: &mut [f32], s: f32) {
75        debug_assert!(x.len() % Self::nr() == 0);
76        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
77        x.iter_mut().for_each(|px| *px = px.max(s))
78    }
79);
80
81#[cfg(test)]
82#[macro_use]
83pub mod mul_by_scalar_f32 {
84    use super::*;
85    by_scalar_frame_tests!(true, f32, SMulByScalar4, |a, b| a * b);
86    by_scalar_frame_tests!(true, f32, SAddByScalar4, |a, b| a + b );
87    by_scalar_frame_tests!(true, f32, SSubByScalar4, |a, b| a - b);
88    by_scalar_frame_tests!(true, f32, SSubFByScalar4, |a, b| b - a);
89    by_scalar_frame_tests!(true, f32, SMinByScalar4, |a, b| a.min(b));
90    by_scalar_frame_tests!(true, f32, SMaxByScalar4, |a, b| a.max(b));
91}
92
93by_scalar_impl_wrap!(
94    f16,
95    HMulByScalar8,
96    8,
97    8,
98    f16,
99    fn run(x: &mut [f16], s: f16) {
100        debug_assert!(x.len() % Self::nr() == 0);
101        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
102        x.iter_mut().for_each(|px| *px *= s)
103    }
104);
105
106by_scalar_impl_wrap!(
107    f16,
108    HAddByScalar8,
109    8,
110    8,
111    f16,
112    fn run(x: &mut [f16], s: f16) {
113        debug_assert!(x.len() % Self::nr() == 0);
114        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
115        x.iter_mut().for_each(|px| *px += s)
116    }
117);
118
119by_scalar_impl_wrap!(
120    f16,
121    HSubByScalar8,
122    8,
123    8,
124    f16,
125    fn run(x: &mut [f16], s: f16) {
126        debug_assert!(x.len() % Self::nr() == 0);
127        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
128        x.iter_mut().for_each(|px| *px -= s)
129    }
130);
131
132by_scalar_impl_wrap!(
133    f16,
134    HSubFByScalar8,
135    8,
136    8,
137    f16,
138    fn run(x: &mut [f16], s: f16) {
139        debug_assert!(x.len() % Self::nr() == 0);
140        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
141        x.iter_mut().for_each(|px| *px = s - *px)
142    }
143);
144
145by_scalar_impl_wrap!(
146    f16,
147    HMinByScalar8,
148    8,
149    8,
150    f16,
151    fn run(x: &mut [f16], s: f16) {
152        debug_assert!(x.len() % Self::nr() == 0);
153        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
154        x.iter_mut().for_each(|px| *px = px.min(s))
155    }
156);
157
158by_scalar_impl_wrap!(
159    f16,
160    HMaxByScalar8,
161    8,
162    8,
163    f16,
164    fn run(x: &mut [f16], s: f16) {
165        debug_assert!(x.len() % Self::nr() == 0);
166        debug_assert!(x.as_ptr() as usize % Self::alignment_bytes() == 0);
167        x.iter_mut().for_each(|px| *px = px.max(s))
168    }
169);
170
171#[cfg(test)]
172#[macro_use]
173pub mod mul_by_scalar_f16 {
174    use super::*;
175    by_scalar_frame_tests!(true, f16, HMulByScalar8, |a, b| a * b);
176    by_scalar_frame_tests!(true, f16, HAddByScalar8, |a, b| a + b);
177    by_scalar_frame_tests!(true, f16, HSubByScalar8, |a, b| a - b);
178    by_scalar_frame_tests!(true, f16, HSubFByScalar8, |a, b| b - a);
179    by_scalar_frame_tests!(true, f16, HMinByScalar8, |a, b| a.min(b));
180    by_scalar_frame_tests!(true, f16, HMaxByScalar8, |a, b| a.max(b));
181}