1 | /* |
2 | * Copyright (c) Facebook, Inc. and its affiliates. |
3 | * All rights reserved. |
4 | * |
5 | * This source code is licensed under the BSD-style license found in the |
6 | * LICENSE file in the root directory of this source tree. |
7 | */ |
8 | |
9 | #pragma once |
10 | |
11 | #include <stdbool.h> |
12 | #include <stddef.h> |
13 | #include <stdint.h> |
14 | |
15 | #include <pthreadpool.h> |
16 | |
17 | #ifdef __cplusplus |
18 | extern "C" { |
19 | #endif |
20 | |
21 | /** |
22 | * @brief Status code for any QNNPACK function call. |
23 | */ |
24 | enum qnnp_status { |
25 | /** The call succeeded, and all output arguments now contain valid data. */ |
26 | qnnp_status_success = 0, |
27 | qnnp_status_uninitialized = 1, |
28 | qnnp_status_invalid_parameter = 2, |
29 | qnnp_status_unsupported_parameter = 3, |
30 | qnnp_status_unsupported_hardware = 4, |
31 | qnnp_status_out_of_memory = 5, |
32 | }; |
33 | |
34 | enum qnnp_status qnnp_initialize(void); |
35 | |
36 | enum qnnp_status qnnp_deinitialize(void); |
37 | |
38 | typedef struct qnnp_operator* qnnp_operator_t; |
39 | |
40 | enum qnnp_status qnnp_create_convolution2d_nhwc_q8( |
41 | uint32_t input_padding_top, |
42 | uint32_t input_padding_right, |
43 | uint32_t input_padding_bottom, |
44 | uint32_t input_padding_left, |
45 | uint32_t kernel_height, |
46 | uint32_t kernel_width, |
47 | uint32_t subsampling_height, |
48 | uint32_t subsampling_width, |
49 | uint32_t dilation_height, |
50 | uint32_t dilation_width, |
51 | uint32_t groups, |
52 | size_t group_input_channels, |
53 | size_t group_output_channels, |
54 | uint8_t input_zero_point, |
55 | float input_scale, |
56 | uint8_t kernel_zero_point, |
57 | float kernel_scale, |
58 | const uint8_t* kernel, |
59 | const int32_t* bias, |
60 | uint8_t output_zero_point, |
61 | float output_scale, |
62 | uint8_t output_min, |
63 | uint8_t output_max, |
64 | uint32_t flags, |
65 | qnnp_operator_t* convolution); |
66 | |
67 | enum qnnp_status qnnp_setup_convolution2d_nhwc_q8( |
68 | qnnp_operator_t convolution, |
69 | size_t batch_size, |
70 | size_t input_height, |
71 | size_t input_width, |
72 | const uint8_t* input, |
73 | size_t input_stride, |
74 | uint8_t* output, |
75 | size_t output_stride, |
76 | pthreadpool_t threadpool); |
77 | |
78 | enum qnnp_status qnnp_create_deconvolution2d_nhwc_q8( |
79 | uint32_t input_padding_top, |
80 | uint32_t input_padding_right, |
81 | uint32_t input_padding_bottom, |
82 | uint32_t input_padding_left, |
83 | uint32_t adjustment_height, |
84 | uint32_t adjustment_width, |
85 | uint32_t kernel_height, |
86 | uint32_t kernel_width, |
87 | uint32_t stride_height, |
88 | uint32_t stride_width, |
89 | uint32_t dilation_height, |
90 | uint32_t dilation_width, |
91 | uint32_t groups, |
92 | size_t group_input_channels, |
93 | size_t group_output_channels, |
94 | uint8_t input_zero_point, |
95 | float input_scale, |
96 | uint8_t kernel_zero_point, |
97 | float kernel_scale, |
98 | const uint8_t* kernel, |
99 | const int32_t* bias, |
100 | uint8_t output_zero_point, |
101 | float output_scale, |
102 | uint8_t output_min, |
103 | uint8_t output_max, |
104 | uint32_t flags, |
105 | qnnp_operator_t* deconvolution); |
106 | |
107 | enum qnnp_status qnnp_setup_deconvolution2d_nhwc_q8( |
108 | qnnp_operator_t deconvolution, |
109 | size_t batch_size, |
110 | size_t input_height, |
111 | size_t input_width, |
112 | const uint8_t* input, |
113 | size_t input_stride, |
114 | uint8_t* output, |
115 | size_t output_stride, |
116 | pthreadpool_t threadpool); |
117 | |
118 | enum qnnp_status qnnp_create_fully_connected_nc_q8( |
119 | size_t input_channels, |
120 | size_t output_channels, |
121 | uint8_t input_zero_point, |
122 | float input_scale, |
123 | uint8_t kernel_zero_point, |
124 | float kernel_scale, |
125 | const uint8_t* kernel, |
126 | const int32_t* bias, |
127 | uint8_t output_zero_point, |
128 | float output_scale, |
129 | uint8_t output_min, |
130 | uint8_t output_max, |
131 | uint32_t flags, |
132 | qnnp_operator_t* fully_connected); |
133 | |
134 | enum qnnp_status qnnp_setup_fully_connected_nc_q8( |
135 | qnnp_operator_t fully_connected, |
136 | size_t batch_size, |
137 | const uint8_t* input, |
138 | size_t input_stride, |
139 | uint8_t* output, |
140 | size_t output_stride); |
141 | |
142 | enum qnnp_status qnnp_create_global_average_pooling_nwc_q8( |
143 | size_t channels, |
144 | uint8_t input_zero_point, |
145 | float input_scale, |
146 | uint8_t output_zero_point, |
147 | float output_scale, |
148 | uint8_t output_min, |
149 | uint8_t output_max, |
150 | uint32_t flags, |
151 | qnnp_operator_t* global_average_pooling); |
152 | |
153 | enum qnnp_status qnnp_setup_global_average_pooling_nwc_q8( |
154 | qnnp_operator_t global_average_pooling, |
155 | size_t batch_size, |
156 | size_t width, |
157 | const uint8_t* input, |
158 | size_t input_stride, |
159 | uint8_t* output, |
160 | size_t output_stride); |
161 | |
162 | enum qnnp_status qnnp_create_average_pooling2d_nhwc_q8( |
163 | uint32_t input_padding_top, |
164 | uint32_t input_padding_right, |
165 | uint32_t input_padding_bottom, |
166 | uint32_t input_padding_left, |
167 | uint32_t pooling_height, |
168 | uint32_t pooling_width, |
169 | uint32_t stride_height, |
170 | uint32_t stride_width, |
171 | size_t channels, |
172 | uint8_t input_zero_point, |
173 | float input_scale, |
174 | uint8_t output_zero_point, |
175 | float output_scale, |
176 | uint8_t output_min, |
177 | uint8_t output_max, |
178 | uint32_t flags, |
179 | qnnp_operator_t* average_pooling); |
180 | |
181 | enum qnnp_status qnnp_setup_average_pooling2d_nhwc_q8( |
182 | qnnp_operator_t average_pooling, |
183 | size_t batch_size, |
184 | size_t input_height, |
185 | size_t input_width, |
186 | const uint8_t* input, |
187 | size_t input_stride, |
188 | uint8_t* output, |
189 | size_t output_stride, |
190 | pthreadpool_t threadpool); |
191 | |
192 | enum qnnp_status qnnp_create_max_pooling2d_nhwc_u8( |
193 | uint32_t input_padding_top, |
194 | uint32_t input_padding_right, |
195 | uint32_t input_padding_bottom, |
196 | uint32_t input_padding_left, |
197 | uint32_t pooling_height, |
198 | uint32_t pooling_width, |
199 | uint32_t stride_height, |
200 | uint32_t stride_width, |
201 | uint32_t dilation_height, |
202 | uint32_t dilation_width, |
203 | size_t channels, |
204 | uint8_t output_min, |
205 | uint8_t output_max, |
206 | uint32_t flags, |
207 | qnnp_operator_t* max_pooling); |
208 | |
209 | enum qnnp_status qnnp_setup_max_pooling2d_nhwc_u8( |
210 | qnnp_operator_t max_pooling, |
211 | size_t batch_size, |
212 | size_t input_height, |
213 | size_t input_width, |
214 | const uint8_t* input, |
215 | size_t input_stride, |
216 | uint8_t* output, |
217 | size_t output_stride, |
218 | pthreadpool_t threadpool); |
219 | |
220 | enum qnnp_status qnnp_create_channel_shuffle_nc_x8( |
221 | size_t groups, |
222 | size_t group_channels, |
223 | uint32_t flags, |
224 | qnnp_operator_t* channel_shuffle); |
225 | |
226 | enum qnnp_status qnnp_setup_channel_shuffle_nc_x8( |
227 | qnnp_operator_t channel_shuffle, |
228 | size_t batch_size, |
229 | const uint8_t* input, |
230 | size_t input_stride, |
231 | uint8_t* output, |
232 | size_t output_stride); |
233 | |
234 | enum qnnp_status qnnp_create_add_nc_q8( |
235 | size_t channels, |
236 | uint8_t a_zero_point, |
237 | float a_scale, |
238 | uint8_t b_zero_point, |
239 | float b_scale, |
240 | uint8_t sum_zero_point, |
241 | float sum_scale, |
242 | uint8_t sum_min, |
243 | uint8_t sum_max, |
244 | uint32_t flags, |
245 | qnnp_operator_t* add); |
246 | |
247 | enum qnnp_status qnnp_setup_add_nc_q8( |
248 | qnnp_operator_t add, |
249 | size_t batch_size, |
250 | const uint8_t* a, |
251 | size_t a_stride, |
252 | const uint8_t* b, |
253 | size_t b_stride, |
254 | uint8_t* sum, |
255 | size_t sum_stride); |
256 | |
257 | enum qnnp_status qnnp_create_clamp_nc_u8( |
258 | size_t channels, |
259 | uint8_t output_min, |
260 | uint8_t output_max, |
261 | uint32_t flags, |
262 | qnnp_operator_t* clamp); |
263 | |
264 | enum qnnp_status qnnp_setup_clamp_nc_u8( |
265 | qnnp_operator_t clamp, |
266 | size_t batch_size, |
267 | const uint8_t* input, |
268 | size_t input_stride, |
269 | uint8_t* output, |
270 | size_t output_stride); |
271 | |
272 | enum qnnp_status qnnp_create_sigmoid_nc_q8( |
273 | size_t channels, |
274 | uint8_t input_zero_point, |
275 | float input_scale, |
276 | uint8_t output_zero_point, |
277 | float output_scale, |
278 | uint8_t output_min, |
279 | uint8_t output_max, |
280 | uint32_t flags, |
281 | qnnp_operator_t* sigmoid); |
282 | |
283 | enum qnnp_status qnnp_setup_sigmoid_nc_q8( |
284 | qnnp_operator_t sigmoid, |
285 | size_t batch_size, |
286 | const uint8_t* input, |
287 | size_t input_stride, |
288 | uint8_t* output, |
289 | size_t output_stride); |
290 | |
291 | enum qnnp_status qnnp_create_leaky_relu_nc_q8( |
292 | size_t channels, |
293 | float negative_slope, |
294 | uint8_t input_zero_point, |
295 | float input_scale, |
296 | uint8_t output_zero_point, |
297 | float output_scale, |
298 | uint8_t output_min, |
299 | uint8_t output_max, |
300 | uint32_t flags, |
301 | qnnp_operator_t* leaky_relu); |
302 | |
303 | enum qnnp_status qnnp_setup_leaky_relu_nc_q8( |
304 | qnnp_operator_t leaky_relu, |
305 | size_t batch_size, |
306 | const uint8_t* input, |
307 | size_t input_stride, |
308 | uint8_t* output, |
309 | size_t output_stride); |
310 | |
311 | enum qnnp_status qnnp_create_softargmax_nc_q8( |
312 | size_t channels, |
313 | float input_scale, |
314 | uint8_t output_zero_point, |
315 | float output_scale, |
316 | uint32_t flags, |
317 | qnnp_operator_t* softargmax); |
318 | |
319 | enum qnnp_status qnnp_setup_softargmax_nc_q8( |
320 | qnnp_operator_t softargmax, |
321 | size_t batch_size, |
322 | const uint8_t* input, |
323 | size_t input_stride, |
324 | uint8_t* output, |
325 | size_t output_stride); |
326 | |
327 | enum qnnp_status qnnp_run_operator( |
328 | qnnp_operator_t op, |
329 | pthreadpool_t threadpool); |
330 | |
331 | enum qnnp_status qnnp_delete_operator( |
332 | qnnp_operator_t op); |
333 | |
334 | #ifdef __cplusplus |
335 | } /* extern "C" */ |
336 | #endif |
337 | |