| #include "edge-impulse-sdk/classifier/ei_classifier_config.h" |
| #if EI_CLASSIFIER_TFLITE_LOAD_CMSIS_NN_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/NN/Include/arm_nnfunctions.h" |
| #include "edge-impulse-sdk/CMSIS/NN/Include/arm_nnsupportfunctions.h" |
| #include <stdio.h> |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
|
|
| arm_cmsis_nn_status arm_convolve_1x1_s8_fast(const cmsis_nn_context *ctx, |
| const cmsis_nn_conv_params *conv_params, |
| const cmsis_nn_per_channel_quant_params *quant_params, |
| const cmsis_nn_dims *input_dims, |
| const q7_t *input_data, |
| const cmsis_nn_dims *filter_dims, |
| const q7_t *filter_data, |
| const cmsis_nn_dims *bias_dims, |
| const int32_t *bias_data, |
| const cmsis_nn_dims *output_dims, |
| q7_t *output_data) |
| { |
| if (conv_params->padding.w != 0 || conv_params->padding.h != 0 || conv_params->stride.w != 1 || |
| conv_params->stride.h != 1) |
| { |
| return ARM_CMSIS_NN_ARG_ERROR; |
| } |
|
|
| (void)ctx; |
| (void)filter_dims; |
| (void)bias_dims; |
|
|
| #if defined(ARM_MATH_MVEI) |
|
|
| const int32_t col_len = input_dims->w * input_dims->h * input_dims->n; |
| const int32_t output_ch = output_dims->c; |
| const int32_t input_ch = input_dims->c; |
|
|
| for (int i_items = 0; i_items <= (col_len - 4); i_items += 4) |
| { |
| output_data = arm_nn_mat_mul_core_4x_s8(input_ch, |
| input_ch, |
| input_data + i_items * input_ch, |
| filter_data, |
| output_ch, |
| conv_params, |
| quant_params, |
| bias_data, |
| output_data); |
| } |
|
|
| |
| for (int i_items = (col_len & ~0x3); i_items < col_len; i_items++) |
| { |
| arm_nn_mat_mul_core_1x_s8(input_ch, |
| 0, |
| input_data + i_items * input_ch, |
| filter_data, |
| output_ch, |
| conv_params, |
| quant_params, |
| bias_data, |
| output_data); |
| output_data += output_ch; |
| } |
|
|
| #else |
| |
|
|
| const int32_t lhs_rows = input_dims->w * input_dims->h * input_dims->n; |
| const int32_t rhs_rows = output_dims->c; |
| const int32_t rhs_cols = input_dims->c; |
|
|
| arm_nn_mat_mult_nt_t_s8(input_data, |
| filter_data, |
| bias_data, |
| output_data, |
| quant_params->multiplier, |
| quant_params->shift, |
| lhs_rows, |
| rhs_rows, |
| rhs_cols, |
| conv_params->input_offset, |
| conv_params->output_offset, |
| conv_params->activation.min, |
| conv_params->activation.max); |
|
|
| #endif |
|
|
| |
| return ARM_CMSIS_NN_SUCCESS; |
| } |
|
|
| int32_t arm_convolve_1x1_s8_fast_get_buffer_size(const cmsis_nn_dims *input_dims) |
| { |
| (void)input_dims; |
| return 0; |
| } |
|
|
| |
| |
| |
|
|
| #endif |
|
|