CMSIS NN

About

This page give a quick overview of the functions available and key differences between them.

Note: The GitHub documentation does not follow the develop branch but rather the last official release in the master branch. Consequently, the group documentation linked to in the table table might not have the listed API. Please refer to the description in the header file instead.

Legacy vs TFL micro compliant APIs

There are two kinds of APIs available in the CMSIS-NN repository; One that supports a legacy symmetric quantization scheme[1] and one that supports TFL micro's symmetric quantization scheme. One of the main differences is how the quantization is performed. The legacy APIs have a fixed point format with power of 2 scaling. This simplifies the re-quantization to a cycle efficient shift operation. No new development is done on the legacy functions and all of the new development is on the functions that support TFL micro. The table below highlights some of the differences between the two formats for convolution related functions. The TFL micro compliant APIs in most cases have a _s8 suffix and is always specified in the API header file.

OperationLegacy APIsTFL micro compliant APIs
Core loopNo input or filter offsetInput and/or filter offset
Re-quantizationShift and saturate in one instruction. ~ 5 cyclesGreater than 200 cycles for one output element
QuantizationPer layer quantizationPer-channel quantization
Output offsetNoPer-layer output offset
Fused ActivationNoYes

TFL micro compliant APIs

GroupAPIBase OperatorInput ConstraintsAdditional memory required for
optimizations (bytes)
DSP OptimizedMVE OptimizedOther comments
Conv
arm_convolve_wrapper_s8()CONVdilation = 1n.a.YesYesThe additional memory required depends on the optimal convolution function called
arm_convolve_s8()CONVdilation = 14 * ker_x * ker_y * input_chYesYes
arm_convolve_1x1_s8_fast()CONVdilation = 1
ker_x = 1, ker_y = 1
pad = 0
stride = 1
input_ch % 4 = 0
0YesYes
arm_convolve_1_n_s8()CONVdilation = 1
output_y % 4 = 0
NoYes
arm_depthwise_conv_3x3_s8()DEPTHWISE_CONVdilation = 1
depth_multiplier = 1
pad_x <= 1
NoNoNoPreferred function for 3x3 kernel size for DSP extension. For MVE, use arm_depthwise_conv_s8_opt()
arm_depthwise_conv_s8()DEPTHWISE_CONVdilation = 1NoNoNo
arm_depthwise_conv_s8_opt()DEPTHWISE_CONVdilation = 1
depth_multiplier = 1
DSP: 2 * ker_x * ker_y * input_ch
MVE: 2 * DSP + 4
YesYesBest case is when channels are multiple of 4 or
at the least >= 4
Fully Connected
arm_fully_connected_s8()FULLY CONNECTED &
MAT MUL
None0YesYes
Pooling
arm_avgpool_s8()AVERAGE POOLNoneinput_ch * 2
(DSP only)
YesYesBest case case is when channels are multiple of 4 or
at the least >= 4
arm_maxpool_s8()MAX POOLNoneNoneYesYes
Softmax
arm_softmax_q7()SOFTMAXNoneNoneYesNoNot bit exact to TFLu but can be up to 70x faster
arm_softmax_s8()SOFTMAXNoneNoneNoYesBit exact to TFLu
arm_softmax_u8()SOFTMAXNoneNoneNoNoBit exact to TFLu
SVDF
arm_svdf_s8()SVDFNoneNoneYesNoBit exact to TFLu
Misc
arm_reshape_s8()SOFTMAXNoneNoneNoNo
arm_elementwise_add_s8()ELEMENTWISE ADDNoneNoneYesYesReshape is not done in this function
Only minor improvements are expected
arm_elementwise_mul_s8()ELEMENTWISE MULNoneNoneYesYesReshape is not done in this function
Only minor improvements are expected
arm_relu_q7()RELUNoneNoneYesNo
arm_relu6_s8()RELUNoneNoneYesNo
Concat
arm_concatenation_s8_w()CONCATNoneNoneNoNo
arm_concatenation_s8_x()CONCATNoneNoneNoNo
arm_concatenation_s8_y()CONCATNoneNoneNoNo
arm_concatenation_s8_z()CONCATNoneNoneNoNo

Reference

[1] Legacy CMSIS-NN and how to use it https://developer.arm.com/solutions/machine-learning-on-arm/developer-material/how-to-guides/converting-a-neural-network-for-arm-cortex-m-with-cmsis-nn/single-page