Skip to content

Commit 589d3cd

Browse files
Arm backend: Make ops supported check TOSA profile-aware (pytorch#14063)
- Previously, BaseTOSASupportList was profile-agnostic, which complicated validation of ops available only in FP or INT profiles. - Make it TOSA profile-aware by splitting the single supported list into TOSA_PRO_INT_SupportList and TOSA_PRO_FP_SupportList in a new file. Signed-off-by: Yufeng Shi <[email protected]> Co-authored-by: Erik Lundell <[email protected]>
1 parent d324799 commit 589d3cd

File tree

3 files changed

+308
-205
lines changed

3 files changed

+308
-205
lines changed
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
# Copyright 2025 Arm Limited and/or its affiliates.
2+
#
3+
# This source code is licensed under the BSD-style license found in the
4+
# LICENSE file in the root directory of this source tree.
5+
6+
import operator
7+
from typing import Final, Set
8+
9+
import torch
10+
11+
from executorch.exir.dialects._ops import ops as exir_ops
12+
13+
14+
# INT profile: ops supported via native TOSA ops, decompositions/transformations, precompute, TableOps, etc.
15+
TOSA_PRO_INT_SupportList: Final[Set] = {
16+
exir_ops.edge.aten.abs.default,
17+
exir_ops.edge.aten.add.Tensor,
18+
exir_ops.edge.aten.any.default,
19+
exir_ops.edge.aten.any.dim,
20+
exir_ops.edge.aten.any.dims,
21+
exir_ops.edge.aten.bitwise_and.Tensor,
22+
exir_ops.edge.aten.bitwise_or.Tensor,
23+
exir_ops.edge.aten.bitwise_xor.Tensor,
24+
exir_ops.edge.aten.bitwise_and.Scalar,
25+
exir_ops.edge.aten.bitwise_or.Scalar,
26+
exir_ops.edge.aten.bitwise_xor.Scalar,
27+
exir_ops.edge.aten.logical_and.default,
28+
exir_ops.edge.aten.logical_or.default,
29+
exir_ops.edge.aten.logical_xor.default,
30+
exir_ops.edge.aten.logical_not.default,
31+
exir_ops.edge.aten.arange.start_step,
32+
exir_ops.edge.aten.expand_copy.default,
33+
exir_ops.edge.aten.cat.default,
34+
exir_ops.edge.aten.ceil.default,
35+
exir_ops.edge.aten.clamp.default,
36+
exir_ops.edge.aten.cumsum.default,
37+
exir_ops.edge.aten.bmm.default,
38+
exir_ops.edge.aten.permute_copy.default,
39+
exir_ops.edge.aten.hardsigmoid.default,
40+
exir_ops.edge.aten.hardtanh.default,
41+
exir_ops.edge.aten.hardswish.default,
42+
exir_ops.edge.aten.div.Tensor,
43+
exir_ops.edge.aten.div.Tensor_mode,
44+
exir_ops.edge.aten.eq.Tensor,
45+
exir_ops.edge.aten.eq.Scalar,
46+
exir_ops.edge.aten.erf.default,
47+
exir_ops.edge.aten.exp.default,
48+
exir_ops.edge.aten.expm1.default,
49+
exir_ops.edge.aten.log.default,
50+
exir_ops.edge.aten.linear.default,
51+
exir_ops.edge.aten.split_with_sizes_copy.default,
52+
exir_ops.edge.aten.floor.default,
53+
exir_ops.edge.aten.full.default,
54+
exir_ops.edge.aten.full_like.default,
55+
exir_ops.edge.aten.ge.Tensor,
56+
exir_ops.edge.aten.ge.Scalar,
57+
exir_ops.edge.aten.gt.Tensor,
58+
exir_ops.edge.aten.gt.Scalar,
59+
exir_ops.edge.aten.le.Tensor,
60+
exir_ops.edge.aten.le.Scalar,
61+
exir_ops.edge.aten.lt.Tensor,
62+
exir_ops.edge.aten.lt.Scalar,
63+
exir_ops.edge.aten.mul.Tensor,
64+
exir_ops.edge.aten.ne.Tensor,
65+
exir_ops.edge.aten.ne.Scalar,
66+
exir_ops.edge.aten.neg.default,
67+
exir_ops.edge.aten.add.Scalar,
68+
exir_ops.edge.aten.sub.Scalar,
69+
exir_ops.edge.aten.mul.Scalar,
70+
exir_ops.edge.aten.div.Scalar,
71+
exir_ops.edge.aten._native_batch_norm_legit_no_training.default,
72+
exir_ops.edge.aten.native_layer_norm.default,
73+
exir_ops.edge.aten.native_group_norm.default,
74+
exir_ops.edge.aten.sigmoid.default,
75+
exir_ops.edge.aten.mean.dim,
76+
exir_ops.edge.aten.mm.default,
77+
exir_ops.edge.aten.minimum.default,
78+
exir_ops.edge.aten.maximum.default,
79+
exir_ops.edge.aten.repeat.default,
80+
exir_ops.edge.aten.reciprocal.default,
81+
exir_ops.edge.aten.relu.default,
82+
exir_ops.edge.aten.leaky_relu.default,
83+
exir_ops.edge.aten.sqrt.default,
84+
exir_ops.edge.aten.rsqrt.default,
85+
exir_ops.edge.aten.round.default,
86+
exir_ops.edge.aten._softmax.default,
87+
exir_ops.edge.aten.select_copy.int,
88+
exir_ops.edge.aten._log_softmax.default,
89+
exir_ops.edge.aten.sub.Tensor,
90+
exir_ops.edge.aten.tanh.default,
91+
exir_ops.edge.aten.upsample_bilinear2d.vec,
92+
exir_ops.edge.aten.upsample_nearest2d.vec,
93+
exir_ops.edge.aten.var.correction,
94+
exir_ops.edge.aten.var.dim,
95+
exir_ops.edge.aten.view_copy.default,
96+
exir_ops.edge.aten.unsqueeze_copy.default,
97+
exir_ops.edge.aten.squeeze_copy.dims,
98+
exir_ops.edge.aten.pow.Tensor_Scalar,
99+
exir_ops.edge.aten.pow.Tensor_Tensor,
100+
exir_ops.edge.aten.where.self,
101+
operator.getitem,
102+
exir_ops.edge.quantized_decomposed.quantize_per_tensor.default,
103+
exir_ops.edge.quantized_decomposed.quantize_per_channel.default,
104+
exir_ops.edge.quantized_decomposed.dequantize_per_tensor.default,
105+
exir_ops.edge.quantized_decomposed.dequantize_per_channel.default,
106+
exir_ops.edge.aten.constant_pad_nd.default,
107+
exir_ops.edge.aten.amax.default,
108+
exir_ops.edge.aten.amin.default,
109+
exir_ops.edge.aten.eye.default,
110+
exir_ops.edge.aten.linspace.default,
111+
exir_ops.edge.aten.bitwise_left_shift.Tensor,
112+
exir_ops.edge.aten.__lshift__.Scalar,
113+
torch.ops.aten.scalar_tensor.default,
114+
exir_ops.edge.aten.gelu.default,
115+
exir_ops.edge.aten.alias_copy.default,
116+
exir_ops.edge.aten.sinh.default,
117+
exir_ops.edge.aten.atan.default,
118+
exir_ops.edge.aten.acosh.default,
119+
exir_ops.edge.aten._adaptive_avg_pool2d.default,
120+
exir_ops.edge.aten.sign.default,
121+
exir_ops.edge.aten.asin.default,
122+
exir_ops.edge.aten.atanh.default,
123+
exir_ops.edge.aten.addmm.default,
124+
exir_ops.edge.aten.masked_fill.Scalar,
125+
exir_ops.edge.aten.asinh.default,
126+
exir_ops.edge.aten.cosh.default,
127+
exir_ops.edge.aten.glu.default,
128+
exir_ops.edge.aten.logit.default,
129+
exir_ops.edge.aten.acos.default,
130+
exir_ops.edge.aten.elu.default,
131+
}
132+
133+
134+
# FP profile: ops supported via native TOSA ops, decompositions/transformations, precompute, etc.
135+
TOSA_PRO_FP_SupportList: Final[Set] = {
136+
exir_ops.edge.aten.abs.default,
137+
exir_ops.edge.aten.add.Tensor,
138+
exir_ops.edge.aten.any.default,
139+
exir_ops.edge.aten.any.dim,
140+
exir_ops.edge.aten.any.dims,
141+
exir_ops.edge.aten.logical_and.default,
142+
exir_ops.edge.aten.logical_or.default,
143+
exir_ops.edge.aten.logical_xor.default,
144+
exir_ops.edge.aten.logical_not.default,
145+
exir_ops.edge.aten.arange.start_step,
146+
exir_ops.edge.aten.expand_copy.default,
147+
exir_ops.edge.aten.cat.default,
148+
exir_ops.edge.aten.ceil.default,
149+
exir_ops.edge.aten.clamp.default,
150+
exir_ops.edge.aten.cumsum.default,
151+
exir_ops.edge.aten.bmm.default,
152+
exir_ops.edge.aten.permute_copy.default,
153+
exir_ops.edge.aten.hardsigmoid.default,
154+
exir_ops.edge.aten.hardtanh.default,
155+
exir_ops.edge.aten.hardswish.default,
156+
exir_ops.edge.aten.div.Tensor,
157+
exir_ops.edge.aten.div.Tensor_mode,
158+
exir_ops.edge.aten.eq.Tensor,
159+
exir_ops.edge.aten.eq.Scalar,
160+
exir_ops.edge.aten.erf.default,
161+
exir_ops.edge.aten.exp.default,
162+
exir_ops.edge.aten.expm1.default,
163+
exir_ops.edge.aten.log.default,
164+
exir_ops.edge.aten.linear.default,
165+
exir_ops.edge.aten.split_with_sizes_copy.default,
166+
exir_ops.edge.aten.floor.default,
167+
exir_ops.edge.aten.full.default,
168+
exir_ops.edge.aten.full_like.default,
169+
exir_ops.edge.aten.ge.Tensor,
170+
exir_ops.edge.aten.ge.Scalar,
171+
exir_ops.edge.aten.gt.Tensor,
172+
exir_ops.edge.aten.gt.Scalar,
173+
exir_ops.edge.aten.le.Tensor,
174+
exir_ops.edge.aten.le.Scalar,
175+
exir_ops.edge.aten.lt.Tensor,
176+
exir_ops.edge.aten.lt.Scalar,
177+
exir_ops.edge.aten.mul.Tensor,
178+
exir_ops.edge.aten.ne.Tensor,
179+
exir_ops.edge.aten.ne.Scalar,
180+
exir_ops.edge.aten.neg.default,
181+
exir_ops.edge.aten.add.Scalar,
182+
exir_ops.edge.aten.sub.Scalar,
183+
exir_ops.edge.aten.mul.Scalar,
184+
exir_ops.edge.aten.div.Scalar,
185+
exir_ops.edge.aten._native_batch_norm_legit_no_training.default,
186+
exir_ops.edge.aten.native_layer_norm.default,
187+
exir_ops.edge.aten.native_group_norm.default,
188+
exir_ops.edge.aten.sigmoid.default,
189+
exir_ops.edge.aten.mean.dim,
190+
exir_ops.edge.aten.mm.default,
191+
exir_ops.edge.aten.minimum.default,
192+
exir_ops.edge.aten.maximum.default,
193+
exir_ops.edge.aten.repeat.default,
194+
exir_ops.edge.aten.reciprocal.default,
195+
exir_ops.edge.aten.relu.default,
196+
exir_ops.edge.aten.leaky_relu.default,
197+
exir_ops.edge.aten.sqrt.default,
198+
exir_ops.edge.aten.rsqrt.default,
199+
exir_ops.edge.aten.round.default,
200+
exir_ops.edge.aten._softmax.default,
201+
exir_ops.edge.aten.select_copy.int,
202+
exir_ops.edge.aten._log_softmax.default,
203+
exir_ops.edge.aten.sub.Tensor,
204+
exir_ops.edge.aten.tanh.default,
205+
exir_ops.edge.aten.upsample_bilinear2d.vec,
206+
exir_ops.edge.aten.upsample_nearest2d.vec,
207+
exir_ops.edge.aten.var.correction,
208+
exir_ops.edge.aten.var.dim,
209+
exir_ops.edge.aten.view_copy.default,
210+
exir_ops.edge.aten.unsqueeze_copy.default,
211+
exir_ops.edge.aten.squeeze_copy.dims,
212+
exir_ops.edge.aten.pow.Tensor_Scalar,
213+
exir_ops.edge.aten.pow.Tensor_Tensor,
214+
exir_ops.edge.aten.where.self,
215+
operator.getitem,
216+
exir_ops.edge.aten.constant_pad_nd.default,
217+
exir_ops.edge.aten.amax.default,
218+
exir_ops.edge.aten.amin.default,
219+
exir_ops.edge.aten.eye.default,
220+
exir_ops.edge.aten.linspace.default,
221+
exir_ops.edge.aten.bitwise_left_shift.Tensor,
222+
exir_ops.edge.aten.__lshift__.Scalar,
223+
torch.ops.aten.scalar_tensor.default,
224+
exir_ops.edge.aten.gelu.default,
225+
exir_ops.edge.aten.alias_copy.default,
226+
exir_ops.edge.aten.sinh.default,
227+
exir_ops.edge.aten.atan.default,
228+
exir_ops.edge.aten.acosh.default,
229+
exir_ops.edge.aten._adaptive_avg_pool2d.default,
230+
exir_ops.edge.aten.sign.default,
231+
exir_ops.edge.aten.asin.default,
232+
exir_ops.edge.aten.atanh.default,
233+
exir_ops.edge.aten.addmm.default,
234+
exir_ops.edge.aten.masked_fill.Scalar,
235+
exir_ops.edge.aten.asinh.default,
236+
exir_ops.edge.aten.cosh.default,
237+
exir_ops.edge.aten.glu.default,
238+
exir_ops.edge.aten.logit.default,
239+
exir_ops.edge.aten.acos.default,
240+
exir_ops.edge.aten.elu.default,
241+
}
242+
243+
244+
__all__ = [
245+
"TOSA_PRO_INT_SupportList",
246+
"TOSA_PRO_FP_SupportList",
247+
]

0 commit comments

Comments
 (0)