Function arm_convolve_wrapper_s8¶
Defined in File arm_nnfunctions.h
Function Documentation¶
-
arm_cmsis_nn_status arm_convolve_wrapper_s8(const cmsis_nn_context *ctx, const cmsis_nn_context *weight_sum_ctx, const cmsis_nn_conv_params *conv_params, const cmsis_nn_per_channel_quant_params *quant_params, const cmsis_nn_dims *input_dims, const int8_t *input_data, const cmsis_nn_dims *filter_dims, const int8_t *filter_data, const cmsis_nn_dims *bias_dims, const int32_t *bias_data, const cmsis_nn_dims *output_dims, int8_t *output_data)¶
s8 convolution layer wrapper function with the main purpose to call the optimal kernel available in cmsis-nn to perform the convolution.
- Parameters:
ctx – [inout] Function context that contains the additional buffer if required by the function. arm_convolve_wrapper_s8_get_buffer_size will return the buffer_size if required. The caller is expected to clear the buffer, if applicable, for security reasons.
weight_sum_ctx – [in] Per-output-channel weight sums, supplied by the caller. The selected kernel only reads this buffer and never writes it, so it is filled once and may then be reused for as long as filter_data, bias_data and conv_params->input_offset are unchanged - see arm_convolve_weight_sum() for the layout and the full reuse rules. Fill it with arm_convolve_weight_sum(), passing conv_params->input_offset as lhs_offset and the same bias_data given here, so that entry j holds input_offset * sum(weights of output channel j) + bias_data[j]. That helper returns ARM_CMSIS_NN_NO_IMPL_ERROR on non-MVE builds, which is not a failure. Pass a valid context on every build: this wrapper dispatches to arm_convolve_s8(), arm_convolve_1x1_s8(), arm_convolve_1x1_s8_fast(), arm_convolve_1_x_n_s8() and arm_convolve_1x1_out_s8(), and some of those read weight_sum_ctx->buf on every build rather than only under MVE. Currently the buffer contents are consumed only on builds with the MVE extension (ARM_MATH_MVEI); an unfilled buffer there yields wrong output while still returning ARM_CMSIS_NN_SUCCESS. A NULL buf is not diagnosed on every route, so do not rely on getting an error back. None of this is a guarantee about future versions. Sized by arm_convolve_s8_get_weights_sum_size(): output_dims->c * sizeof(int32_t) where the sums are used, 0 otherwise. The caller is expected to clear the buffer, if applicable, for security reasons.
conv_params – [in] Convolution parameters (e.g. strides, dilations, pads,…). Range of conv_params->input_offset : [-127, 128] Range of conv_params->output_offset : [-128, 127]
quant_params – [in] Per-channel quantization info. It contains the multiplier and shift values to be applied to each output channel
input_dims – [in] Input (activation) tensor dimensions. Format: [N, H, W, C_IN]
input_data – [in] Input (activation) data pointer. Data type: int8
filter_dims – [in] Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the spatial filter dimensions
filter_data – [in] Filter data pointer. Data type: int8
bias_dims – [in] Bias tensor dimensions. Format: [C_OUT]
bias_data – [in] Bias data pointer. Data type: int32
output_dims – [in] Output tensor dimensions. Format: [N, H, W, C_OUT]
output_data – [out] Output data pointer. Data type: int8
- Returns:
The function returns either
ARM_CMSIS_NN_ARG_ERRORif argument constraints fail. or,ARM_CMSIS_NN_SUCCESSon successful completion.