1use tenferro_core_ops::PrimitiveOpKind;
2use tenferro_tensor::{
3 BackendId, DType, OperationCapability, SupportLevel, TensorBackendCapability,
4};
5
6use crate::CpuBackend;
7
8const U: SupportLevel = SupportLevel::Unsupported;
9const F: SupportLevel = SupportLevel::FallbackCopy;
10const N: SupportLevel = SupportLevel::Native;
11
12#[must_use]
28pub const fn cpu_capabilities() -> &'static [OperationCapability] {
29 CPU_CAPABILITIES
30}
31
32impl TensorBackendCapability for CpuBackend {
33 fn backend_id(&self) -> BackendId {
34 BackendId::Cpu
35 }
36
37 fn capabilities(&self) -> &'static [OperationCapability] {
38 CPU_CAPABILITIES
39 }
40}
41
42const fn owned_read(
43 op: PrimitiveOpKind,
44 dtype: DType,
45 output_dtype: DType,
46 level: SupportLevel,
47) -> OperationCapability {
48 OperationCapability {
49 backend: BackendId::Cpu,
50 op,
51 dtype,
52 output_dtype,
53 result: level,
54 read_inputs: level,
55 write_output: U,
56 strided_output: U,
57 accumulation: U,
58 }
59}
60
61const fn same_dtype(op: PrimitiveOpKind, dtype: DType, level: SupportLevel) -> OperationCapability {
62 owned_read(op, dtype, dtype, level)
63}
64
65const fn owned_read_write(
66 op: PrimitiveOpKind,
67 dtype: DType,
68 output_dtype: DType,
69 level: SupportLevel,
70 write_output: SupportLevel,
71) -> OperationCapability {
72 OperationCapability {
73 backend: BackendId::Cpu,
74 op,
75 dtype,
76 output_dtype,
77 result: level,
78 read_inputs: level,
79 write_output,
80 strided_output: U,
81 accumulation: U,
82 }
83}
84
85const fn same_dtype_write(
86 op: PrimitiveOpKind,
87 dtype: DType,
88 level: SupportLevel,
89 write_output: SupportLevel,
90) -> OperationCapability {
91 owned_read_write(op, dtype, dtype, level, write_output)
92}
93
94const fn dot_native(dtype: DType) -> OperationCapability {
95 OperationCapability {
96 backend: BackendId::Cpu,
97 op: PrimitiveOpKind::DotGeneral,
98 dtype,
99 output_dtype: dtype,
100 result: N,
101 read_inputs: N,
102 write_output: N,
103 strided_output: N,
104 accumulation: N,
105 }
106}
107
108const CPU_CAPABILITIES: &[OperationCapability] = &[
109 same_dtype_write(PrimitiveOpKind::Add, DType::F32, N, F),
110 same_dtype_write(PrimitiveOpKind::Add, DType::F64, N, F),
111 same_dtype_write(PrimitiveOpKind::Add, DType::I32, N, F),
112 same_dtype_write(PrimitiveOpKind::Add, DType::I64, N, F),
113 same_dtype_write(PrimitiveOpKind::Add, DType::C32, N, F),
114 same_dtype_write(PrimitiveOpKind::Add, DType::C64, N, F),
115 same_dtype_write(PrimitiveOpKind::Sub, DType::F32, N, F),
116 same_dtype_write(PrimitiveOpKind::Sub, DType::F64, N, F),
117 same_dtype_write(PrimitiveOpKind::Sub, DType::I32, N, F),
118 same_dtype_write(PrimitiveOpKind::Sub, DType::I64, N, F),
119 same_dtype_write(PrimitiveOpKind::Sub, DType::C32, N, F),
120 same_dtype_write(PrimitiveOpKind::Sub, DType::C64, N, F),
121 same_dtype_write(PrimitiveOpKind::Mul, DType::F32, N, F),
122 same_dtype_write(PrimitiveOpKind::Mul, DType::F64, N, F),
123 same_dtype_write(PrimitiveOpKind::Mul, DType::I32, N, F),
124 same_dtype_write(PrimitiveOpKind::Mul, DType::I64, N, F),
125 same_dtype_write(PrimitiveOpKind::Mul, DType::C32, N, F),
126 same_dtype_write(PrimitiveOpKind::Mul, DType::C64, N, F),
127 same_dtype_write(PrimitiveOpKind::Neg, DType::F32, N, F),
128 same_dtype_write(PrimitiveOpKind::Neg, DType::F64, N, F),
129 same_dtype_write(PrimitiveOpKind::Neg, DType::I32, N, F),
130 same_dtype_write(PrimitiveOpKind::Neg, DType::I64, N, F),
131 same_dtype_write(PrimitiveOpKind::Neg, DType::C32, N, F),
132 same_dtype_write(PrimitiveOpKind::Neg, DType::C64, N, F),
133 same_dtype_write(PrimitiveOpKind::Conj, DType::F32, N, F),
134 same_dtype_write(PrimitiveOpKind::Conj, DType::F64, N, F),
135 same_dtype_write(PrimitiveOpKind::Conj, DType::C32, N, F),
136 same_dtype_write(PrimitiveOpKind::Conj, DType::C64, N, F),
137 same_dtype_write(PrimitiveOpKind::Div, DType::F32, N, F),
138 same_dtype_write(PrimitiveOpKind::Div, DType::F64, N, F),
139 same_dtype_write(PrimitiveOpKind::Div, DType::I32, N, F),
140 same_dtype_write(PrimitiveOpKind::Div, DType::I64, N, F),
141 same_dtype_write(PrimitiveOpKind::Div, DType::C32, N, F),
142 same_dtype_write(PrimitiveOpKind::Div, DType::C64, N, F),
143 same_dtype(PrimitiveOpKind::Rem, DType::F32, N),
144 same_dtype(PrimitiveOpKind::Rem, DType::F64, N),
145 same_dtype(PrimitiveOpKind::Rem, DType::I32, N),
146 same_dtype(PrimitiveOpKind::Rem, DType::I64, N),
147 same_dtype(PrimitiveOpKind::Abs, DType::F32, N),
148 same_dtype(PrimitiveOpKind::Abs, DType::F64, N),
149 same_dtype(PrimitiveOpKind::Abs, DType::I32, N),
150 same_dtype(PrimitiveOpKind::Abs, DType::I64, N),
151 owned_read(PrimitiveOpKind::Abs, DType::C32, DType::F32, N),
152 owned_read(PrimitiveOpKind::Abs, DType::C64, DType::F64, N),
153 same_dtype(PrimitiveOpKind::Sign, DType::F32, N),
154 same_dtype(PrimitiveOpKind::Sign, DType::F64, N),
155 same_dtype(PrimitiveOpKind::Sign, DType::I32, N),
156 same_dtype(PrimitiveOpKind::Sign, DType::I64, N),
157 same_dtype(PrimitiveOpKind::Maximum, DType::F32, N),
158 same_dtype(PrimitiveOpKind::Maximum, DType::F64, N),
159 same_dtype(PrimitiveOpKind::Maximum, DType::I32, N),
160 same_dtype(PrimitiveOpKind::Maximum, DType::I64, N),
161 same_dtype(PrimitiveOpKind::Minimum, DType::F32, N),
162 same_dtype(PrimitiveOpKind::Minimum, DType::F64, N),
163 same_dtype(PrimitiveOpKind::Minimum, DType::I32, N),
164 same_dtype(PrimitiveOpKind::Minimum, DType::I64, N),
165 owned_read(PrimitiveOpKind::Compare, DType::F32, DType::Bool, N),
166 owned_read(PrimitiveOpKind::Compare, DType::F64, DType::Bool, N),
167 owned_read(PrimitiveOpKind::Compare, DType::I32, DType::Bool, N),
168 owned_read(PrimitiveOpKind::Compare, DType::I64, DType::Bool, N),
169 owned_read(PrimitiveOpKind::Compare, DType::Bool, DType::Bool, N),
170 same_dtype(PrimitiveOpKind::Select, DType::F32, N),
171 same_dtype(PrimitiveOpKind::Select, DType::F64, N),
172 same_dtype(PrimitiveOpKind::Select, DType::I32, N),
173 same_dtype(PrimitiveOpKind::Select, DType::I64, N),
174 same_dtype(PrimitiveOpKind::Select, DType::Bool, N),
175 same_dtype(PrimitiveOpKind::Select, DType::C32, N),
176 same_dtype(PrimitiveOpKind::Select, DType::C64, N),
177 same_dtype(PrimitiveOpKind::Clamp, DType::F32, N),
178 same_dtype(PrimitiveOpKind::Clamp, DType::F64, N),
179 same_dtype(PrimitiveOpKind::Exp, DType::F32, N),
180 same_dtype(PrimitiveOpKind::Exp, DType::F64, N),
181 same_dtype(PrimitiveOpKind::Exp, DType::C32, N),
182 same_dtype(PrimitiveOpKind::Exp, DType::C64, N),
183 same_dtype(PrimitiveOpKind::Log, DType::F32, N),
184 same_dtype(PrimitiveOpKind::Log, DType::F64, N),
185 same_dtype(PrimitiveOpKind::Log, DType::C32, N),
186 same_dtype(PrimitiveOpKind::Log, DType::C64, N),
187 same_dtype(PrimitiveOpKind::Sin, DType::F32, N),
188 same_dtype(PrimitiveOpKind::Sin, DType::F64, N),
189 same_dtype(PrimitiveOpKind::Sin, DType::C32, N),
190 same_dtype(PrimitiveOpKind::Sin, DType::C64, N),
191 same_dtype(PrimitiveOpKind::Cos, DType::F32, N),
192 same_dtype(PrimitiveOpKind::Cos, DType::F64, N),
193 same_dtype(PrimitiveOpKind::Cos, DType::C32, N),
194 same_dtype(PrimitiveOpKind::Cos, DType::C64, N),
195 same_dtype(PrimitiveOpKind::Tanh, DType::F32, N),
196 same_dtype(PrimitiveOpKind::Tanh, DType::F64, N),
197 same_dtype(PrimitiveOpKind::Tanh, DType::C32, N),
198 same_dtype(PrimitiveOpKind::Tanh, DType::C64, N),
199 same_dtype(PrimitiveOpKind::Sqrt, DType::F32, N),
200 same_dtype(PrimitiveOpKind::Sqrt, DType::F64, N),
201 same_dtype(PrimitiveOpKind::Sqrt, DType::C32, N),
202 same_dtype(PrimitiveOpKind::Sqrt, DType::C64, N),
203 same_dtype(PrimitiveOpKind::Rsqrt, DType::F32, N),
204 same_dtype(PrimitiveOpKind::Rsqrt, DType::F64, N),
205 same_dtype(PrimitiveOpKind::Rsqrt, DType::C32, N),
206 same_dtype(PrimitiveOpKind::Rsqrt, DType::C64, N),
207 same_dtype(PrimitiveOpKind::Pow, DType::F32, N),
208 same_dtype(PrimitiveOpKind::Pow, DType::F64, N),
209 same_dtype(PrimitiveOpKind::Pow, DType::I32, N),
210 same_dtype(PrimitiveOpKind::Pow, DType::I64, N),
211 same_dtype(PrimitiveOpKind::Pow, DType::C32, N),
212 same_dtype(PrimitiveOpKind::Pow, DType::C64, N),
213 same_dtype(PrimitiveOpKind::Expm1, DType::F32, N),
214 same_dtype(PrimitiveOpKind::Expm1, DType::F64, N),
215 same_dtype(PrimitiveOpKind::Expm1, DType::C32, N),
216 same_dtype(PrimitiveOpKind::Expm1, DType::C64, N),
217 same_dtype(PrimitiveOpKind::Log1p, DType::F32, N),
218 same_dtype(PrimitiveOpKind::Log1p, DType::F64, N),
219 same_dtype(PrimitiveOpKind::Log1p, DType::C32, N),
220 same_dtype(PrimitiveOpKind::Log1p, DType::C64, N),
221 same_dtype(PrimitiveOpKind::ReduceSum, DType::F32, N),
222 same_dtype(PrimitiveOpKind::ReduceSum, DType::F64, N),
223 same_dtype(PrimitiveOpKind::ReduceSum, DType::I32, N),
224 same_dtype(PrimitiveOpKind::ReduceSum, DType::I64, N),
225 same_dtype(PrimitiveOpKind::ReduceSum, DType::C32, N),
226 same_dtype(PrimitiveOpKind::ReduceSum, DType::C64, N),
227 same_dtype(PrimitiveOpKind::ReduceProd, DType::F32, N),
228 same_dtype(PrimitiveOpKind::ReduceProd, DType::F64, N),
229 same_dtype(PrimitiveOpKind::ReduceProd, DType::I32, N),
230 same_dtype(PrimitiveOpKind::ReduceProd, DType::I64, N),
231 same_dtype(PrimitiveOpKind::ReduceProd, DType::C32, N),
232 same_dtype(PrimitiveOpKind::ReduceProd, DType::C64, N),
233 same_dtype(PrimitiveOpKind::ReduceMax, DType::F32, N),
234 same_dtype(PrimitiveOpKind::ReduceMax, DType::F64, N),
235 same_dtype(PrimitiveOpKind::ReduceMax, DType::I32, N),
236 same_dtype(PrimitiveOpKind::ReduceMax, DType::I64, N),
237 same_dtype(PrimitiveOpKind::ReduceMin, DType::F32, N),
238 same_dtype(PrimitiveOpKind::ReduceMin, DType::F64, N),
239 same_dtype(PrimitiveOpKind::ReduceMin, DType::I32, N),
240 same_dtype(PrimitiveOpKind::ReduceMin, DType::I64, N),
241 dot_native(DType::F32),
242 dot_native(DType::F64),
243 dot_native(DType::C32),
244 dot_native(DType::C64),
245];
246
247#[cfg(test)]
248mod tests;