CMSIS-NN中#if defined(ARM_MATH_DSP)&&!defined(ARM_MATH_MVEI)判断的原因
CMSIS-NN中ARM_MATH_DSP与ARM_MATH_MVEI分支判断的原因解析
先明确两个宏的核心含义:
ARM_MATH_DSP:对应支持传统DSP指令集的Cortex-M内核(比如M4、M7、M33),开启后会启用基于DSP/NEON指令的向量化实现。ARM_MATH_MVEI:对应支持MVE(M-Profile向量扩展)的Cortex-M内核(比如M55、M85),MVE是比传统DSP指令更强大的向量扩展,指令集更灵活、批量处理效率更高。
为什么要加!defined(ARM_MATH_MVEI)的判断?
- 性能优先级:CMSIS-NN为MVEI内核单独提供了更高效的MVE优化版本(比如同功能的
arm_relu_q15会有对应的MVE实现文件)。当内核同时支持DSP和MVEI时,MVE版本的性能远优于传统DSP版本,因此需要屏蔽DSP向量化代码,确保编译器选用更优的MVE实现。 - 避免编译冲突:如果同时开启两个宏,会存在两套功能重复的向量化代码,可能导致编译时符号重复定义的错误,或者链接器错误选择旧版本代码。
这个判断是不是冗余操作?
完全不是冗余。部分Cortex-M内核(比如M55)同时支持DSP和MVEI指令集,此时必须通过!defined(ARM_MATH_MVEI)来区分场景:
- 当MVEI未定义时:使用DSP向量化实现;
- 当MVEI定义时:跳过DSP版本,转而使用专门的MVE优化代码。
如果去掉这个判断,在MVEI内核上会编译出性能较差的DSP版本,甚至引发编译冲突。
内容的提问来源于stack exchange,提问作者王舒心
相关产品推荐
相关产品推荐

