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
18extern "C" {
19#endif
20
21/**
22 * @brief Status code for any QNNPACK function call.
23 */
24enum 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
34enum qnnp_status qnnp_initialize(void);
35
36enum qnnp_status qnnp_deinitialize(void);
37
38typedef struct qnnp_operator* qnnp_operator_t;
39
40enum 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
67enum 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
78enum 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
107enum 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
118enum 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
134enum 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
142enum 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
153enum 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
162enum 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
181enum 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
192enum 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
209enum 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
220enum 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
226enum 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
234enum 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
247enum 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
257enum 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
264enum 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
272enum 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
283enum 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
291enum 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
303enum 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
311enum 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
319enum 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
327enum qnnp_status qnnp_run_operator(
328 qnnp_operator_t op,
329 pthreadpool_t threadpool);
330
331enum qnnp_status qnnp_delete_operator(
332 qnnp_operator_t op);
333
334#ifdef __cplusplus
335} /* extern "C" */
336#endif
337