xref: /aosp_15_r20/external/XNNPACK/src/operators/prelu-nc.c (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker 
6*4bdc9457SAndroid Build Coastguard Worker #include <math.h>
7*4bdc9457SAndroid Build Coastguard Worker #include <stddef.h>
8*4bdc9457SAndroid Build Coastguard Worker #include <stdint.h>
9*4bdc9457SAndroid Build Coastguard Worker #include <stdlib.h>
10*4bdc9457SAndroid Build Coastguard Worker #include <string.h>
11*4bdc9457SAndroid Build Coastguard Worker 
12*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
13*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/allocator.h>
14*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/cache.h>
15*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/log.h>
16*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/operator.h>
17*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/pack.h>
18*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/microparams-init.h>
19*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/params.h>
20*4bdc9457SAndroid Build Coastguard Worker 
21*4bdc9457SAndroid Build Coastguard Worker 
create_prelu_nc(size_t channels,size_t input_stride,size_t output_stride,const void * negative_slope,uint32_t flags,uint32_t log2_weights_element_size,xnn_pack_prelu_w_function pack_prelu_w,uint32_t datatype_init_flags,enum xnn_operator_type operator_type,xnn_caches_t caches,xnn_operator_t * prelu_op_out)22*4bdc9457SAndroid Build Coastguard Worker static enum xnn_status create_prelu_nc(
23*4bdc9457SAndroid Build Coastguard Worker     size_t channels,
24*4bdc9457SAndroid Build Coastguard Worker     size_t input_stride,
25*4bdc9457SAndroid Build Coastguard Worker     size_t output_stride,
26*4bdc9457SAndroid Build Coastguard Worker     const void* negative_slope,
27*4bdc9457SAndroid Build Coastguard Worker     uint32_t flags,
28*4bdc9457SAndroid Build Coastguard Worker     uint32_t log2_weights_element_size,
29*4bdc9457SAndroid Build Coastguard Worker     xnn_pack_prelu_w_function pack_prelu_w,
30*4bdc9457SAndroid Build Coastguard Worker     uint32_t datatype_init_flags,
31*4bdc9457SAndroid Build Coastguard Worker     enum xnn_operator_type operator_type,
32*4bdc9457SAndroid Build Coastguard Worker     xnn_caches_t caches,
33*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t* prelu_op_out)
34*4bdc9457SAndroid Build Coastguard Worker {
35*4bdc9457SAndroid Build Coastguard Worker   xnn_operator_t prelu_op = NULL;
36*4bdc9457SAndroid Build Coastguard Worker   enum xnn_status status = xnn_status_uninitialized;
37*4bdc9457SAndroid Build Coastguard Worker 
38*4bdc9457SAndroid Build Coastguard Worker   if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) == 0) {
39*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error("failed to setup %s operator: XNNPACK is not initialized",
40*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(operator_type));
41*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_uninitialized;
42*4bdc9457SAndroid Build Coastguard Worker   }
43*4bdc9457SAndroid Build Coastguard Worker 
44*4bdc9457SAndroid Build Coastguard Worker   status = xnn_status_unsupported_hardware;
45*4bdc9457SAndroid Build Coastguard Worker 
46*4bdc9457SAndroid Build Coastguard Worker   if ((xnn_params.init_flags & datatype_init_flags) != datatype_init_flags) {
47*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error(
48*4bdc9457SAndroid Build Coastguard Worker       "failed to create %s operator: operations on data type are not supported",
49*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(operator_type));
50*4bdc9457SAndroid Build Coastguard Worker     goto error;
51*4bdc9457SAndroid Build Coastguard Worker   }
52*4bdc9457SAndroid Build Coastguard Worker 
53*4bdc9457SAndroid Build Coastguard Worker   status = xnn_status_invalid_parameter;
54*4bdc9457SAndroid Build Coastguard Worker 
55*4bdc9457SAndroid Build Coastguard Worker   if (channels == 0) {
56*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error(
57*4bdc9457SAndroid Build Coastguard Worker       "failed to create %s operator with %zu channels: number of channels must be non-zero",
58*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(operator_type), channels);
59*4bdc9457SAndroid Build Coastguard Worker     goto error;
60*4bdc9457SAndroid Build Coastguard Worker   }
61*4bdc9457SAndroid Build Coastguard Worker 
62*4bdc9457SAndroid Build Coastguard Worker   if (input_stride < channels) {
63*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error(
64*4bdc9457SAndroid Build Coastguard Worker       "failed to create %s operator with input element stride of %zu: "
65*4bdc9457SAndroid Build Coastguard Worker       "stride must be at least as large as the number of channels (%zu)",
66*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(operator_type), input_stride, channels);
67*4bdc9457SAndroid Build Coastguard Worker     goto error;
68*4bdc9457SAndroid Build Coastguard Worker   }
69*4bdc9457SAndroid Build Coastguard Worker 
70*4bdc9457SAndroid Build Coastguard Worker   if (output_stride < channels) {
71*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error(
72*4bdc9457SAndroid Build Coastguard Worker       "failed to create %s operator with output element stride of %zu: "
73*4bdc9457SAndroid Build Coastguard Worker       "stride must be at least as large as the number of channels (%zu)",
74*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(operator_type), output_stride, channels);
75*4bdc9457SAndroid Build Coastguard Worker     goto error;
76*4bdc9457SAndroid Build Coastguard Worker   }
77*4bdc9457SAndroid Build Coastguard Worker 
78*4bdc9457SAndroid Build Coastguard Worker   status = xnn_status_out_of_memory;
79*4bdc9457SAndroid Build Coastguard Worker 
80*4bdc9457SAndroid Build Coastguard Worker   prelu_op = xnn_allocate_zero_simd_memory(sizeof(struct xnn_operator));
81*4bdc9457SAndroid Build Coastguard Worker   if (prelu_op == NULL) {
82*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error(
83*4bdc9457SAndroid Build Coastguard Worker       "failed to allocate %zu bytes for %s operator descriptor",
84*4bdc9457SAndroid Build Coastguard Worker       sizeof(struct xnn_operator), xnn_operator_type_to_string(operator_type));
85*4bdc9457SAndroid Build Coastguard Worker     goto error;
86*4bdc9457SAndroid Build Coastguard Worker   }
87*4bdc9457SAndroid Build Coastguard Worker 
88*4bdc9457SAndroid Build Coastguard Worker   if (caches != NULL) {
89*4bdc9457SAndroid Build Coastguard Worker     prelu_op->weights_cache = caches->weights_cache;
90*4bdc9457SAndroid Build Coastguard Worker   }
91*4bdc9457SAndroid Build Coastguard Worker 
92*4bdc9457SAndroid Build Coastguard Worker   const size_t packed_weights_size = (channels << log2_weights_element_size) + XNN_EXTRA_BYTES;
93*4bdc9457SAndroid Build Coastguard Worker   const size_t aligned_total_weights_size = round_up_po2(packed_weights_size, XNN_ALLOCATION_ALIGNMENT);
94*4bdc9457SAndroid Build Coastguard Worker   void* weights_ptr = xnn_get_pointer_to_write_weights(prelu_op, aligned_total_weights_size, 0);
95*4bdc9457SAndroid Build Coastguard Worker   pack_prelu_w(channels, negative_slope, weights_ptr);
96*4bdc9457SAndroid Build Coastguard Worker 
97*4bdc9457SAndroid Build Coastguard Worker   if (use_weights_cache(prelu_op)) {
98*4bdc9457SAndroid Build Coastguard Worker     prelu_op->packed_weights.offset = xnn_get_or_insert_weights_cache(
99*4bdc9457SAndroid Build Coastguard Worker         prelu_op->weights_cache, weights_ptr, aligned_total_weights_size);
100*4bdc9457SAndroid Build Coastguard Worker   }
101*4bdc9457SAndroid Build Coastguard Worker 
102*4bdc9457SAndroid Build Coastguard Worker   prelu_op->channels = channels;
103*4bdc9457SAndroid Build Coastguard Worker   prelu_op->input_pixel_stride = input_stride;
104*4bdc9457SAndroid Build Coastguard Worker   prelu_op->output_pixel_stride = output_stride;
105*4bdc9457SAndroid Build Coastguard Worker 
106*4bdc9457SAndroid Build Coastguard Worker   prelu_op->type = operator_type;
107*4bdc9457SAndroid Build Coastguard Worker   prelu_op->flags = flags;
108*4bdc9457SAndroid Build Coastguard Worker 
109*4bdc9457SAndroid Build Coastguard Worker   prelu_op->state = xnn_run_state_invalid;
110*4bdc9457SAndroid Build Coastguard Worker 
111*4bdc9457SAndroid Build Coastguard Worker   *prelu_op_out = prelu_op;
112*4bdc9457SAndroid Build Coastguard Worker   return xnn_status_success;
113*4bdc9457SAndroid Build Coastguard Worker 
114*4bdc9457SAndroid Build Coastguard Worker error:
115*4bdc9457SAndroid Build Coastguard Worker   xnn_delete_operator(prelu_op);
116*4bdc9457SAndroid Build Coastguard Worker   return status;
117*4bdc9457SAndroid Build Coastguard Worker }
118*4bdc9457SAndroid Build Coastguard Worker 
119*4bdc9457SAndroid Build Coastguard Worker 
xnn_create_prelu_nc_f16(size_t channels,size_t input_stride,size_t output_stride,const void * negative_slope,uint32_t flags,xnn_caches_t caches,xnn_operator_t * prelu_op_out)120*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_prelu_nc_f16(
121*4bdc9457SAndroid Build Coastguard Worker     size_t channels,
122*4bdc9457SAndroid Build Coastguard Worker     size_t input_stride,
123*4bdc9457SAndroid Build Coastguard Worker     size_t output_stride,
124*4bdc9457SAndroid Build Coastguard Worker     const void* negative_slope,
125*4bdc9457SAndroid Build Coastguard Worker     uint32_t flags,
126*4bdc9457SAndroid Build Coastguard Worker     xnn_caches_t caches,
127*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t* prelu_op_out)
128*4bdc9457SAndroid Build Coastguard Worker {
129*4bdc9457SAndroid Build Coastguard Worker   xnn_pack_prelu_w_function pack_prelu_w = (xnn_pack_prelu_w_function) xnn_pack_f16_prelu_w;
130*4bdc9457SAndroid Build Coastguard Worker   if (flags & XNN_FLAG_FP32_STATIC_WEIGHTS) {
131*4bdc9457SAndroid Build Coastguard Worker     pack_prelu_w = (xnn_pack_prelu_w_function) xnn_pack_f32_to_f16_prelu_w;
132*4bdc9457SAndroid Build Coastguard Worker   }
133*4bdc9457SAndroid Build Coastguard Worker 
134*4bdc9457SAndroid Build Coastguard Worker   return create_prelu_nc(
135*4bdc9457SAndroid Build Coastguard Worker     channels, input_stride, output_stride,
136*4bdc9457SAndroid Build Coastguard Worker     negative_slope, flags,
137*4bdc9457SAndroid Build Coastguard Worker     1 /* log2(sizeof(uint16_t)) */,
138*4bdc9457SAndroid Build Coastguard Worker     pack_prelu_w,
139*4bdc9457SAndroid Build Coastguard Worker     XNN_INIT_FLAG_F16, xnn_operator_type_prelu_nc_f16,
140*4bdc9457SAndroid Build Coastguard Worker     caches,
141*4bdc9457SAndroid Build Coastguard Worker     prelu_op_out);
142*4bdc9457SAndroid Build Coastguard Worker }
143*4bdc9457SAndroid Build Coastguard Worker 
xnn_create_prelu_nc_f32(size_t channels,size_t input_stride,size_t output_stride,const float * negative_slope,uint32_t flags,xnn_caches_t caches,xnn_operator_t * prelu_op_out)144*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_prelu_nc_f32(
145*4bdc9457SAndroid Build Coastguard Worker     size_t channels,
146*4bdc9457SAndroid Build Coastguard Worker     size_t input_stride,
147*4bdc9457SAndroid Build Coastguard Worker     size_t output_stride,
148*4bdc9457SAndroid Build Coastguard Worker     const float* negative_slope,
149*4bdc9457SAndroid Build Coastguard Worker     uint32_t flags,
150*4bdc9457SAndroid Build Coastguard Worker     xnn_caches_t caches,
151*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t* prelu_op_out)
152*4bdc9457SAndroid Build Coastguard Worker {
153*4bdc9457SAndroid Build Coastguard Worker   return create_prelu_nc(
154*4bdc9457SAndroid Build Coastguard Worker     channels, input_stride, output_stride,
155*4bdc9457SAndroid Build Coastguard Worker     negative_slope, flags,
156*4bdc9457SAndroid Build Coastguard Worker     2 /* log2(sizeof(float)) */,
157*4bdc9457SAndroid Build Coastguard Worker     (xnn_pack_prelu_w_function) xnn_pack_f32_prelu_w,
158*4bdc9457SAndroid Build Coastguard Worker     XNN_INIT_FLAG_F32, xnn_operator_type_prelu_nc_f32,
159*4bdc9457SAndroid Build Coastguard Worker     caches,
160*4bdc9457SAndroid Build Coastguard Worker     prelu_op_out);
161*4bdc9457SAndroid Build Coastguard Worker }
162*4bdc9457SAndroid Build Coastguard Worker 
setup_prelu_nc(xnn_operator_t prelu_op,enum xnn_operator_type expected_operator_type,size_t batch_size,const float * input,float * output,uint32_t datatype_init_flags,uint32_t log2_element_size,const struct prelu_parameters prelu[restrict XNN_MIN_ELEMENTS (1)],size_t num_threads)163*4bdc9457SAndroid Build Coastguard Worker static enum xnn_status setup_prelu_nc(
164*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t prelu_op,
165*4bdc9457SAndroid Build Coastguard Worker     enum xnn_operator_type expected_operator_type,
166*4bdc9457SAndroid Build Coastguard Worker     size_t batch_size,
167*4bdc9457SAndroid Build Coastguard Worker     const float* input,
168*4bdc9457SAndroid Build Coastguard Worker     float* output,
169*4bdc9457SAndroid Build Coastguard Worker     uint32_t datatype_init_flags,
170*4bdc9457SAndroid Build Coastguard Worker     uint32_t log2_element_size,
171*4bdc9457SAndroid Build Coastguard Worker     const struct prelu_parameters prelu[restrict XNN_MIN_ELEMENTS(1)],
172*4bdc9457SAndroid Build Coastguard Worker     size_t num_threads)
173*4bdc9457SAndroid Build Coastguard Worker {
174*4bdc9457SAndroid Build Coastguard Worker   if (prelu_op->type != expected_operator_type) {
175*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error("failed to setup operator: operator type mismatch (expected %s, got %s)",
176*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(expected_operator_type),
177*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(prelu_op->type));
178*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_invalid_parameter;
179*4bdc9457SAndroid Build Coastguard Worker   }
180*4bdc9457SAndroid Build Coastguard Worker   prelu_op->state = xnn_run_state_invalid;
181*4bdc9457SAndroid Build Coastguard Worker 
182*4bdc9457SAndroid Build Coastguard Worker   if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) == 0) {
183*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error("failed to setup %s operator: XNNPACK is not initialized",
184*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(expected_operator_type));
185*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_uninitialized;
186*4bdc9457SAndroid Build Coastguard Worker   }
187*4bdc9457SAndroid Build Coastguard Worker 
188*4bdc9457SAndroid Build Coastguard Worker   if ((xnn_params.init_flags & datatype_init_flags) != datatype_init_flags) {
189*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error("failed to setup %s operator: operations on data type are not supported",
190*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(expected_operator_type));
191*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_unsupported_hardware;
192*4bdc9457SAndroid Build Coastguard Worker   }
193*4bdc9457SAndroid Build Coastguard Worker 
194*4bdc9457SAndroid Build Coastguard Worker   if (batch_size == 0) {
195*4bdc9457SAndroid Build Coastguard Worker     prelu_op->state = xnn_run_state_skip;
196*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_success;
197*4bdc9457SAndroid Build Coastguard Worker   }
198*4bdc9457SAndroid Build Coastguard Worker 
199*4bdc9457SAndroid Build Coastguard Worker   if (prelu_op->weights_cache != NULL && !xnn_weights_cache_is_finalized(prelu_op->weights_cache)) {
200*4bdc9457SAndroid Build Coastguard Worker     xnn_log_error("failed to setup %s operator: weights cache is not finalized",
201*4bdc9457SAndroid Build Coastguard Worker       xnn_operator_type_to_string(expected_operator_type));
202*4bdc9457SAndroid Build Coastguard Worker     return xnn_status_invalid_state;
203*4bdc9457SAndroid Build Coastguard Worker   }
204*4bdc9457SAndroid Build Coastguard Worker 
205*4bdc9457SAndroid Build Coastguard Worker   const size_t channels = prelu_op->channels;
206*4bdc9457SAndroid Build Coastguard Worker   prelu_op->context.prelu = (struct prelu_context) {
207*4bdc9457SAndroid Build Coastguard Worker     .n = channels << log2_element_size,
208*4bdc9457SAndroid Build Coastguard Worker     .x = input,
209*4bdc9457SAndroid Build Coastguard Worker     .x_stride = prelu_op->input_pixel_stride << log2_element_size,
210*4bdc9457SAndroid Build Coastguard Worker     .w = packed_weights(prelu_op),
211*4bdc9457SAndroid Build Coastguard Worker     .y = output,
212*4bdc9457SAndroid Build Coastguard Worker     .y_stride = prelu_op->output_pixel_stride << log2_element_size,
213*4bdc9457SAndroid Build Coastguard Worker     .ukernel = prelu->ukernel,
214*4bdc9457SAndroid Build Coastguard Worker   };
215*4bdc9457SAndroid Build Coastguard Worker 
216*4bdc9457SAndroid Build Coastguard Worker   #if XNN_TEST_MODE
217*4bdc9457SAndroid Build Coastguard Worker     const size_t batch_tile = prelu->row_tile;
218*4bdc9457SAndroid Build Coastguard Worker   #else
219*4bdc9457SAndroid Build Coastguard Worker     size_t batch_tile = batch_size;
220*4bdc9457SAndroid Build Coastguard Worker     if (num_threads > 1) {
221*4bdc9457SAndroid Build Coastguard Worker       const size_t target_tiles_per_thread = 5;
222*4bdc9457SAndroid Build Coastguard Worker       const size_t max_batch_tile = divide_round_up(batch_size, num_threads * target_tiles_per_thread);
223*4bdc9457SAndroid Build Coastguard Worker       if (max_batch_tile < batch_tile) {
224*4bdc9457SAndroid Build Coastguard Worker         const uint32_t row_tile = prelu->row_tile;
225*4bdc9457SAndroid Build Coastguard Worker         batch_tile = min(batch_tile, divide_round_up(batch_tile, max_batch_tile * row_tile) * row_tile);
226*4bdc9457SAndroid Build Coastguard Worker       }
227*4bdc9457SAndroid Build Coastguard Worker     }
228*4bdc9457SAndroid Build Coastguard Worker   #endif
229*4bdc9457SAndroid Build Coastguard Worker   prelu_op->compute.type = xnn_parallelization_type_1d_tile_1d;
230*4bdc9457SAndroid Build Coastguard Worker   prelu_op->compute.task_1d_tile_1d = (pthreadpool_task_1d_tile_1d_t) xnn_compute_prelu;
231*4bdc9457SAndroid Build Coastguard Worker   prelu_op->compute.range[0] = batch_size;
232*4bdc9457SAndroid Build Coastguard Worker   prelu_op->compute.tile[0] = batch_tile;
233*4bdc9457SAndroid Build Coastguard Worker   prelu_op->state = xnn_run_state_ready;
234*4bdc9457SAndroid Build Coastguard Worker 
235*4bdc9457SAndroid Build Coastguard Worker   return xnn_status_success;
236*4bdc9457SAndroid Build Coastguard Worker }
237*4bdc9457SAndroid Build Coastguard Worker 
xnn_setup_prelu_nc_f16(xnn_operator_t prelu_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)238*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_prelu_nc_f16(
239*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t prelu_op,
240*4bdc9457SAndroid Build Coastguard Worker     size_t batch_size,
241*4bdc9457SAndroid Build Coastguard Worker     const void* input,
242*4bdc9457SAndroid Build Coastguard Worker     void* output,
243*4bdc9457SAndroid Build Coastguard Worker     pthreadpool_t threadpool)
244*4bdc9457SAndroid Build Coastguard Worker {
245*4bdc9457SAndroid Build Coastguard Worker   return setup_prelu_nc(
246*4bdc9457SAndroid Build Coastguard Worker     prelu_op, xnn_operator_type_prelu_nc_f16,
247*4bdc9457SAndroid Build Coastguard Worker     batch_size, input, output,
248*4bdc9457SAndroid Build Coastguard Worker     XNN_INIT_FLAG_F16,
249*4bdc9457SAndroid Build Coastguard Worker     1 /* log2(sizeof(uint16_t)) */,
250*4bdc9457SAndroid Build Coastguard Worker     &xnn_params.f16.prelu,
251*4bdc9457SAndroid Build Coastguard Worker     pthreadpool_get_threads_count(threadpool));
252*4bdc9457SAndroid Build Coastguard Worker }
253*4bdc9457SAndroid Build Coastguard Worker 
xnn_setup_prelu_nc_f32(xnn_operator_t prelu_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)254*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_prelu_nc_f32(
255*4bdc9457SAndroid Build Coastguard Worker     xnn_operator_t prelu_op,
256*4bdc9457SAndroid Build Coastguard Worker     size_t batch_size,
257*4bdc9457SAndroid Build Coastguard Worker     const float* input,
258*4bdc9457SAndroid Build Coastguard Worker     float* output,
259*4bdc9457SAndroid Build Coastguard Worker     pthreadpool_t threadpool)
260*4bdc9457SAndroid Build Coastguard Worker {
261*4bdc9457SAndroid Build Coastguard Worker   return setup_prelu_nc(
262*4bdc9457SAndroid Build Coastguard Worker     prelu_op, xnn_operator_type_prelu_nc_f32,
263*4bdc9457SAndroid Build Coastguard Worker     batch_size, input, output,
264*4bdc9457SAndroid Build Coastguard Worker     XNN_INIT_FLAG_F32,
265*4bdc9457SAndroid Build Coastguard Worker     2 /* log2(sizeof(float)) */,
266*4bdc9457SAndroid Build Coastguard Worker     &xnn_params.f32.prelu,
267*4bdc9457SAndroid Build Coastguard Worker     pthreadpool_get_threads_count(threadpool));
268*4bdc9457SAndroid Build Coastguard Worker }
269